Ruya Games

5 - 움직이는 오브젝트 이어서 생성하기 본문

게임 개발 일지/블록 아케이드 게임

5 - 움직이는 오브젝트 이어서 생성하기

SadEvil 2023. 12. 4. 10:26

이번에 구현해야 할 내용은 움직이는 오브젝트를 이어서 생성하기 입니다.

무한맵도 비슷한 느낌으로 구현 가능합니다.

아래는 간단한 구현 방법입니다.


1. Time.deltaTime으로 리스폰 시간 설정

Time.deltaTime을 사용해서 리스폰 시간을 관리합니다. 아래는 사용 예시입니다.

private float timeSinceLastSpawn;
private const float respawnTime = 5f;

private void Update() {
  if (respawnTime < timeSinceLastSpawn) {
    timeSinceLastSpawn = 0f;
    //여기에 오브젝트 생성 함수를 추가합니다.
  } else {
    timeSinceLastSpawn += Time.deltaTime;
  }
}

respawnTime 변수에 리스폰 대기시간을 할당하고, timeSinceLastSpawn 변수를 타이머로 사용하며, 이 값을 Time.deltaTime값 만큼 매 프레임마다 증가시키면서 5초를 기다립니다.

5초가 지나면 타이머를 0으로 초기화하며 오브젝트 생성 함수를 호출합니다.


2. 이전에 생성된 오브젝트와 위치 맞추기

먼저, 오브젝트를 생성합니다. 보통 전 prefab을 사용해서 생성합니다.

public MyPrefabObject objectPrefab;
public Transform gameObjectPanel;

private void MakeOneBlockLine() {
  var newLine = Instantiate(objectPrefab, gameObjectPanel);
}

Instantiate는 게임 오브젝트를 복제하는 내장 함수입니다.

복제할 오브젝트는 무조건 인자로 넣어줘야 하며, 추가로 부모로 설정할 오브젝트, Transform값, Rotation값, 월드좌표를 사용할지 여부등을 인자로 넣을 수 있습니다. 다만 위치와 회전값 지정은 부모 오브젝트를 지정할 때는 동시에 사용할 수 없습니다.

 

오브젝트를 생성하고 바로 transform.position(또는 localPosition)을 통해 위치를 지정해줍니다. 이 때, 이전 오브젝트의 좌표값을 참고하여 값을 지정해줍니다.

public MyPrefabObject objectPrefab;
public Transform gameObjectPanel;

private void MakeOneBlockLine() {
  var newLine = Instantiate(objectPrefab, gameObjectPanel);
  newLine.transform.localPosition = new Vector3(0, setYPosition, 0);
}

여기서 이전 오브젝트의 좌표값을 불러올때 주의할 내용은 아래와 같습니다.

* 어떤 포지션을 사용해야 하는지, (position 또는 localPosition)

* UGUI라면 rect, pivot값을 고려했는지

 

 

만약 무한맵을 사용하는거라면 초기 위치, 마지막 위치만 정해두면 되기때문에 2번에서의 계산 과정은 필요없습니다.

결과 영상입니다. (gif로 저장했더니 버벅거리는것같네요. 실제로 구현하면 저러지 않습니다 :) )