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

GroundZero 제작일지 - 날아다니는 적(Enemy 3) 이동 구현

by 잰쟁 2023. 12. 12.
728x90

▼ 구현할 부분

 

 

 

 

 

▼ 구현 목표

- 날아다니는 적(Enemy 3)의 이동 및 공격 구현하기

  • 하늘에 떠다니는듯 위아래로 움직이면서 Player 따라가기 (like 두둥실,,)  <--- 완료
  • Player를 향해 총알 발사하기   <--- 완료
  • 좌우로 랜덤하게 이동하기  <--- 다른 팀원이 만들어 놓은 적 이동 스크립트 활용하기로 함

▼ 기본 시야

기존에 있던 'MainCamera' 삭제 후 'OVRCameraRig' 붙여주기  

 

 

▼ 날아다니는 적 만들어주기 (Enemy 3)

 

비행체 프리팹과 비행체에 탈 Enemy 프리팹을 가져와서

 

 

합체 시켜주기

귀엽다!

 

 

기존에 있던 Idle 애니메이션이 좀 밋밋한 것 같아서

 

Idle 애니메이션을 복사해와 새로운 Enemy3 애니메이션을 만들어 준 후 Position 값을 조정해서

좀 더 역동적으로 연출해보았다

 

 

 

▼ Player 추적하고 총알 발사하기

 

총알을 발사할 위치를 잡기

 

임의로 총알 만들어 주기

 

 

총알을 생성할 'BulletGenerator'와 총알 발사를 컨트롤 할 'TestEnemy3Main' 만들어주기

 

 

▼ 결과 영상

 

 

▼ 스크립트

TestBullet

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

namespace LJE 
{
    public class TestBullet : MonoBehaviour
    {
        private Transform target;
        private Rigidbody rBody;
        public float maxSpeed = 10f;
        public float moveForce = 2.0f;

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

        void Update()
        {
            this.target = GameObject.Find("CenterEyeAnchor").transform;
            //player 방향으로 총알에 AddForce
            this.transform.LookAt(this.target);
            this.rBody.AddForce(this.transform.forward * this.moveForce, ForceMode.Impulse);


            //총알이 player보다 뒤로 갈 시 destroy
            if (this.transform.position.z <= this.target.position.z)
            {
                Destroy(this.gameObject);
            }
        }
    }
}

 

EnemyBulletGenerator

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

namespace LJE 
{
    public class EnemyBulletGenerator : MonoBehaviour
    {
        public static EnemyBulletGenerator Instance;
        [SerializeField]
        private GameObject bulletPrefab;
        [SerializeField] private Transform shootPos1;
        [SerializeField] private Transform shootPos2;

        private void Awake()
        {
            Instance = this;
        }

        public void GenerateBullet()
        {
            GameObject bulletGo = Instantiate(bulletPrefab, this.shootPos1);
            GameObject bulletGo1 = Instantiate(bulletPrefab, this.shootPos2);
            bulletGo.transform.SetParent(null);
            bulletGo1.transform.SetParent(null);
        }
    }
}

 

TestEnemy3Main

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

namespace LJE 
{
    public class TestEnemy3Main : MonoBehaviour
    {
        [SerializeField] private EnemyBulletGenerator bulletGenerator;

        void Start()
        {
            this.StartCoroutine(CoCreateBullet());
        }

        IEnumerator CoCreateBullet()
        {
            yield return null;
            while (true)
            {
            	//2초마다 총알 생성
                yield return new WaitForSeconds(2f);
                this.bulletGenerator.GenerateBullet();
            }
        }
    }
}