게임개발/언데드서바이벌_골드메탈_클론코딩

[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 6+ (소환 레벨⏳적용하기)

메카인 2023. 4. 9. 02:42

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

 

GitHub - mekain80/CloneCode_Undead_Survivor: https://www.youtube.com/watch?v=MmW166cHj54&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x

https://www.youtube.com/watch?v=MmW166cHj54&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=1 - GitHub - mekain80/CloneCode_Undead_Survivor: https://www.youtube.com/watch?v=MmW166cHj54&li...

github.com