2023. 8. 17. 15:38ㆍUnity
오브젝트 통과
하나의 게임 오브젝트가 다른 오브젝트와 충돌하면 OnTriggerEnter를 호출하게 되며 둘 다 Collider가 있어야 한다. 플레이어 오브젝트에 Rigid Body가 있어야 하며 Is Kinematic 체크가 활성화되어있어야 한다. 두 오브젝트 모두 Is Trigger 체크박스를 활성화하면 충돌이 발생하지 않으므로 하나에만 체크해야 한다.
(**Is Kinematic 체크 활성화는 물리 계산을 하지 않는다는 뜻이다. Kinematic 뜻 자체가 운동학이라는 뜻이라 조금 헷갈린다.)
public class MoveScript : MonoBehaviour
{
public float speed = 2;
private void OnTriggerEnter(Collider other)
{
print("OnTriggerEnter");
}
private void OnTriggerStay(Collider other)
{
print("OnTriggerStay");
}
private void OnTriggerExit(Collider other)
{
print("OnTriggerExit");
}
void Update()
{
Vector3 dir = Vector3.zero;
if (Input.GetKey(KeyCode.RightArrow))
{
dir += Vector3.right;
}
if (Input.GetKey(KeyCode.LeftArrow))
{
dir += Vector3.left;
}
if (Input.GetKey(KeyCode.UpArrow))
{
dir += Vector3.forward;
}
if (Input.GetKey(KeyCode.DownArrow))
{
dir += Vector3.back;
}
transform.Translate(dir.normalized * Time.deltaTime * speed);
}
}
네 방향으로 움직이며 Is Trigger, Is Kinematic이 켜져 있는 플레이어 오브젝트가 다른 오브젝트를 통과할 때 위와 같은 코드로 통과했는지를 알 수 있다.
오브젝트 충돌
오브젝트가 충돌하여 튕겨져 나가게 하기 위해서는 큰 Plane을 Static으로 깔아준 후 플레이어 오브젝트에 [Is Trigger 비활성화, Use Gravity 활성화, Is Kinematic 비활성화, Mass 수치 조정]을 하고 상대 오브젝트에는 [Is Trigger 비활성화, Use Gravity 활성화, Is Kinematic 비활성화, Mass 수치 조정]을 하면 된다.
빨간색 플레이어 오브젝트가 부딪히면서 이동 방향이 바뀌어 바닥에 계속 충돌하는 오류가 생겼는데, 플레이어가 튕겨져나가게 하지 않기 위해서는 Is Kinematic을 활성화하면 된다.
물체의 제거(Destroy)
private void OnTriggerEnter(Collider other)
{
Destroy(other.gameObject, 1.0f);
print("OnTriggerEnter");
}
Destroy를 이용해 물체에 닿을 때 해당 오브젝트를 삭제할 수 있다. Destroy(other);만 하면 해당 콜라이더만 지우는 것이므로 Destroy(other.gameObject);로 해당 게임 오브젝트를 삭제하며 1.0f를 통해 1초 뒤에 지우게 할 수 있다.
'Unity' 카테고리의 다른 글
[C#] Static 변수 / Static 함수 / Static 변수의 자기참조 (0) | 2023.08.24 |
---|---|
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(1) 플레이어 설정 (0) | 2023.08.23 |
[Unity] GameObject.Find (0) | 2023.08.16 |
[Unity] 오브젝트의 위치와 이동 (transform.position / transform.Translate / normalized) (1) | 2023.08.14 |
[Unity] 변수를 보호하는 방법(캡슐화) - 접근 제한자 / 프로퍼티 (0) | 2023.08.14 |