계속 개발해 보겠습니다. 

먼저 지금까지 한 Scene을 저장하겠습니다. 하이라키 탭에서  Ctrl + s  를 눌러서 Main이라고 저장해줍니다.


슈팅게임이기 때문에 플레이어가 총을 들고있어야 하겠죠? 하이라키에서  3D Object > Cube  를 두개 만들어서 모형을 적당히 잡아줍시다.

큰 큐브는 Gun으로 손잡이는 Handle로 Gun안에 자식으로 넣어줍니다. 만들어진 Gun은 또한 Player의 자식으로 넣어줍니다.

Material 도 생성해서 색깔을 입혀주시면 Gun 모양까지 완성입니다.



이제 총알과 총알을 발사하는 C# 스크립트를 제작해보겠습니다.

총알은  3D Object > Sphere  의 크기를 0.2 정도로 한 작은 구로 만들어 주시구, 이름은 Bullet 입니다. 앞과 마찬가지로 Material을 만들어서 총알에 색깔을 입혀줍니다. Bullet Color정도로 이름을 설정해주면 되겠네요.


저는 총알이 빛나게 해주고 싶기 때문에  Bullet에서  Add Component > Light  를 넣어주었습니다. 선택 사항이에요!


이제 Project에서  Create > C# Script  로 스크립트를 만들어 줍시다. 이름은 Fire로 설정해주세요.

코드는 다음과 같습니다


public class Fire : MonoBehaviour {
    public float speed = 8f;
    private RaycastHit hit;
    
    // Update is called once per frame
    void Update () {
        if(Physics.Raycast(transform.position, transform.forward, out hit, speed * Time.deltaTime){
 
            hit.collider.SendMessage("OnDamage"1, SendMessageOptions.DontRequireReceiver);
 
            Destroy(gameObject);
            return;
        }
            transform.Translate(00, speed * Time.deltaTime);
    }
}
 
tistory.hanorange.com
cs


speed 는 총알이 날아가는 속도입니다. public으로 선언해주었기 때문에 inspector창에서 직접 수정이 가능하죠.


눈여겨볼 코드는 RaycastHit 메소드입니다. 

만약 오브젝트에 Collider를 붙여서 CompareTag 메소드를 사용하게 되면, 총알처럼 빠른 오브젝트는 프레임과 프레임 사이를 순식간에 지나가게 되어 업데이트 적용을 받지 못해 물체의 충돌을 감지하지 못하는 경우가 발생할 수 있습니다.


그러나 RaycastHit를 사용하게되면 보이지 않는 빔이 속성값으로 넣어준 방향으로 '한 프레임' 정도를 먼저 쬐면서 지나가게 됩니다. 이 빔에 맞는 오브젝트의 정보를 반환할 수도 있죠. 

즉, Update문에 있는 Physics.Raycast(transform.position, transform.forward, out hit, speed * Time.deltaTime

코드는 시작점과 방향, 빔과 속도를 지정해준 것입니다.


hit.collider.SendMessage("OnDamage"1, SendMessageOptions.DontRequireReceiver);

이 코드에서는 총알을 맞은 오브젝트에게 "OnDamage" 함수를 실행하라고 알려줍니다. 1 만큼 데미지를 주고, DontRequireReceiver 메소드는 "OnDamage" 함수가 없는 객체는 수행할 필요가 없다는 뜻입니다. 


작성이 완료되었으면 Bullet의 inspector에 Fire 스크립트를 붙여줍시다.

이제 총알은 게임이 시작되면 클릭할때마다 생성되어 발사될것이기 때문에 Project탭으로 드래그해서 프리팹으로 만들어 주시고, 하이라키에서는 지워줍니다.



총알을 발사할 스크립트를 만들 차례입니다.

하이라키 탭에서  Create > Create Empty  를 선택해서 Fire Position이라고 이름을 바꿔 주시구, 위치를 다음과 같이 총구 앞으로 배치해줍시다.

총알이 발사될 위치를 잡아주는 과정입니다.



Project 탭에서  Create > C# Script , 이름은 Gun으로 설정해줍니다.


public class Gun : MonoBehaviour {
    public GameObject bulletPrefab;
    public Transform firePosition;
 
    public float timeBetFire = 0.6f;
    private float lastFireTime = 0;
 
    // Update is called once per frame
    void Update () {
        if (Input.GetButton("Fire1")){
            if(Time.time >= lastFireTime + timeBetFire) {
                Fire ();
            }
        }    
    }
 
    void Fire(){
        lastFireTime = Time.time;
        Instantiate (bulletPrefab, firePosition.position, firePosition.rotation);
    }
}
 
tistory.hanorange.com

cs


먼저 프리팹으로 만든 Bullet과 총알이 발사될 위치인 firePosition을 가져와줍니다.


발사 간격도 설정해 주어야겠죠? timeBetFire 에서 설정한 쿨타임은 0.6초입니다.

lastFireTime 은 총알이 발사되었을 때 Time.time 으로 현재 시간을 저장하기 때문에, 업데이트문에서 버튼을 눌렀을 때 현재 시간이 마지막에 발사된 시간과 쿨타임을 합친 시간보다 크다면 총알이 발사되는 원리입니다.


Instantiate 메소드는 프리팹을 firePosition의 위치와 각도로 복사해 가져온다는 내용의 코드입니다.

이제 Gun의 inspector에서 Gun 스크립트를 붙여주시고, BulletPrefab과 Fire Position에 맞는 오브젝트를 넣어줍시다.



이제 카메라 뷰를 적당히 설정해주고, 구동해 봅시다!



총알까지 잘 발사가 되네요. 완성이 머지않았습니다.

+ Recent posts