유니티에서 게임 오브젝트 간의 상호작용을 관리하기 위해 각 오브젝트를 특정 레이어로 설정할 수 있다. 레이어는 비트 필드로 표현되며, 각 비트가 다른 레이어를 나타낸다. 비트 연산자를 사용해 레이어의 비트 필드를 조작한다.
비트 시프트 연산 << : 1 << n이면 1을 왼쪽으로 n번 시프트. n번째 레이어를 나타내는 비트 마스크를 생성하는 데 사용되어 특정 레이어에 대한 연산을 쉽게 할 수 있다.
게임에서 생성 및 파괴가 자주 반복되는 객체가 있을 때, 메모리 할당과 가비지 컬렉션에 따른 성능 저하가 생길 수 있다. 이런 경우에 객체를 미리 생성해두고 필요할 때 꺼내 쓰고 다시 돌려놓는 방식인 오브젝트 풀링을 사용한다. 이때, 오브젝트 풀의 크기를 필요한만큼 적절히 조절해야 한다.
public class Pool
{
public string tag; // 생성할 프리팹의 이름이나 구분하기 위한 태그
public GameObject prefab; // 생성할 프리팹
public int size; // 생성할 개수(크기)
}
public class ObjectPool : Monobehaviour
{
public List<Pool> Pools; // 인스펙터 창에서 Pool 설정
public Dictionary<string, Queue<GameObject>> PoolDictionary;
// Awake 시 objectPool 생성
private void Awake()
{
PoolDictionary = new Dictionary<string, Queue<GameObject>>();
foreach (var pool in Pools)
{
// object를 언제든 꺼내쓰고 다시 넣을 수 있게 담아둘 Queue 구조의 objectPool
Queue<GameObject> objectPool = new Queue<GameObject>();
// pool의 size만큼 Instantiate로 생성해서 objectPool에 저장
for (int i = 0; i < pool.size; i++)
{
GameObject obj = Instantiate(pool.prefab);
objectPool.Enqueue(obj);
}
PoolDictionary.Add(Pool.tag, objectPool);
}
}
// objectPool에서 object 꺼내쓰고 다시 넣기
public GameObject SpawnObjectFromPool(string tag)
{
GameObject obj = PoolDictionary[tag].Dequeue();
PoolDictionary[tag].Enqueue(obj);
return obj;
}
}
유니티 애니메이션 시스템에서 자주 사용되는 기능으로 문자열을 해시 값(고유한 정수 값)으로 변환한다.
소프트웨어 디자인 패턴 중 하나로 특정 클래스의 인스턴스가 하나만 존재하도록 보장, 전역 접근을 제공하는 패턴