Today I Learned :
Unity 개발
Instantiate : 새로운 오브젝트 생성한다.
- 프리팹을 기반으로 한 새로운 인스턴스를 생성하며, 게임 오브젝트의 동적 생성 및 관리에 도움을 준다.
- 오브젝트를 모아놓기위해 쓸데없는 부모를 생성하는 것은 성능상 좋지 않으므로 게임플레이 이후에 생성되는 오브젝트들은 루트경로에 그냥 놔두는것이 낫다.
- 빈번한 인스턴스 생성 및 삭제가 필요한 경우 오브젝트풀을 생성하여 객체를 관리한다.
public Object Instantiate(Object original, Vector3 position, Quaternion rotation);
- original: 인스턴스를 생성할 프리팹이나 다른 Object를 지정합니다.
- position: 새로운 인스턴스의 초기 위치를 나타내는 Vector3 값입니다.
- rotation: 새로운 인스턴스의 초기 회전을 나타내는 Quaternion 값입니다.
OnTriggerEnter2D : 객체 충돌 감지
private void OnTriggerEnter2D(Collider2D collision)
{
if (levelCollisionLayer.value == (levelCollisionLayer.value | (1 << collision.gameObject.layer)))
{
// 여기에 코드를 추가
}
}
- OnCollisionEnter2D와 OnTriggerEnter2D 차이
- Trigger :
- 트리거는 물리적인 충돌이 일어나도 물리연산을 하지 않는다.
- OnTriggerEnter, OnTriggerStay, OnTriggerExit
- 물체가 통과 하면서 이벤트가 발생
- Collision :
- 물리적인 충돌이 일어나면 물리 엔진이 계산한 결과에 따라 물체가 튕겨나가거나 반응
- OnCollisionEnter, OnCollisionStay, OnCollisionExit
- 물리적인 상호작용이 필요한 경우에 사용
- Trigger :
- 오브젝트 충돌 판정을 위한 레이어 사용 (1-10, 41:50)
- levelCollisionLayer : LayerMask 타입으로 bit연산으로 구성
LayerMask는 씬 내의 레이어(Layer)를 나타내는 데 사용되며,
이를 통해 특정 레이어와의 상호작용을 필터링하거나 제어한다. - LayerMask는 비트를 사용하여 각 레이어를 나타내며, 이진 비트의 각 위치는 특정 레이어를 나타낸다.
- collision.gameObject.layer : 충돌한 게임 오브젝트에서 가장 우선순위가 높은(낮은비트) 레이어를 반환한다.
- LayerMask는 여러개의 레이어를 소유할 수 있다.
int layer1 = 1 << LayerMask.NameToLayer("Layer1"); // 0001
int layer2 = 1 << LayerMask.NameToLayer("Layer2"); // 0010
int layer3 = 1 << LayerMask.NameToLayer("Layer3"); // 0100
int layer4 = 1 << LayerMask.NameToLayer("Layer4"); // 1000
int layerMaskValue = layer2 | layer4; // 0010 | 1000 = 1010
LayerMask layerMask = layerMaskValue; // LayerMask로 변환
- 위 예시를 통해 (1 << collision.gameObject.layer) 는 충돌한 오브젝트의 레이어를 나타내며, 해당 레이어의 비트를 1로 설정하는 것으로 이해할 수 있다.
if (levelCollisionLayer.value == (1 << collision.gameObject.layer))
{
// 여기에 코드를 추가
}
- 위 코드와의 차이
- 원래 코드: 현재 levelCollisionLayer가 가진 비트 중에 collision.gameObject.layer에 해당하는 비트가 하나라도 존재하면 조건이 참. 이는 collision.gameObject.layer에 해당하는 레이어 이외의 다른 레이어가 추가로 활성화되어도 조건이 참이 될 수 있다는 것을 의미
- 수정된 코드: 정확히 collision.gameObject.layer에 해당하는 비트만 활성화되어야 조건이 참. 다른 레이어의 비트가 활성화되어 있으면 조건이 거짓
'TIL' 카테고리의 다른 글
20240122 TIL (0) | 2024.01.23 |
---|---|
20240119 TIL (0) | 2024.01.19 |
20240117 TIL (0) | 2024.01.17 |
20240116 TIL (0) | 2024.01.16 |
20240115 TIL (1) | 2024.01.15 |