KoreanFoodie's Study

7. 프리팹, 충돌 처리(OnTrigger, OnCollision) 등 : 유니티 튜토리얼 본문

Game Dev/Unity : Tutorial

7. 프리팹, 충돌 처리(OnTrigger, OnCollision) 등 : 유니티 튜토리얼

GoldGiver 2021. 9. 4. 16:40

이번 글의 기능을 이용해 만들어본 것들

프리팹

게임 오브텍트는 프리팹으로 만들어 재활용할 수 있다. 마치, 칼을 찍어내는 주물이라고 생각하면 된다!

사용법은 간단하다. Hierarchy에 있는 오브젝트를 프로젝트 창에 드래그&드랍 해주기만 하면 된다!

 

Use Gravity

리지드 바디 컴포넌트의 Use Gravity 필드를 해제하면 중력의 영향을 받지 않는다.

 

transform

변수 transform은 스크립트에서 자신의 트랜스폼 컴포넌트로 바로 접근하는 지름길이다!

 

Destroy( )

    void Start()
    {

        // 이동에 사용할 리지드바디 컴포넌트 할당
        bulletRigidbody = GetComponent<Rigidbody>();

        // 리지드바디의 속도 = 앞쪽 방향 * 이동 속력
        bulletRigidbody.velocity = transform.forward * speed;

        // 3초 후에 파괴
        Destroy(gameObject, 3f);

    }

Destroy( ) 메서드는 주어진 오브젝트를 파괴하며, 지연시간을 입력할 수 있다.

 

충돌 처리

충돌 처리는 종류에 따라 OnTriggerEnter 혹은 OnColliosionEnter 메시지를 받는다. 충돌했을 때, 충돌한 오브젝트의 정보도 함께 받게 되는데, 이때 충돌 메시지를 발생시키는 것은 리지드 바디 컴포넌트이다. 따라서 충돌 이벤트 메서드를 사용하려면 충돌 중인 게임 오브젝트 중 최소 하나의 게임 오브젝트는 리지드바디 컴포넌트를 가지고 있어야 한다.

 

OnCollision 계열 : 일반 충돌

일반적인 콜라이더를 가진 두 게임 오브젝트가 충돌할 때 자동으로 실행된다. 충돌한 두 콜라이더는 서로 통과하지 않고 밀어낸다.

OnCollisionEnter(Collision collision) : 충돌한 순간
OnCollisionStay(Collision collision) : 충돌하는 동안
OnCollisionExit(Collision collision) : 충돌했다가 분리되는 순간

 

OnTrigger 계열 : 트리거 충돌

OnTriggerEnter(Collider other) : 충돌한 순간
OnTriggerStay(Collider other) : 충돌하는 동안
OnTriggerExit(Collider other) : 충돌했다가 분리되는 순간

    void OnTriggerEnter(Collider other) 
    {
        // 충돌한 상대방 게임 오브젝트가 Player 태그를 가진 경우
        if (other.tag == "Player")  
        {
            // 상대방 게임 오브젝트에서 PlayerController 컴포넌트 가져오기
            PlayerController playerController = other.GetComponent<PlayerController>();
            
            // 상대방으로부터 PlayerController 컴포넌트 가져오는 데 성공했다면
            if (playerController != null)
            {
                playerController.Die();
            }

        }    
    }

충돌한 두 게임 오브젝트의 콜라이더 중 최소 하나가 트리거 콜라이더라면 자동으로 실행된다. 이 경우 두 게임 오브젝트는 충돌시 서로 통과한다. (자신이 트리거 콜라이더가 아니어도 실행될 수 있음)

OnTrigger 계열의 메서드가 실행될 때는 상대방 게임 오브젝트의 콜라이더 컴포넌트가 Collider 타입으로 들어온다. 여기서 Collision이 아닌 Collider 타입을 입력받는 이유는 트리거 충돌에는 상세한 충돌 정보가 필요 없기 때문이다!

트리거 충돌은 새로운 적이나 컷신 재생을 위한 포인트로 사용할 수 있다.

 

NOTE :

  • 충돌한 상대방 게임 오브젝트를 태그로 식별할 수 있다.
  • FindObjectOfType<>( )은 씬에 있는 모든 오브젝트를 검사하여 원하는 타입(<>)의 오브젝트를 가져온다. 다만 실행시간이 매우 오래 걸리기 때문에, 주로 Start( )에서 사용해야 한다! FindObjectsOfType<>( )은 해당 타입들을 전부 검색해 배열로 리턴한다!

 

아래는 총알을 발사하는 발사 기둥의 코드이다. Instantiate( )를 통해 입력한 원본 오브젝트의 복제본을 생성할 수 있다!

public class BulletSpawner : MonoBehaviour
{
    public GameObject bulletPrefab; // 생성할 탄알의 원본 프리팹
    public float spawnRateMin = 0.5f; // 최소 생성 주기
    public float spawnRateMax = 3f; // 최대 생성 주기

    private Transform target; // 발사할 대상
    private float spawnRate; // 생성 주기
    private float timeAfterSpawn; // 최근 생성 시점에서 지난 시간



    // Start is called before the first frame update
    void Start()
    {
        timeAfterSpawn = 0f;
        spawnRate = Random.Range(spawnRateMin, spawnRateMax);
        target = FindObjectOfType<PlayerController>().transform;
    }

    // Update is called once per frame
    void Update()
    {
        timeAfterSpawn += Time.deltaTime;

        if (timeAfterSpawn >= spawnRate)
        {
            timeAfterSpawn = 0f;

            GameObject bullet
                = Instantiate(bulletPrefab, transform.position, transform.rotation);
            
            bullet.transform.LookAt(target);

            spawnRate = Random.Range(spawnRateMin, spawnRateMax);

        }

    }
}
Comments