본문 바로가기
VR 팀프로젝트/[GroundZero] 제작 일지

GroundZero 제작일지 - 오른손 총 구현(바주카포)

by 잰쟁 2023. 11. 30.
728x90

 

▼ 구현할 영상

 

https://www.youtube.com/watch?v=z2y_uP3i1YY

 

 

▼구현할 목록

- 오른쪽 IndexTrigger를 누르고 떼면 앞으로 미사일 총알이 발사되고 이펙트 생성하기

 


▼구현 방법

- 다른 팀원(영원님)이 미리 만들어 놓은 오른손을 새로운 Scene으로 가져와 총의 Material 바꿔주기 (총 구분을 위해)

 

팀원(영원님)이 기존에 만들어 놓은 총                                                             Material 및 이름 변경

 

 

- Gun_missile의 자식들로 총알 발사 위치 등 Transform들 생성해주기

   - EffectTrans : (총알 발사시 생기는) 이팩트 생성 위치

   - ShootTrans : 총알 발사 위치

 

 

- 총알 발사시의 총구에서 생성되는 이팩트와 총알의 궤적을 나타내는 이팩트 만들어주기

총구 이팩트                                                                                                     총알 궤적 이팩트

 

 

- 미사일 총알을 만들어줄 'MissileBulletGenerator' 만들어주고 스크립트도 생성해주기

 

 


▼스크립트

MissileGun

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

namespace LJE 
{
    public class MissileGun : MonoBehaviour
    {
        [SerializeField] private GameObject shootEffectGo;
        [SerializeField] private Transform effectTrans;
        [SerializeField] private Transform missileBullet;
        public System.Action shoot;
         

        void Start()
        {
            this.shootEffectGo = Instantiate<GameObject>(shootEffectGo);
            this.shootEffectGo.SetActive(false);
        }

        void Update()
        {      
            if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger,OVRInput.Controller.RTouch))
            {
                this.shoot();
                this.StartCoroutine(CoShootEffect());
            }
        }
        //총 발사시 이팩트
        IEnumerator CoShootEffect()
        {
            this.shootEffectGo.transform.position = this.effectTrans.position;
            this.shootEffectGo.SetActive(true);
            yield return new WaitForSeconds(0.5f);
            this.shootEffectGo.SetActive(false);
        }
    }
}

 

MissileBullet

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

namespace LJE 
{
    public class MissileBullet : MonoBehaviour
    {
        private Transform shootDistance;
        private Rigidbody rb;
        public float moveSpeed = 5f;

        void Start()
        {
            this.rb = this.GetComponent<Rigidbody>();
        }

        void Update()
        {            
            this.rb.AddForce(this.transform.forward * this.moveSpeed, ForceMode.Impulse);
        }

        private void OnTriggerEnter(Collider other)
        {
            if (other.CompareTag("Gun") && other.CompareTag("MissileBullet")) return;
            Destroy(this.gameObject);
        }
    }
}

 

MissileBulletGenerator

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

namespace LJE 
{
    public class MissileBulletGenerator : MonoBehaviour
    {
        [SerializeField] private GameObject missileBullet;
        [SerializeField] private MissileGun missileGun;
        private Transform shootTrans;

        void Start()
        {
            this.shootTrans = GameObject.Find("ShootTrans").transform;

            this.missileGun.shoot = () =>
            {
                this.GenerateMissileBullet();
            };
        }

        public void GenerateMissileBullet()
        {           
            GameObject go = Instantiate(this.missileBullet, this.shootTrans.position,Quaternion.identity);
            go.transform.SetParent(this.transform);
        }
    }
}

▼ 결과

 

※ 문제 발생 : 총알이 총이 바라보는 방향이 아닌 그냥 앞쪽으로만 발사됨,,


 

▼ 수정할 부분

: 총이 바라보는 방향으로 총알 발사

 

