https://www.youtube.com/watch?v=SSg_9q-8h-A&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=9
1. 시간에 따른 난이도
GameManager, Enemy, Spawner 수정할 예정
게임시간과 최대게임시간을 담당할 변수 선언
public class GameManager : MonoBehaviour{
public float gameTime;
public float maxGameTime = 2 * 10f;
void Update()
{
gameTime += Time.deltaTime;
if (gameTime > maxGameTime)
{
gameTime = maxGameTime;
}
}
}
소환 스크립트에서 레벨 담당 변수 선언
int level;
float timer;
void Update()
{
timer += Time.deltaTime;
level = Mathf.FloorToInt(GameManager.instance.gameTime / 10f);
if (timer > (level==0?0.5f:0.2f))
{
timer = 0;
spawn();
}
}
- Mathf.FloorToInt : 소수점 아래는 버리고 Int형으로 바꾸는 함수
- Mathf.CeilToInt : 소수점 아래를 올리고 Int형으로 바꾸는 함수
2. 소환 데이터
하나의 스크립트내에서 여러개의 클래스를 정의할 수 있다.
Spawner에 소환 데이터를 담당하는 클래스를 선언
[System.Serializable]
public class SpawnData
{
public float spawnTime;
public int spriteType;
public int health;
public float speed;
}
- 추가할 속성들 : 스프라이트 타입, 소환시간, 체력, 속도
-[System.Serializable] : 직렬화, 클래스 위에 작성한다. 추후 설명
만든 클래스를 그대로 타입으로 활용하여 배열 변수 선언
public class Spawner : MonoBehaviour
{
public SpawnData[] spawnData;
}
- 이때 인스펙터 창에서 보이지 않는데 이를 위해 직렬화를 한다
- 직렬화(Serialization) : 개체를 저장 혹은 전송하기 위해 변환
이후 데이터 입력
3. 몬스터 다듬기
몬스터 프리펩을 하나만 남기기(이름 Enemy로 변경)
Enemy 스크립터에 RuntimeAnimatorController 변수 선언 + 체력 변수 선언
public class Enemy : MonoBehaviour
{
public float health;
public float maxHealth;
public RuntimeAnimatorController[] animCon;
void Awake()
{
anim = GetComponent<Animator>();
}
}
- RuntimeAnimatorController : 애니메이터의 동적 할당 방식
OnEnable() 에 isLive(생존여부)와 체력 초기화
private void OnEnable()
{
target = GameManager.instance.player.GetComponent<Rigidbody2D>();
isLive = true;
health = maxHealth;
}
초기 속성을 적용하는 함수 생성
public void Init(SpawnData data)
{
anim.runtimeAnimatorController = animCon[data.spriteType];
speed = data.speed;
maxHealth = data.health;
health = data.health;
}
- 매개변수의 속성을 몬스터 속성 변경에 활용하기
- 애니메이터 변수 선언 및 초기화 하기(생략)
4. 소환 적용하기
Spawner 스크립트의 Spawn함수 수정하기
void spawn()
{
GameObject enemy = GameManager.instance.pool.Get(0); //SpawnData 인스펙터창
enemy.transform.position = spawnPoint[Random.Range(1,spawnPoint.Length)].position;
enemy.GetComponent<Enemy>().Init(spawnData[level]);
}
- Get(0) : 배열에 하나밖에 없기 때문
-
소환 시간 조건을 소환데이터로 변경
void Update()
{
timer += Time.deltaTime;
level = Mathf.Min(Mathf.FloorToInt(GameManager.instance.gameTime / 10f), spawnData.Length - 1);
if (timer > (spawnData[level].spawnTime))
{
timer = 0;
spawn();
}
}
인덱스 에러는 레벨 변수 계산 시 Min 함수를 사용하여 막을수 있어요
level = Mathf.Min(Mathf.FloorToInt(GameManager.instance.gameTime / 10f), spawnData.Length - 1);
- Mathf.Min(값, 임의값) : 임의값까지의 값만 허용한다.
깃허브 올리기
Commit : ver 1.6.1
Description : Summon Level Apply
https://github.com/mekain80/CloneCode_Undead_Survivor
'게임개발 > 언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 8 (자동🎯원거리 공격 구현) (0) | 2023.04.10 |
---|---|
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 7 (회전하는🪓근접무기 구현) (0) | 2023.04.10 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 6 (오브젝트 풀링🏊으로 소환하기) (0) | 2023.04.09 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 5 (몬스터🧟만들기) (0) | 2023.04.07 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 3 (2D 셀 애니메이션🏃제작하기) (0) | 2023.04.06 |