[내배캠] 유니티 입문#2

Sungchan Ahn(안성찬)·2024년 10월 8일

내일배움캠프

목록 보기
39/104

1. 스크립터블 오브젝트 Scriptable Object

  • 유니티에서 데이터를 저장하고 관리하는 데이터 컨테이너
  • 게임에서 재사용 가능한 데이터나 설정을 저장하는 데 사용
  • 코드와 데이터를 분리
  • 하나의 Scriptable Object를 여러 게임 오브젝트에서 참조, 재사용 가능
  • 인스펙터 창에서 직접 수정하고 관리할 수 있음

2. 레이어 마스크 Layer Mask

유니티에서 게임 오브젝트 간의 상호작용을 관리하기 위해 각 오브젝트를 특정 레이어로 설정할 수 있다. 레이어는 비트 필드로 표현되며, 각 비트가 다른 레이어를 나타낸다. 비트 연산자를 사용해 레이어의 비트 필드를 조작한다.

  • AND (&): 두 비트 필드에서 같은 자리의 비트를 비교, 두 필드에서 공통으로 비트가 설정되어 있을 때만 결과 비트를 설정. 특정 레이어의 존재 여부를 알고 싶을 때 그 레이어의 비트 필드와 AND 연산을 하면 된다.
  • OR ( | ): 둘 중 하나라도 비트가 설정되어 있으면 결과 비트를 설정. 새로운 레이어를 추가할 때 사용
  • XOR (^): 해당 비트가 서로 다를 때만 결과 비트를 설정. 두 레이어의 차이를 찾을 때 사용
  • NOT (~): 비트 반전. 특정 레이어를 제외할 때 사용

비트 시프트 연산 << : 1 << n이면 1을 왼쪽으로 n번 시프트. n번째 레이어를 나타내는 비트 마스크를 생성하는 데 사용되어 특정 레이어에 대한 연산을 쉽게 할 수 있다.

  • 충돌 검사: 비트 마스킹을 사용하여 특정 레이어인 게임 오브젝트에 대해 충돌 검사를 할 수 있다.
  • 레이캐스팅 제어: 레이캐스트가 특정 레이어인 게임 오브젝트에만 반응하도록 설정 할 수 있다.
  • 카메라 렌더링 설정: 카메라가 특정 레이어인 오브젝트만 렌더링하도록 설정할 수 있다.

3. Physics(2D).Raycast

  • Raycasting은 Collider와 교차하는지 감지하는 기술
  • 유니티의 Physics.Raycast/Physics2D.Raycast는 시작점, 방향, 최대 거리, 레이어 마스크(선택)를 매개변수로 받아 사용
  • Raycast는 hit 정보(충돌한 오브젝트, 충돌 지점, 충돌 지점의 정규화된 벡터 등)를 반환

4. 오브젝트 풀링

게임에서 생성 및 파괴가 자주 반복되는 객체가 있을 때, 메모리 할당과 가비지 컬렉션에 따른 성능 저하가 생길 수 있다. 이런 경우에 객체를 미리 생성해두고 필요할 때 꺼내 쓰고 다시 돌려놓는 방식인 오브젝트 풀링을 사용한다. 이때, 오브젝트 풀의 크기를 필요한만큼 적절히 조절해야 한다.

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;
    }
}

5. StringToHash

유니티 애니메이션 시스템에서 자주 사용되는 기능으로 문자열을 해시 값(고유한 정수 값)으로 변환한다.

  • StringToHash("애니메이션 parameter")
  • 문자열 비교는 연산 비용이 상대적으로 큰 작업인데 StringToHash을 통해 해시 값으로 변환하여 연산 비용을 줄일 수 있음
  • 해시 값은 고유한 정수 값이기 때문에 동일한 해시 값을 가질 확률이 매우 낮음
  • 동일한 문자열은 항상 같은 해시 값을 반환하지만 동일한 해시 값이 항상 같은 문자열을 반환하지는 않음
  • 해시 값을 다시 원래의 문자열로 변환 불가능

6. 싱글턴 패턴

소프트웨어 디자인 패턴 중 하나로 특정 클래스의 인스턴스가 하나만 존재하도록 보장, 전역 접근을 제공하는 패턴

  • 전역 변수를 사용하지 않고도 객체 간 데이터 공유, 전역적인 상태 관리, 특정 기능을 애플리케이션 전체에서 사용할 수 있게 해줌
  • 잘못 사용하면 코드 간 결합도를 높이고, 테스트와 유지 보수를 어렵게 할 수 있음
  • 싱글턴 객체는 프로그램의 수명 주기 동안 계속 존재하기 때문에 메모리 관리에 신경써야 함.
profile
게임 개발 기록

0개의 댓글