Unity 내일배움캠프 TIL 0917 | 레이어 비트 연산 | 오브젝트 풀 | StringToHash

cheeseonrose·2023년 9월 17일
0

Unity 내일배움캠프

목록 보기
36/89
post-thumbnail

10강 투사체 구현하기

레이어 비트 연산

  • 게임 오브젝트의 레이어를 빠르게 검사하고 조작
  • AND, OR, XOR, NOT 등의 연산으로 레이어 마스크를 조작
  • 물리 충돌, 레이캐스팅, 카메라 렌더링 등을 제어하는 데 사용
  • 각 게임 오브젝트는 고유한 레이어에 배치됨 -> 레이어는 비트 필드로 표현
levelCollisionLayer.value == (levelCollisionLayer.value | (1 << collision.gameObject.layer))
  • 1 << collision.gameObject.layer : collision.gameObject.layer에 해당하는 비트를 활성화
    • << 연산으로 1을 layer 번호만큼 이동
  • levelCollisionLayer.value | (1 << collision.gameObject.layer) : 비트가 이미 설정되어 있는지 확인

Trigger 충돌과 Collision 충돌

  • Trigger 충돌은 충돌체를 받아옴
  • Collision 충돌은 충돌 자체도 받아옴



11강 오브젝트 풀 구현

오브젝트 풀링

  • 게임의 성능을 개선하기 위해 사용
  • 객체를 미리 생성해 두고 필요할 때 가져다 사용
    사용이 끝나면 다시 반납
  • 생성(Instantiate)과 소멸(Destroy)이라는 비용이 큰 작업을 최소화
  • 빈번하게 생성되고 파괴되는 객체(총알, 입자 등)에 대해 중요
    객체들을 풀에 저장하고 재사용함으로써 메모리 할당과 가비지 컬렉션에 따른 성능 저하를 방지
  • 적절히 사용하면 큰 성능 개선을 가져올 수 있음
    but 불필요한 메모리 사용 증가 -> 오브젝트 풀의 크기를 적절히 조절하여 신중하게 사용

코드

public class ObjectPool : MonoBehaviour
{
    [System.Serializable]
    public struct Pool
    {
        public string tag;
        public GameObject prefab;
        public int size;
    }

    public List<Pool> pools;
    public Dictionary<string, Queue<GameObject>> poolDictionary;

    private void Awake()
    {
        poolDictionary = new Dictionary<string, Queue<GameObject>>();
        foreach (var pool in pools)
        {
            Queue<GameObject> objectPool = new Queue<GameObject>();
            for (int i = 0; i < pool.size; i++)
            {
                GameObject obj = Instantiate(pool.prefab);
                obj.SetActive(false);
                objectPool.Enqueue(obj);
            }
            poolDictionary.Add(pool.tag, objectPool);
        }
    }

    public GameObject SpawnFromPool(string tag)
    {
        if (!poolDictionary.ContainsKey(tag)) return null;

        GameObject obj = poolDictionary[tag].Dequeue();
        poolDictionary[tag].Enqueue(obj);

        return obj;
    }
}



12강 애니메이션 컨트롤

Animation

  • 게임 오브젝트에 애니메이션을 추가하는 데 사용
  • 간단한 애니메이션에 적합하며, 스크립트를 통해 제어 가능

Animator

  • 애니메이션의 상태를 제어하고 전환을 관리
  • Animation Controller를 사용하여 애니메이션의 복잡한 상태 기계를 구현
  • Mecanim 애니메이션 시스템의 일부로, 애니메이션 블렌딩, 트리, 상태 머신 등의 기능 제공

StringToHash

  • 문자열을 고유한 정수 값인 해시 값으로 변환 -> 성능을 개선하고 코드의 가독성 유지
  • 문자열 비교는 상대적으로 연산 비용이 큰 작업
    -> StringToHash를 통해 연산 비용을 크게 줄일 수 있음
  • 해시 값은 고유하므로 다른 문자열이 동일한 해시 값을 갖는 확률이 매우 낮음
    -> 동일한 문자열은 항상 동일한 해시 값을 반환하지만, 동일한 해시 값이 항상 동일한 문자열을 반환하지는 않음
    -> 해시 값을 다시 원래의 문자열로 변환하는 것은 불가능
  • 애니메이션 파라미터를 지정할 때 문자열 대신 해시 값을 사용해서 CPU 시간을 절약하고 애니메이션 성능을 향상시킬 수 있음

애니메이션 만들기

  • 애니메이션을 넣을 오브젝트 클릭하고 Ctrl + 6 누르면 애니메이션 창이 뜸
  • Attack Layer의 경우 Player의 Idle, Run, Hit에 더해서 일어나는 애니메이션이므로 Blending을 Additive로 설정



주말 공부는 여기까지 ~.~
강의 양이 너무 많다!!! ;ㅁ;

끗 ~

0개의 댓글