유니티 프로그램

[유니티] UNITY (첫번째: 생성/파괴방식) 총쏘기 게임 만들 때 총알을 생성하는 방법은 무엇이 있나요?

비도르 2022. 9. 13. 17:07

[유니티] UNITY (첫번째: 생성/파괴방식) 총쏘기 게임 만들 때 총알을 생성하는 방법은 무엇이 있나요?

안녕하세요. 오늘도 평화로운 추석이 끝난 어느 흐린 날의 오후입니다.
총쏘기, 대포, 화살쏘기 같은 게임을 만들 때면, 적을 죽이기 위한 총알,대포알,화살등을 적절히 생성할 필요가 있습니다.

생성할 필요가 있는 것을 미리 Prefab으로 만들고, 그것을 Instantiate()함수를 사용해서 생성하는 것입니다.

How??? 어떻게 Prefab을 만들고 Instanstiate()함수를 사용하는지 알아보겠습니다.

 

아래의 순서로 설명을 하겠습니다.

1. 첫번째로 총알 Prefab 생성

2. 두번째로 총알 생성해서 발사하기

3. 실행화면보기


자세한 방법은 아래의 예제를 통해서 얘기하겠습니다.


[예제] 총에서 총알을 생성하기

먼저, 아래와 같이 화면을 구성하였습니다. Cube를 3개 추가해서 총을 만들고 이름을 ' Chong '으로 하고, 그  옆에 총알역할을 할 수 있는 Sphere를 1개 추가해서 이름을 ' ChongAl ' 이라고 했습니다.

 

화면 구성

 

1. 첫번째로 총알 Prefab 생성.

 

-. 총알이 날아가게 하기 위해서 물리적요소인 Rigidbody를 추가해서 AddForce() 함수를 사용할 것입니다. 그래서 , ' ChongAl ' 오브젝트에 ' Add Component ' 를 눌러서 ' Rigidbody ' 를 추가하고 Use Gravity 속성은 ' 체크해제 ' 해야합니다. 만약에 Use Gravity가 체크되어 있어면 중력의 힘을 받아서 아래로 총알이 떨어져서 원하는 효과를 얻기 힘듭니다.

 

Rigidbody 추가

 

-. Assets 밑에 ' Prefabs '라는 빈 폴더를 만들고 ' ChongAl ' 오브젝트를 드래그앤드롭 하면 아래와 같이 파랗게 글자색이 바뀌면서 Prefab으로 됩니다. 그리고나서, Hierarchy 에 있는 ChongAl 오브젝트를 지우면 사용할 총알 Prefab이 완성됩니다.

 

총알 Prefab

 

2. 두번째로 총알 생성해서 발사하기

 

-. 빈 오브젝트를 생성해서 이름을 Startposi 라고 두고 총알이 생성될 위치인 총구앞에 옮겨둡니다. 

 

총알 시작 위치 설정

 

-. 아래와 같이 ' Chong ' 이라는 이름으로 스크립터를 생성합니다.

 

using UnityEngine;

public class Chong : MonoBehaviour
{
    public GameObject Start_Posi; //총알 발사위치를 가져옴 
    public GameObject Chong_Al; // 총알 Prefab을 가져옴

    GameObject Balsa; //생성된 총알 오브젝트를 받는 변수
  
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space)) //스페이스 키를 누르면
        {
           Balsa = Instantiate(Chong_Al, transform.position, Quaternion.identity); // 총알을 생성함
            Balsa.transform.position = Start_Posi.transform.position; // 생성된 총알을 총구로 이동시킴
            Balsa.GetComponent<Rigidbody>().AddForce(new Vector3(1, 0, 0) * 20, ForceMode.Impulse); // 총알을 총구앞쪽 방향으로 발사시킴
            Destroy(Balsa, 0.4f); // 총알 발사 후 0.4초 후에 총알이 사라짐
        }
    
    }

 

-. ' Chong '스크립트를 ' Chong ' 오브젝트에 ' 드래그앤드롭 ' 하여 연결합니다.

 

-. ' Start_Posi ' 변수' Startposi ' 오브젝트를 드래그앤드롭으로 넣고, ' Chong_Al ' 변수에 프리팹에 있는 ' ChongAl ' 오브젝트를 드래그앤드롭으로 넣습니다.

 

변수에 오브젝트 연결하기

 

3. 실행화면

-. 이제 실행하고 스페이스바를 누르면 아래와 같이 총알이 잘 동작하는 것을 확인 할 수 있습니다. 여러번 누르면 총알이 계속해서 생성되서 날아가는 것을 볼 수 있습니다.

 

실행 화면

 

-. 총알을 생성(instantiate)하고 파괴(destroy)하는 동작이 계속해서 일어나게 되는데 이것은 기기의 CPU 동작에 약간의 부담으로 작용 할 수 있습니다. 그래서 , 미리 충분한 총알을 미리 배열(Array)방식으로 만들어두고, 필요할 때  SetActive 값을 True 로 해서 사용하는 것도 좋은 방법입니다.(흔히,Pool방식이라고 하죠^^)



* 참고 : Rigidbody의 AddForce() 함수 설명

 

-. AddForce(힘 벡터 , 힘 모드)

1. 힘 벡터 : 힘의 방향과 크기를 넣음

(예 : transform.forward x 20 ,  Vector(1,0,0) x 20 , Vector(20,0,0)) 

 

2. 힘 모드 : 힘의 적용되는 방식

ForceMode.Force : 힘 벡터로 계속해서 힘을 가할 때 ( 기본값으로 입력하지 않아도 됨)

ForceMode.Impulse : 충격적인 힘을 가할 때 ( 포탄, 총알의 발사할때나 폭발이 일어날 때 쓰면 유용함)
ForceMode.Acceleration  : 힘벡터 방향으로 계속해서 속도가 빨라지게 할 때 ( 오브젝트 무게는 무시 )
ForceMode.VelocityChange  : 힘벡터 방향으로 속도값을 변경하고 싶을 때 ( 오브젝트 무게는 무시 )



Instantiate() 함수를 사용해서 총알을 생성해 보았지만 다양하게 사용이 되고 있습니다. 적 캐릭터를 랜덤한 위치에 생성한다거나, 포탄을 생성하게 한다거나 맵이나 아이템을 생성하게 하는 등 미리 만들기 애매한 것들을 만들기 좋은 것 같습니다. 

그럼 오늘도 즐유!(즐거운 유니티) ^^