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);
        }
    }
}