총의 앞쪽 지점에 'ShootDistance' transform을 생성하고, 그 쪽을 LookAt한 다음 이동시켜주기

ShootDistance

 

 

MissileBullet 스크립트 수정

 public class MissileBullet : MonoBehaviour
    {
        //바라볼 위치
        private Transform shootDistance;
        private Rigidbody rb;
        public float moveSpeed = 5f;
        public System.Action OnHitEnemy;

        void Start()
        {
            this.rb = this.GetComponent<Rigidbody>();
            //총의 앞쪽인 'ShootDistance'를 찾은 다음
            this.shootDistance = GameObject.Find("ShootDistance").transform;
            //그 방향을 바라보기
            this.transform.LookAt(this.shootDistance.position);
        }

▼ 결과 : 총구의 방향으로 총알이 발사 됨

 


▼스크립트

 

MissileBullet

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

namespace LJE 
{
    public class MissileBullet : MonoBehaviour
    {
        private Transform shootDistance;
        private Rigidbody rb;
        public float moveSpeed = 5f;

        void Start()
        {
            this.rb = this.GetComponent<Rigidbody>();
            this.shootDistance = GameObject.Find("ShootDistance").transform;
            this.transform.LookAt(this.shootDistance.position);
        }

        void Update()
        {            
            this.rb.AddForce(this.transform.forward * this.moveSpeed, ForceMode.Impulse);
        }

        private void OnTriggerEnter(Collider other)
        {
            if (other.CompareTag("Gun") && other.CompareTag("MissileBullet")) return;
            Destroy(this.gameObject);
        }
    }
}

 

MissileBulletGenerator

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

namespace LJE 
{
    public class MissileBulletGenerator : MonoBehaviour
    {
        [SerializeField] private GameObject missileBullet;
        [SerializeField] private MissileGun missileGun;
        private Transform shootTrans;

        void Start()
        {
            this.shootTrans = GameObject.Find("ShootTrans").transform;

            this.missileGun.shoot = () =>
            {
                this.GenerateMissileBullet();
            };
        }

        public void GenerateMissileBullet()
        {           
            GameObject go = Instantiate(this.missileBullet, this.shootTrans.position,Quaternion.identity);
            go.transform.SetParent(this.transform);
        }
    }
}

 

MissileGun

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

namespace LJE 
{
    public class MissileGun : MonoBehaviour
    {
        [SerializeField] private GameObject shootEffectGo;
        [SerializeField] private Transform effectTrans;
        [SerializeField] private Transform missileBullet;
        public System.Action shoot;
         

        void Start()
        {
            this.shootEffectGo = Instantiate<GameObject>(shootEffectGo);
            this.shootEffectGo.SetActive(false);
        }

        void Update()
        {      
            if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger,OVRInput.Controller.RTouch))
            {
                this.shoot();
                this.StartCoroutine(CoShootEffect());
            }
        }

        IEnumerator CoShootEffect()
        {
            this.shootEffectGo.transform.position = this.effectTrans.position;
            this.shootEffectGo.SetActive(true);
            yield return new WaitForSeconds(0.5f);
            this.shootEffectGo.SetActive(false);
        }


    }
}

 

Cube

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

namespace LJE 
{
    public class Cube : MonoBehaviour
    {
        [SerializeField] private Material[] mat;
        private MeshRenderer meshRenderer;
        void Start()
        {
            this.meshRenderer = this.GetComponent<MeshRenderer>();
        }

        private void OnTriggerEnter(Collider other)
        {
            this.StartCoroutine(CoChangeMat());
        }

        IEnumerator CoChangeMat()
        {
            this.meshRenderer.material = this.mat[0];
            yield return new WaitForSeconds(0.2f);
            this.meshRenderer.material = this.mat[1];
        }
    }
}

 


▼최종 결과

: 다른 팀원이 만들어둔 GameMain 및 EnemyController스크립트를 가져와서 새롭게 만든 총도 감지하게 바꿔주기