Unity 게임 개발 입문
팀프로젝트 / 똥피하기
도도9999
2023. 9. 8. 20:33
Enemy, Pool, ItemBomb 프리팹 생성
Enemy는 초기 생성 후 60초마다 하나씩 추가 생성 (스테이지)
Item을 먹으면 Enemy가 발사한 Pool 삭제
->
Enemy가 좌우 혹은 상하로 움직이도록 하는 코드 추가 필요.
스테이지, 체력 UI 추가 필요
더 다양한 아이템 추가 필요
Enemy 생성 코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemySpawner : MonoBehaviour
{
public GameObject enemyPrefab; // Enemy 프리팹
public float initialDelay = 1.0f; // 초기 지연 시간 (5초)
public float spawnInterval = 60.0f; // 생성 간격 (10초로 설정)
private float spawnYMin = -3f; // Y 좌표 최소값
private float spawnYMax = 3f; // Y 좌표 최대값
private void Start()
{
// 초기 지연 시간 이후부터 일정 주기마다 아이템을 생성하는 함수 호출
InvokeRepeating("SpawnEnemies", initialDelay, spawnInterval);
}
private void SpawnEnemies()
{
// 랜덤하게 결정할 축을 선택합니다 (0은 X 축, 1은 Y 축)
int randomAxis = Random.Range(0, 2);
// 생성할 위치의 초기값을 설정합니다.
float spawnX = 0f;
float spawnY = 0f;
// 축을 선택하여 해당 축의 값을 랜덤하게 설정합니다.
if (randomAxis == 0)
{
// X 축을 선택한 경우
spawnX = Random.Range(-8f, 8f);
spawnY = (Random.Range(0, 2) == 0) ? -3f : 3f; // -3 또는 3 중에서 랜덤 선택
}
else
{
// Y 축을 선택한 경우
spawnX = (Random.Range(0, 2) == 0) ? -8f : 8f; // -8 또는 8 중에서 랜덤 선택
spawnY = Random.Range(-3f, 3f);
}
// 적을 생성할 위치를 설정합니다.
Vector3 spawnPosition = new Vector3(spawnX, spawnY, 0);
// Enemy를 생성합니다.
Instantiate(enemyPrefab, spawnPosition, Quaternion.identity);
}
}
Enemy가 발사한 발사체의 움직임 코드
using UnityEngine;
public class Projectile : MonoBehaviour
{
public float speed = 10.0f; // 발사체 속도
public float lifetime = 2.0f; // 발사체 수명 (예: 2초)
private Rigidbody2D rb;
void Start()
{
rb = GetComponent<Rigidbody2D>();
Destroy(gameObject, lifetime);
}
// 발사체가 어떤 조건에서 삭제되어야 할지를 추가할 수도 있습니다.
// 예를 들어, 충돌하면 삭제하는 로직을 추가할 수 있습니다.
}
아이템 (폭탄) 생성 코드
using UnityEngine;
public class ItemSpawner : MonoBehaviour
{
public GameObject itemBombPrefab; // 폭탄 아이템 프리팹
public float initialDelay = 5.0f; // 초기 지연 시간 (5초)
public float spawnInterval = 5.0f; // 아이템 생성 간격 (5초로 설정)
private Camera mainCamera; // 메인 카메라 참조
private void Start()
{
// 메인 카메라를 찾아 저장합니다.
mainCamera = Camera.main;
// 초기 지연 시간 후부터 일정 주기마다 아이템을 생성하는 함수 호출
InvokeRepeating("SpawnItems", initialDelay, spawnInterval);
}
private void SpawnItems()
{
// x와 y 좌표를 랜덤하게 설정합니다.
float randomX = Random.Range(-8f, 8f);
float randomY = Random.Range(-3f, 3f);
// 아이템을 생성합니다.
Vector3 spawnPosition = new Vector3(randomX, 0, randomY);
GameObject itemBomb = Instantiate(itemBombPrefab, spawnPosition, Quaternion.identity);
// 아이템과 플레이어의 충돌을 감지하기 위해 Collider2D 컴포넌트를 추가합니다.
Collider2D itemCollider = itemBomb.GetComponent<Collider2D>();
if (itemCollider != null)
{
// 아이템과 플레이어의 충돌을 감지하는 스크립트를 추가합니다.
itemCollider.isTrigger = true;
itemCollider.gameObject.AddComponent<ItemCollisionHandler>();
}
}
}
Item을 만났을 때 효과가 잘 적용되도록 하는 코드
using UnityEngine;
public class ItemCollisionHandler : MonoBehaviour
{
private bool hasCollided = false; // 한 번 충돌했는지 여부를 나타내는 플래그
private void OnTriggerEnter2D(Collider2D collision)
{
if (!hasCollided && collision.CompareTag("Player"))
{
// 플레이어와 아이템이 충돌하면 화면 내 모든 적의 발사체를 삭제하는 로직을 추가합니다.
Debug.Log("플레이어와 아이템 충돌!");
DestroyAllProjectiles();
// 아이템을 파괴하고, 다시 충돌하지 않도록 플래그를 설정합니다.
Destroy(gameObject);
hasCollided = true;
}
}
private void DestroyAllProjectiles()
{
// 화면 내 모든 발사체를 찾아서 삭제하는 로직을 추가합니다.
Projectile[] projectiles = FindObjectsOfType<Projectile>();
foreach (Projectile projectile in projectiles)
{
Destroy(projectile.gameObject);
}
}
}