▼ 구현할 영상
https://www.youtube.com/watch?v=z2y_uP3i1YY
▼구현할 목록
- 오른쪽 IndexTrigger를 누르고 떼면 앞으로 미사일 총알이 발사되고 이펙트 생성하기
▼구현 방법
- 다른 팀원(영원님)이 미리 만들어 놓은 오른손을 새로운 Scene으로 가져와 총의 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한 다음 이동시켜주기
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스크립트를 가져와서 새롭게 만든 총도 감지하게 바꿔주기
'VR 팀프로젝트 > [GroundZero] 제작 일지' 카테고리의 다른 글
GroundZero 제작일지 - GameOverScene 구현 (1) | 2023.12.21 |
---|---|
GroundZero 제작일지 - 날아다니는 적(Enemy 3) 이동 구현 (0) | 2023.12.12 |
GroundZero 제작일지 - 아이템 비행체 구현 (0) | 2023.11.16 |
GroundZero 제작일지 - 왼손 방패 잡기 구현(LeftHandShield) (0) | 2023.11.08 |
GroundZero 제작일지 - 레퍼런스 게임 Gazzlers 분석 (1) | 2023.11.02 |