-
Object Pooling (자동 포탑 만들기)C# & 유니티 2024. 4. 29. 17:58반응형
Spawn 위치에서 총알을 매시간마다 발사하게끔 코루틴을 만들어주었다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Fire : MonoBehaviour { [SerializeField] float TimeFire = 1f; public GameObject bulletPrefab; public GameObject spawnPos; private int poolSize = 5; private Queue<GameObject> pools = new Queue<GameObject>(); void Start() { for (int i = 0; i < poolSize; i++) { GameObject bullet = Instantiate(bulletPrefab); bullet.gameObject.SetActive(false); pools.Enqueue(bullet); } StartCoroutine(ShootCoroutine()); } IEnumerator ShootCoroutine() { while (true) { yield return new WaitForSeconds(TimeFire); GameObject bullet = pools.Dequeue(); pools.Enqueue(bullet); //bullet.SetActive(false); bullet.SetActive(true); bullet.transform.position = spawnPos.transform.position; bullet.transform.rotation = spawnPos.transform.rotation; } } }
pool Queue에 생성한 총알 프리팹을 비활성화 하고 Enqueue 해준다
List가 아닌 Queue를 사용한 이유는 검색이 필요하지 않고 선입선출로 사용하였다
발사 코루틴을 실행하면 총알을 풀링해서 빼주고, 다시 넣어준다
총알을 활성화 시키고 총알의 Position과 rotation을 spawnPos의 위치와 동일하게 맞춰준다.
-----------------------------------------------------------------------------------------------------------------------------------------
아래는 총알 Prefab이 가지고 있는 이동 속도이다.
using UnityEngine; public class BulletMove : MonoBehaviour { [SerializeField] float speed = 1f; void Update() { transform.Translate(Vector3.forward * speed * Time.deltaTime); } private void OnTriggerEnter(Collider other) { if (other.gameObject.name == "Enemy") { GameManager.Instance.AddScore(1); gameObject.SetActive(false); } } }
적과 충돌하면 비활성화 시키고 점수를 증가시킨다
반응형'C# & 유니티' 카테고리의 다른 글
시네머신 (2) 2024.04.30 LateUpdate (0) 2024.04.29 ref, out (2) 2024.02.27 C# 가위바위보(1.하드코딩, 상수, 열거형) (1) 2024.02.25 2024.02.22(C#기초) (0) 2024.02.22