본문 바로가기

카테고리 없음

[게임 개발자가 되어보자] 적 자동 생성 (ft. 인생 유니티)

저번 시간에는 적을 만들어 아래로 이동시키고 충돌시 사라지도록 하는 충돌이벤트까지 구현해봤다

하지만 위과정까지에서는 한가지 문제가 있다.

 

"사라진 적은 다시 생성되지 않는다."

 

 

그렇다 부딪힌 이후에는 적은 사라지지만 다시 생성되지 않는다. 그럼 우리가 할일은 무엇인가?

사라진 적을 대처할 다른 적을 계속만들어줘야한다.


적 자동 생성

 

💡목표 : 적을 일정 시간마다 내 위치에 생성하고 싶다

순서

1. Enemy를 프리팹으로 만들기
2. EnemyManger 게임 오브젝트 생성하기
3. EnemyManger 스크립트 생성해 할당하기
4. 적 생성 스크립트 구현하기
5. 적 생성 시간을 랜덤하게 바꾸기
  1. Enemy를 프리팹으로 만들기(=Enemy 공장 만들기)
    • 프리팹을 이용해서 Enemy 공장 만들기
    • Prefabs : 게임 오브젝트를 파일로 만든 것
    • 방법
      1. Enemy 오브젝트를 Prefabs 폴더로 드래그앤드롭
      2. 파란색되면 링크 성공한것
      3. 기존 hierarchy에서 Enemy 오브젝트 삭제
      4. Enemy 공장 완성
  2. EnemyManager 게임 오브젝트 생성하기
    1. Create Empty - 이름 : EnemyManager
    2. 기즈모 아이콘 설정
    3. 배치는 화면 바깥쪽에 → 화면 안쪽에 배치시 갑자기 튀어나오는 느낌을 주기 때문에
  3. EnemyManager 스크립트 생성해 할당하기
  4. 적 생성 스크립트 구현하기
💡 목표 : 일정 시간마다 적을 생성해 내 위치에 갖다 놓고 싶다
필요속성 : 일정시간, 현재시간, 적 공장
순서
1. 시간이 흐른다
2. 현재시간이 일정시간이 된다
3. 적을 생성해서 위치에 놓는다 from 적공장
  • Code : 필요 속성 선언
public class EnemyManager : MonoBehaviour
{
	//현재시간
  float currentTime;
  //일정시간
  public float creatTime = 1;
  //적공장
  public GameObject enemyFactory;
}
  • 적공장 할당 : EnemyManager의 Enemy Factory 속성에 Enemy 프리팹 할당
  • Code : 시간이 흐르다가
    • 살아가면서 계속 할일 → Update 함수에서 코딩
    • 우리가 아는 시간은 “Time.deltaTime” 하나
    • Time.deltaTime : 화면을 한번 그릴때 걸리는시간
    • 1초에 60번그린다면 1/60이 델타타임이 되고 이걸 계속 더하면 1이 될수 밖에 없음
public class EnemyManager : MonoBehaviour
{
	//현재시간
  float currentTime;
  //일정시간
  public float creatTime = 1;
  //적공장
  public GameObject enemyFactory;
  
  void Update( )
  {
	  //1. 시간이 흐르다가
	  currentTime += Time.deltaTime;
	}
}
  • Code : 만약 현재시간이 일정시간이 되면 Code : 적공장에서 적을 생성해 내 위치에 갖다 놓고 싶다.
public class EnemyManager : MonoBehaviour
{
	//현재시간
  float currentTime;
  //일정시간
  public float creatTime = 1;
  //적공장
  public GameObject enemyFactory;
  
  void Update( )
  {
	  //1. 시간이 흐르다가
	  currentTime += Time.deltaTime;
	  //2. 만약 현재 시간이 일정 시간이 되면
	  if(currentTime > creatTime)
	  {
		  //3.적공장에서 적을 생성해 //enemyFactory 속성에는 이미 enemy Prefabs이 할당됌
		  GameObject enemy = Instantiate(enemyFactory);
		  //내 위치에 갖다 놓고 싶다.
		  enemy.transform.position = transform.position;
	  }
}
  1. 적이 안내려옴
  2. 시간을 초기화해주지 않아서 적이 무한으로 생성되서 서로 부딪히셔 나오자 마자 파괴됨
  3. currentTime을 0으로 초기화 해주면 해결
  • 완성코드
public class EnemyManager : MonoBehaviour
{
	//현재시간
  float currentTime;
  //일정시간
  public float creatTime = 1;
  //적공장
  public GameObject enemyFactory;
  
  void Update( )
  {
	  //1. 시간이 흐르다가
	  currentTime += Time.deltaTime;
	  //2. 만약 현재 시간이 일정 시간이 되면
	  if(currentTime > creatTime)
	  {
		  //3.적공장에서 적을 생성해
		  GameObject enemy = Instantiate(enemyFactory);
		  //내 위치에 갖다 놓고 싶다.
		  enemy.transform.position = transform.position;
		  //현재시간을 0으로 초기화
		  currentTime = 0;
	  }
}

또 문제 발생

1. 적이 동시에 같이내려온다

2. 적생성시간을 랜덤하게 설정해보자

 

  • code
public class Manager : MonoBeahaviour
{
	//최소시간
	float minTime = 1;
	//최대시간
	float maxTime = 5;
	
	......생략.....
	
	void Start()
	{
		//태어날 때 적의 생성 시간 설정
		createTime = UnityEngine.Random.Range(minTime, maxTime);
	}
	
	void Update()
	{
		//1. 시간이 흐르다가
	  currentTime += Time.deltaTime;
	  //2. 만약 현재 시간이 일정 시간이 되면
	  if(currentTime > creatTime)
	  {
		  //3.적공장에서 적을 생성해
		  GameObject enemy = Instantiate(enemyFactory);
		  //내 위치에 갖다 놓고 싶다.
		  enemy.transform.position = transform.position;
		  //현재시간을 0으로 초기화
		  currentTime = 0;
			//적을 생성한 후 적의 생성시간 다시 설정
			createTime = UnityEngine.Random.Range(minTime, maxTime);
	  }
	}
}

→ 적은 이제 랜덤하게 등장

→ But, 단순히 아래로만 이동하디 너무 단순


이제 적이 랜덤하게 다른 위치에서 등장하지만 아래로만 이동해서 too simple하다는 단점이 있다.
다음시간에는 적이 플레이어가 있는 방향을 찾고 그 방향으로 돌진하는 작업을 구현해보도록 하자
오늘 Unity 코드 주머니....늘리기 완료!