Unity GunShot Skill 생성

2022. 1. 12. 19:15Unity/VR

이번에는 3번째 스킬인 단발형 타입 GunShot스킬을 만들어 보겠다.

이번에 사용할 가장 기본이 되는 로직은 XR Grab Interactable를 이용해서 Event처리를 통해 총알을 발사 하는 것이다.


총과 총알의 기본 셋팅

위 사진은 에셋스토에서 구한 총에 기존에 만들었던 쉐이더를 적용한다음 콜라이더박스를 적용한 모습이다. 여기서 특이한 점이 콜라이더의 배치모습인데 이는 XR Ray interactor가 레이캐스트를 쏠 때 콜라이더를 감지해 Grab을 하는데 만약 총모습대로 콜라이더를 정확하게 배치를 하게 되면 실제 Grab을 하려했을 때 Ray를 맞추기 어려운 이슈가 있고 손을 총에다 대고 Ray를 쐈을 때 콜라이더 내부에서 Ray가 쏴지면 제대로 충돌판정이 일어나지 않는 이슈가 있어 이렇게 콜라이더를 설정하게 되었다.

다음은 shot_start_point이다. 이 위치는 총알이 Instantiate되고 발사가 될 시작점이다. 이는 정적으로 넘겨준다.

 

위 사진은 총알을 제작한 것이다. 일반 구에다가 기존에 만들었던 쉐이더를 적용하였고 파티클 시스템을 추가했다.

 위처럼 Rendere에서 Render Mode를 Mesh로 바꿔주면 파티클이 3D입자로 나가게 된다.

또한 Scaling Mode에서 Local로 설정되면 파티클들이 물체에 자식화 하는 것을 방지할 수 있어 훨씬 자연스러운 파티클 연출이 가능하다.


발동 전용 스크립트

지금까지의 스킬 매커니즘을 보면 발동과 실제 스킬 사용의 기능이 분리 되어있다. 이는 나중에 코드를 재활용하기 위함이라 이번에 제작하는 스킬 또한 최대한 기능을 분리 해 놓았다.

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

public class GunShot : MonoBehaviour
{
    private Transform weapon_appear_pos;
    public GameObject gunshot_appear;  //동적 할당으로 모습 변경 여지 있음.
    // Start is called before the first frame update
    void Start()
    {
        weapon_appear_pos = GameObject.Find("Weapon_appear_pos").GetComponent<Transform>();
        GameObject gunshot = Instantiate(gunshot_appear, weapon_appear_pos.transform);
        gunshot.transform.SetParent(weapon_appear_pos);
    }

}

크게 눈에 띄는점은 없다. 그저 이미 지정된 장소에 무기를 소환하는 스크립트이다.

 public GameObject gunshot_appear;  //동적 할당으로 모습 변경 여지 있음.

하지만 이 스크립트는 나름 중요하다고 볼 수 있는데 이는 총의 모습을 계속 바꾸는 코드를 짜려한다면 이 부분을 정적이아닌 동적으로 할당하게되면 해결 할 수 있기 때문이다.

 


메인 스크립트

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

public class GunShot_Trigger : MonoBehaviour
{
    private XRGrabInteractable grabInteractable;
    public Transform shot_start_point;
    public GameObject bullet;

    public float bullet_speed; //제어
    
    // Start is called before the first frame update
    void Awake()
    {
        grabInteractable = GetComponent<XRGrabInteractable>();
        grabInteractable.onActivate.AddListener(Shot);
    }

    // Update is called once per frame
    void OnDestroy()  // MonoBehaviour제거되면 실행
    {
        grabInteractable.onDeactivate.RemoveListener(Shot);
    }

    private void Shot(XRBaseInteractor interactor)
    {
        GameObject bullet_set = Instantiate(bullet,shot_start_point.position, shot_start_point.rotation);  
        bullet_set.GetComponent<Rigidbody>().AddForce(bullet_set.transform.forward * bullet_speed);
    }
}

메인이 되는 이 스크립트는 2개만 보면 된다. 첫번째는 XRGrabInteractable을 활용한 리스너설정, 두번째는 총알 생성과 AddForce를 통한 발사이다.

 

먼저 XRGrabInteractable의 부분을 보자.

 private XRGrabInteractable grabInteractable;
 
  void Awake()
    {
        grabInteractable = GetComponent<XRGrabInteractable>();
        grabInteractable.onActivate.AddListener(Shot);
    }
     private void Shot(XRBaseInteractor interactor)
    {
        //발사
    }

먼저 Awake()를 통해 시작하자마자 GrabInteractabled의 컴포넌트를 가져오고 Event의 피실행 함수를 리스너에 추가해준다. 이 때 피실행 함수는 인자로 XRBaseInteractor interactor를 받아와야한다. 이렇게 되면 사전 준비는 다 끝이 난다.

 

이제 총알의 생성과 발사 부분을 보자

public Transform shot_start_point;
public GameObject bullet;
public float bullet_speed; //제어

private void Shot(XRBaseInteractor interactor)
    {
        GameObject bullet_set = Instantiate(bullet,shot_start_point.position, shot_start_point.rotation);  
        bullet_set.GetComponent<Rigidbody>().AddForce(bullet_set.transform.forward * bullet_speed);
    }

총을 만들때 만들어 놓았던 발사포인트에서 객체화 해준뒤 AddForce를 통해 발사를 하는 스크립트이다. 이곳에서 주의할 부분은 아래 코드 부분이다.

Instantiate(bullet,shot_start_point.position, shot_start_point.rotation);

만약 여기서 위치값을 shot_start_point라고만 적는다면 총알프리팹은 shot_start_point에 자식화되어 총알이 발사되도 총에 방향에 따라 엄청나게 흔들리게 된다. 그래서 자식화를 원하지 않으며 객체화를 원하면 저렇게 position과 rotation을 따로 적어야한다.

 


Inspector상에서의 적용

 

참고로 위 XRGrabInteractable은 콜라이더들이 있는 물체에 같이 붙혀주어야 한다.

여기서 가장 중요한 부분은 Activate와 Deactivated이다. 필자는 Gun_Shot_Trigger를 같은 물체에 할당해주고 XRGrabInteractable에서 자신을 불러와 Actiavate와 Deactivated를 설정해 주었다. 

 


실행

 

 

'Unity > VR' 카테고리의 다른 글

Unity 스킬 확장  (0) 2022.02.22
Unity 스킬 피격 처리  (0) 2022.01.15
XR Rig Body생성, 스킬 거리 최댓값 주기  (0) 2021.09.05
XR Ray Interactor, Teleportation Area를 통한 이동 시스템  (0) 2021.09.01
Unity IceBomb Skill제작  (0) 2021.07.16