[Unity] T-rex Run (크롬 공룡 게임) 만들기 (3) - 장애물

Kim Yuhyeon·2023년 4월 21일
0

게임개발

목록 보기
91/135
post-thumbnail

장애물


선인장 프리팹

CactusBase.cs

using System.Collections.Generic;
using UnityEngine;

public class CactusBase : MonoBehaviour
{
    public float cactusSpeed = 1;
    public Vector2 startPosition;

    private void OnEnable()
    {
        transform.position = startPosition;
    }

    void Update()
    { 
        // 왼쪽으로 이동
        transform.Translate(Vector2.left * Time.deltaTime * cactusSpeed);

        // 왼쪽 넘어가면 안보이게 
        if (transform.position.x < -6)
        {
            gameObject.SetActive(false);
        }
    }

}
  • 변수

    • cactusSpeed : 이동 속도

    • startPosition : 선인장 오브젝트의 초기 위치

  • 흐름

    • OnEnable()

      • 선인장 오브젝트가 다시 활성화될 때마다 초기 위치로 이동하게 됩니다.
    • Update()

      • 선인장 오브젝트를 왼쪽으로 cactusSpeed 만큼 이동시키고, 만약 선인장 오브젝트가 왼쪽 끝을 넘어가면 활성화 상태를 false로 변경하여 보이지 않게 만듭니다.

생성, 관리

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using Random = UnityEngine.Random;

public class CactusRespawnManager : MonoBehaviour
{
    public List<GameObject> cactusPool = new List<GameObject>();
    public GameObject[] objs;
    public int objCnt = 1;
    private void Awake()
    {
        for (int i = 0; i < objs.Length; i++)
        {
            for (int j = 0; j < objCnt; j++)
            {
                cactusPool.Add(CreateObj(objs[i], transform));
            }
        }
    }

    private void Start()
    {
        StartCoroutine(CreateCactus());
    }

    IEnumerator CreateCactus()
    {
        while (true)
        {
            cactusPool[SelectDeactivateCactus()].SetActive(true);
            yield return new WaitForSeconds(Random.Range(1f, 3f));
        }
    }

    int SelectDeactivateCactus()
    {
        List<int> deactiveList = new List<int>();
        for (int i = 0; i < cactusPool.Count; i++)
        {
            // 비활성화된 것을 추리기
            if (!cactusPool[i].activeSelf)
                deactiveList.Add(i);
        }

        int num = 0;
        if (deactiveList.Count > 0)
            num = deactiveList[Random.Range(0, deactiveList.Count)];

        return num;
    }

    GameObject CreateObj(GameObject obj, Transform parent)
    {
        GameObject copy = Instantiate(obj);
        copy.transform.SetParent(parent);
        copy.SetActive(false);
        return copy;
    }
}
  • 변수

    • cactusPool : 비활성화된 선인장 오브젝트들을 저장할 리스트
    • objs : 선인장의 종류를 나타내는 게임 오브젝트 배열
    • objCnt : 각 선인장 종류마다 생성될 개수
  • 흐름

    • Awake()

      • objs 배열에 있는 각 선인장 종류마다 objCnt개씩 생성하여 cactusPool 리스트에 추가합니다.
      • CreateObj() 함수를 사용하여 생성된 선인장 오브젝트는 초기 상태로 비활성화됩니다.
    • Start()

      • CreateCactus() 코루틴을 실행합니다.
      • 이 코루틴은 무한 루프를 돌며 cactusPool 리스트에서 비활성화된 선인장 오브젝트를 무작위로 선택하여 활성화합니다.
      • 그 후 일정한 시간 간격을 두고 다음 선인장을 생성합니다.
    • SelectDeactivateCactus()

      • 비활성화된 선인장 오브젝트들 중 무작위로 하나를 선택하여 그 인덱스를 반환합니다.
      • 이 함수를 통해 새로운 선인장 오브젝트를 생성하지 않고 기존에 비활성화된 오브젝트를 재사용할 수 있습니다.
    • CreateObj()

      • 인자로 받은 obj를 parent의 자식으로 생성한 후 비활성화된 상태로 반환합니다.

결과

0개의 댓글