정명직의 게임개발

[Unity] 3D 죽림고수 만들기(2) - 화살 본문

Unity/게임 제작

[Unity] 3D 죽림고수 만들기(2) - 화살

정명직 2023. 7. 19. 21:12

이번에는 죽림고수에서 플레이어를 공격하는 화살을 만들어보고 플레이어와 충돌 처리까지 해보겠습니다.

 

날아오는 화살들

화살 구현하기

화살 스크립트를 직접 작성해 보겠습니다.

public class Arrow : MonoBehaviour
{
    [SerializeField] private float moveSpeed;    // 스피드

    private void Start()
    {
        // Start 이벤트 함수에서 Destroy를 실행시켜 5초 뒤에 오브젝트 삭제
        Destroy(this.gameObject, 5f);
    }

    private void Update()
    {
        // Vector3.forward : 오브젝트 앞쪽 방향
        // Translate를 사용해서 오브젝트를 앞으로 이동
        transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
    }

    // dir : 날아갈 방향, randomSpeed : 스피드를 랜덤으로 할건지 (기본값은 false)
    public void Shoot(Vector3 dir, bool randomSpeed = false)
    {
    	Vector3 direction;        
        
        // 방향을 정규화 해주고 동일한 높이로 날아가기 위해 y 값을 0으로 초기화
        direction = dir.normalized;
        direction.y = 0;
        
        // 화살을 direction으로 회전 
        // LookRotation : 해당 벡터 방향을 바라보는 회전 상태를 반환한다.
        transform.rotation = Quaternion.LookRotation(direction);
        
        // 랜덤 스피도
        if (randomSpeed)
        {
            moveSpeed = Random.Range(moveSpeed, moveSpeed + 1f);
        }
    }
}

Vector3.forward로 화살이 앞으로 날아가게 해 줍니다. 나중에 화살을 소환할 때 방향을 지정해 줘야 하기 때문에 Shoot 함수를 만들어 날아갈 방향으로 화살을 회전시켜 줍니다. 또한 죽림고수는 화살이 모두 일정한 속도로 날아가는 패턴이 있고 아닌 패턴이 있기 때문에 스피드를 랜덤으로 할 건지 받아줍니다. 

 

화살 프리팹

Arrow 프리팹을 제작하고 플레이어와 충돌을 체크하기 위해 Rigidbody와 Box Collider를 추가해 줍니다.

 

화살이 정상적으로 날아가는지 테스트 스크립트를 작성해 보겠습니다.

public class Test : MonoBehaviour
{
    [SerializeField] private GameObject arrow;

    void Start()
    {
        // 15개 화살을 일직선으로 스폰함
        for (int i = 0; i < 10; i++)
        {
            Arrow arrowObj = Instantiate(arrow, new Vector3(i + 1, 1, 0), Quaternion.identity).GetComponent<Arrow>();
            arrowObj.Shoot(new Vector3(0, 0, 1), true); // 랜덤스피드 True
        }
    }
}

 

각자 다른 스피드로 날아가는 모습

화살들이 z 축으로 날아가는 모습을 볼 수 있습니다.

 

 

플레이어와 충돌처리

Arrow 태그 추가, Is Trigger 체크

충돌처리를 하기 위해 Arrow 태그를 추가하고 콜라이더 IsTrigger를 체크해줍니다.

public class PlayerController : MonoBehaviour
{
    ···

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Arrow")) // 태그 체크 
        {
            Debug.Log("GameOver"); 
        }
    }
}

PlayerController에  충돌체크를 하는 코드를 추가해 줍니다.

 

 

충돌 했을 때

콘솔 창을 보면 플레이어와 화살이 충돌했을 때 성공적으로 디버그가 찍히는 모습을 볼 수 있습니다.

 

이번 글에서는 화살을 움직이고 플레이어와 충돌처리까지 구현하였습니다. 다음 글에서는 유니티 오브젝트 풀링을 사용해서 화살 생성 패턴들을 만들어보겠습니다.

 

 

 

 

[Unity] 3D 죽림고수 만들기(1) - 플레이어

이번에는 직접 게임을 만들어보면서 게임 개발의 기본적인 요소를 배우려고 합니다. 첫 번째로 플래시게임 죽림고수를 모작하여서 3D게임으로 만들어보겠습니다. 죽림고수? 플레이어를 움직여

jikk.tistory.com

'Unity > 게임 제작' 카테고리의 다른 글

[Unity] 3D 죽림고수 만들기(1) - 플레이어  (3) 2023.07.13