Unity-#4.탄알 오브젝트 제작

CHO WanGi·2024년 3월 31일

Unity

목록 보기
4/13

Retro 유니티 서적을 공부한 내용을 정리합니다.

콜라이더

컴포넌트의 물리적 충돌을 위한 정보.
따라서 이 콜라이더를 가진 물체끼리 충돌시 튕겨 나가게 됨.

트리거 콜라이더

트리거 콜라이더는 충돌한 물체를 밀어내는 물리적 표면이 없음
따라서 일반 콜라이더와 충돌시 충돌감지만 진행되고, 일반 콜라이더를 가진 오브젝트는 이를 통과하게 됨.

따라서 트리거 콜라이더를 통해서 도착 여부를 판단하거나, 새로운 오브젝트 출현 등등으로 활용이 가능

프리펩

언제든지 재사용할 수 있는 미리 만들어진 게임 오브젝트 파일.
비슷한 옵젝을 여러번 만드는 번거로움을 줄이기 위해 탄생

따라서 어떤 옵젝을 프리펩으로 만들면, 추후에 똑같은 옵젝을 재사용해서 만들 수 있음.

프리펩을 만드는 방법은 하이어라키 창에서 프로젝트 에셋 창으로 드래그 & 드랍
하면 간단히 프리펩을 만들 수 있음.

탄알 속도 및 제거 시간 지정

public float speed = 8f;
    private Rigidbody bulletRigidbody;
    // Start is called before the first frame update
    void Start()
    {
        bulletRigidbody = GetComponent<Rigidbody>();
        bulletRigidbody.velocity = transform.forward * speed;

        Destroy(gameObject, 3f);

    }

탄알의 RigidBody 컴포넌트의 velocity를 조절하는 방식을 사용
transform 컴포넌트를 이용하여 앞쪽 방향에 지정해놓은 속도값을 곱함.

transform 컴포넌트

모든 오브젝트들이 갖고 있는 컴포넌트로, 위치, 크기, 회전을 담당.
이 컴포넌트는 GetComponent<Transform>처럼 가져올 필요 없이
그냥 transform으로 가져오기 가능

Destroy([파괴할 옵젝], [시간])

입력한 오브젝트를 파괴
두번째 파라미터에 시간을 할당, 그 시간이 되면 옵젝이 파괴

충돌처리

충돌 이벤트 메서드

게임 오브젝트는 자신이 충돌한 사실을 알 수 없음.
그 대신 충돌했다는 메시지가 해당 오브젝트에게 전달.

메시지를 받은 오브젝트는 충돌 사실을 알고, 상황에 맞는 메서드를 실행

OnTriggerEnter 혹은 OnCollisionEnter 메시지를 받음
충돌 메시지에는 충돌한 상대방 게임 오브젝트 정보도 담김.

이 충돌 메시지는 Rigidbody 컴포넌트에서 발생시기키 때문에,
충돌 구현시 어느 한쪽은 꼭 RigidBody 컴포넌트가 있어야 함.

OnCollision

일반적 콜라이더 가진 두 옵젝 충돌시 발생, 충돌시 서로 밀어냄.

  • OnCollisionEnter(collision collision) : 충돌하는 순간
  • OnCollisionStay(collision collision) : 충돌하는 동안
  • OnCollisionExit(collision collision) : 충돌 후 분리되는 순간

collision 타입은 충돌 관련 정보를 담아두는 컨테이너,
입력으로 들어온 collision 을 통해서 충돌한 상대방 게임 오브젝트, 충돌지점, 충돌 표면의 방향을 알 수 있음

OnTrigger

충돌한 오브젝트의 콜라이더 중 최소 하나가 트리거 콜라이더라면 자동 실행
충돌시 서로 그대로 통과

  • OnTriggerEnter(collider other)
  • OnTriggerStay(collider other)
  • OnTriggerExit(collider other)

collider 타입으로 받는 이유는 트리거 충돌은 통과하기 때문에 상세한 정보가 필요 없기 때문.

other는 충돌한 상대방 컴포넌트를 가리킴

탄알에 충돌 감지 구현

void OnTriggerEnter(Collider other) {
        if (other.tag == "Player") 
        {
            PlayerController playerController = other.GetComponent<PlayerController>();  
            if(playerController != null)
            {
                playerController.Die();
            }
    
            }    
    }

OnTriggerEnter 메서드를 활용, Player 태그를 가진 오브젝트와 충돌시
PlayerController 컴포넌트의 Die 메서드를 실행

탄알 생성기

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

Random.Range()

입력으로 받은 최대, 최솟값 사이 랜덤한 숫자를 출력

FindObjectType

타겟에는 탄알이 날아갈 대상을 지정하는게 맞지만,
만약 탄알 생성기가 여러개라면 일일히 Player 게임 오브젝트를 지정하는게 귀찮음.
따라서 코드상에서 Player 게임 오브젝트의 트랜스폼 컴포넌트를 찾아서 가져옴.

target = FindObjectOfType<PlayerController>().transform;
PlayerController playerController = FindObjectOfType<PlayerController>()
target = playerController.transform;

위 두 코드는 동일함.
다만 이 FindObjectType 메서드는 씬 내 모든 옵젝을 검색하기 때문에 실행비용이 높다.

Time.deltaTime

초당 프레임은 컴퓨터 성능에 따라 다르기 때문에 고정되어있지 않음
따라서 update 메서드 실행 사이 간격을 알기 위해 사용

Update 메서드에 Time.deltaTime을 계속 누적하면 특정 시점으로부터
얼마나 시간이 흘렀는지 알 수 있다.

Instantiate 메서드

탄알을 복제 및 생성하는데 Instantiate([원본], [위치], [회전]) 메서드를 사용.
유니티는 게임 도중 실시간으로 옵젝 생성시 이 메서드를 사용함.
따라서 기존에 만들어놓은 탄알 프리팹을 입력으로 넣어서
탄알을 실시간으로 복제 생성함.

profile
제 Velog에 오신 모든 분들이 작더라도 인사이트를 얻어가셨으면 좋겠습니다 :)

0개의 댓글