유니티/닷지(3D 탄막 슈팅 게임)

닷지(3) - 탄알 제작

무직백수취업준비생 2021. 7. 12. 04:20
728x90
반응형

지난 Player 제작에 이어서 탄알 게임 오브젝트를 생성합니다.

 

 

3D Object 중 Sphere를 생성한 뒤 Bullet으로 이름을 변경합니다.

 

위치를 (0, 5, 0), 스케일을 (0.5, 0.5, 0.5)로 변경합니다.

 

Meterial을 생성한 뒤 Bullet Color로 이름을 변경합니다.

 

컬러는 (255, 0, 0)으로 설정한 뒤 Bullet 게임 오브젝트로 드래그&드롭합니다.

 

 

Bullet 게임 오브젝트에 Rigidbody 컴포넌트를 추가합니다.

 

이후 중력에 영향을 받지 않도록 Use Gravity 체크를 해제합니다.

 

 

탄환이 플레이어와 접촉을 감지하고 사망처리는 해야 하지만

 

충돌로 인해 밀려남이나 이동에 영향을 주는 것은 원치 않으니

 

접촉을 감지만 할 수 있도록 Is Trigger를 체크합니다.

 

Hierarchy의 Bullet을 Project로 드래그&드롭해 프리팹으로 만듭니다.

 

이제 Bullet 스크립트를 작성하겠습니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float speed = 8f; //탄알 이동 속력
    private Rigidbody bulletRigidbody; //이동에 사용할 리지드바디 컴포넌트

    void Start()
    {

    }
}

speed와 bulletRigidbody를 변수로 선언하고 speed의 기본값은 8로 지정했습니다.

 

speed의 접근 한정자가 public이기 때문에 speed에 할당된 값은 인스펙터 창에서 변경할 수 있습니다.

 

    void Start()
    {
        //게임 오브젝트에서 Rigidbody 컴포넌트를 찾아 bulletRigidbody에 할당
        bulletRigidbody = GetComponent<bulletRigidbody>();
        //리지드바디의 속도 = 앞쪽 방향 * 이동 속력
        bulletRigidbody.velocity = transform.forward * speed;
    }

탄환은 게임 오브젝트의 앞쪽 방향으로 speed만큼의 속도로 이동하게 됩니다.

 

    void Start()
    {
        //게임 오브젝트에서 Rigidbody 컴포넌트를 찾아 bulletRigidbody에 할당
        bulletRigidbody = GetComponent<bulletRigidbody>();
        //리지드바디의 속도 = 앞쪽 방향 * 이동 속력
        bulletRigidbody.velocity = transform.forward * speed;

        //3초 뒤에 자신의 게임 오브젝트 파괴
        Destroy(gameObject, 3f);
    }

 

탄환이 반복적으로 생성되지만 소멸하지는 않는다면 메모리를 낭비하게 됩니다.

 

3초 뒤 파괴되도록 코드를 추가합니다.

 

    //트리거 충돌 시 자동으로 실행되는 메서드
    void OnTriggerEnter(Collider other)
    {
        //충돌한 상대방 게임 오브젝트가 Player 태그를 가진 경우
        if (other.tag == "Player")
        {
            //상대방 게임 오브젝트에서 PlayerController 컴포넌트 가져오기
            PlayerController playerController = other.GetComponent<PlayerController>();

            //상대방으로부터 PlayerController 컴포넌트를 가져오는 데 성공했다면
            if (playerController != null)
            {
                //상대방 PlayerController 컴포넌트의 Die() 메서드 실행
                playerController.Die();
            }
        }
    }
}

 

총알이 충돌한 대상이 플레이어인지 아닌지를 판단합니다.

 

그리고 플레이어라면 Die() 메서드를 실행해 플레이어가 죽게 됩니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float speed = 8f; //탄알 이동 속력
    private Rigidbody bulletRigidbody; //이동에 사용할 리지드바디 컴포넌트

    void Start()
    {
        //게임 오브젝트에서 Rigidbody 컴포넌트를 찾아 bulletRigidbody에 할당
        bulletRigidbody = GetComponent<bulletRigidbody>();
        //리지드바디의 속도 = 앞쪽 방향 * 이동 속력
        bulletRigidbody.velocity = transform.forward * speed;

        //3초 뒤에 자신의 게임 오브젝트 파괴
        Destroy(gameObject, 3f);
    }

    //트리거 충돌 시 자동으로 실행되는 메서드
    void OnTriggerEnter(Collider other)
    {
        //충돌한 상대방 게임 오브젝트가 Player 태그를 가진 경우
        if (other.tag == "Player")
        {
            //상대방 게임 오브젝트에서 PlayerController 컴포넌트 가져오기
            PlayerController playerController = other.GetComponent<PlayerController>();

            //상대방으로부터 PlayerController 컴포넌트를 가져오는 데 성공했다면
            if (playerController != null)
            {
                //상대방 PlayerController 컴포넌트의 Die() 메서드 실행
                playerController.Die();
            }
        }
    }
}

Bullet의 전체 코드는 다음과 같습니다.

 

이제 해당 스크립트를 Bullet에 적용시킵니다.

 

오류가 나서 확인해봤습니다.

 

해당 드래그 부분을 지워줍니다.

 

오류가 없어졌으니 Bullet 인스펙터 창 상단의 Overrides > Aplly All을 선택해줍니다.

 

게임 오브젝트의 변동사항이 자동으로 프리팹에 반영됩니다.

 

이것으로 탄알 제작이 끝났습니다.

 

다음번엔 탄알 생성기를 제작하겠습니다.

 

 

728x90
반응형