Game Development, 게임개발/개발

유니티에서 Static이란 [Unity]

게임이 더 좋아 2021. 3. 23. 07:08
반응형
728x170

 

static.. Dynamic의 반대로 알고 있다.

정적을 의미한다.

즉, 런타임 이전에 훨씬 이전에 수행되어 만들어진다는 뜻으로 알고 있다.

사실 선언했을 때 만들어진다.

** 메모리에서의 Data에 저장된다.

그럼

유니티에서 Static의 의미를 알아보자

 


 

static은 Data 영역에 저장되기 때문에 변수를 수정하거나, 읽을 때, 클래스 객체를 만들 필요가 없다.

아무리 객체를 만들더라도 static은 유일하게 존재한다.

 

 

using UnityEngine;
using System.Collections;

public class Enemy
{
    //Static variables 은 모든 클래스의 인스턴스와 공유된다.
    public static int enemyCount = 0;

    public Enemy()
    {
        //이렇게 함으로써 이 클래스로 만들어진 객체가 얼마나 많은지 알 수 있다.
        // 각 객체에 enemyCount 를 가지고 있겠지만
        // 각 객체는 같은 값을 가리킬 수 밖에.. stack영역의 enemyCount를 가리킨다.
        enemyCount++;
    }
}

 

만약 아래와 같은 코드라면??

 

using UnityEngine;
using System.Collections;

public class Game
{
    void Start () 
    {
        Enemy enemy1 = new Enemy(); // 객체 생성
        Enemy enemy2 = new Enemy(); // 2
        Enemy enemy3 = new Enemy(); // 3

        // 또한 언제든지 static variable에 접근이 가능하다.
        // "클래스 이름"과 "." 만 있으면 가능하다
        int x = Enemy.enemyCount;
    }
}

 

위에선 3이 나오겠지??

 

즉, 주로 사용하는 방법은 게임 전체에 수를 제한하거나, 알고 싶을 때 주로 많이 쓴다.

또한 쓰기도 편하다.

"클래스 이름" 과 "." 만 있으면 가능하니까 좋다.

 


 

 

이번엔 static method는 어떨까?

 

using UnityEngine;
using System.Collections;

public static class Utilities 
{
    //A static method 또한 객체 생성 없이 바로 사용된다.
    //하지만  static methods static이 아닌 variable에는 접근할 수 없다.
    public static int Add(int num1, int num2)
    {
        return num1 + num2;
    }
}

 

객체 없이 이렇게 사용가능하다.

다만 static이 아닌 변수에 접근할 수 없는 이유는.

static은 클래스의 변수로 사용되지만

non-static은 각 instance의 변수로 사용되기 때문이다.

 

using UnityEngine;
using System.Collections;

public class UtilitiesExample : MonoBehaviour 
{
    void Start()
    {
        //static variable과 마찬가지로 클래스 이름과 .만으로 가능하다.
        int x = Utilities.Add (5, 6);
    }
}

 

 

마지막으로 Class도 static으로 선언될 수 있다.

다른 static 변수나 메서드와 마찬가지로 객체를 가질 수 없다. 아니 안 쓴다. 그러려고 만들었으니까.

 

 


 

 

주로 개수 파악에 쓰인다면

각 클래스의 Awake(), Start()에 

++연산이 쓰여서 셀 수 있게 하겠고

 

오브젝트가 파괴되는 OnDestroy()에 

--연산이 쓰이면 되지 않을까 생각한다.

 

더 나아가 모두가 하나를 가리킨다는 것이 쓰이려면

그 하나가 정말 많은 오브젝트에서 참조할 때!! 쓰는 것이 좋겠다.

Player의 위치를 받아서 총을 쏘는데..

각 Enemy가 100개라고 할 때 

각 Enemy의 스크립트 Awake()에서 player 오브젝트의 transform의 position을 얻고 뭐 어쩌고 저쩌고...하면

100번의 연산을 해야한다.

하지만 정적으로 선언이 되어 있다면 1번으로 되지 않을까..?

아니 굳이 Awake()의 한 문장을 아껴서 100문장을 아낄 수 있는 것이다.

 

아니면 정말 게임의 가장 큰 것 같은 것을 static으로 선언하면 좋을 것 같다.

Life 라던지, 점수라던지, 뭐 그런 것들

근데 또 알고보면 게임의 가장 큰 틀이 참조도 많이 된다.

 

 

역으로 함부로 static으로 선언하는 것은 좋지 않다.

정적 변수의 값을 초기화해야하기 때문인데 isClear를 전역변수로 설정한다치자.

그럼 스테이지 다음 판에도 isClear = True 값을 가져서 계속 클리어될 수 있다.

사용하려면 초기화시키는 코드도 넣어줘야 한다.

 

그리고

static 많으면 쓸모도 없는 메모리 낭비가 될 수 있는 것이다.

즉, 웬만하면 지양하고 정말 이거 참조가 많이 되어서 쓰면 좋겠는데? 만 쓰자.

 

 


참고링크

 

learn.unity.com/tutorial/statics-l?uv=2019.3&projectId=5c88f2c1edbc2a001f873ea5#5c8920e7edbc2a0d28f4833c

728x90
반응형
그리드형