유니티 로그라이크 08

유니티 로그라이크 08

Summary 게임의 난이도를 시간에 따라 조절하는 코드 구현, C#에서 실수형과 정수형 변환, 직렬화 기법을 사용하여 사용자 정의 클래스를 인스펙터에 노출시키는 방법, 몬스터 스폰 데이터 관리 및 초기화 방법에 대해 설명합니다.


Image

🎥 동영상 보기

🔥 시간에따라 게임의 난이도가 변경되는 코드를 만들어볼까요

🔥 GameManager.cs 에서 플레이시간을 담을 변수와 코드를 추가해줍시다

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//GameManager.cs

public class GameManager : MonoBehaviour
{
    ...(생략)...

    //게임시간과 최대게임시간을 담당할 변수
    public float gameTime; //실제 게임타임
    public float maxGameTime = 2 * 10f; //최대 게임타임 (숫자는 '초')


   ...(생략)...

    void Update()
    {
        **gameTime += Time.deltaTime;**

        //현재 플레이타임이 최대 플레이타임을 초과한다면
            //현재 게임시간을 최대 게임시간으로 고정시킵니다
        if(gameTime > maxGameTime)
        {
            gameTime = maxGameTime;
        }
    }
}

🔥 소환데이터를 담당하는 클래스를 만들어볼까요

스크립트 내부에서 메인클래스 밖에 새로운 클래스를 생성해봅시다

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
//Spawner.cs

public class Spawner : MonoBehaviour
{
		**public SpawnData[] spawnData;**
   ...(생략)...
}

**public class SpawnData
{
    public int spriteType; //스프라이트타입이 0일땐 해골 1일땐 좀비 이렇게 바뀌게 할것임
    public float spawnTime; //스폰타임
    public int health; //몬스터 피통
    public float speed; //몬스터 이속
}**

🔥 **근데 이렇게 스크립트 내부에 두개의 클래스가 존재한다면 인스펙터창에선 ** SpawnData가 보이지 않습니다 이때 필요한 기술이 바로 직렬화 입니다

  • 유니티 에디터의 Inspector에는 사용자가 정의한 클래스(Class) 또는 구조체(Stucture)의 정보가 Inspector에 노출되지 않는다. System에서 제공하는*** “[Serializable]” 키워드를 지정하여 Inspector에 노출시킬 수 있다.*** Image

위와 같이 사용자 정의 클래스의 윗줄에 “[Serializable]” 키워드를 붙이고, Monobehaviour를 상속받고 있는 C# 스크립트의메인 클래스에서 해당 클래스의 객체를 생성하면, 아래와 같이 Inspector에 노출되어 값을 지정 할 수 있게 된다.

Image


직렬화는 데이터 구조나 오브젝트 상태를 Unity 에디터가 저장하고 나중에 재구성할 수 있는 포맷으로 자동으로 변환하는 프로세스를 말한다.

Unity 에디터에서는 저장 및 로딩, 인스펙터 창, 인스턴스화, 프리팹과 같은 일부 내장 기능에 직렬화가 사용된다.

저는 속성창 내부에서 바로 System을 불러와 사용했습니다

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
//Spawner.cs

public class Spawner : MonoBehaviour
{
		public SpawnData[] spawnData;
   ...(생략)...
}

**[System.Serializable]**
public class SpawnData
{
    public int spriteType; //스프라이트타입이 0일땐 해골 1일땐 좀비 이렇게 바뀌게 할것임
    public float spawnTime; //스폰타임
    public int health; //몬스터 피통
    public float speed; //몬스터 이속
}

Image

Image

🔥 스폰데이터를 활용해 몬스터의 타입과 스탯을 정하고 스폰해볼까요

1
2
3
4
5
//Enemy.cs

public float health; //몬스터의 현체력
public float maxHealth;
public RuntimeAnimatorController[] animCon; //애니메이션 컨트롤러를 각 몬스터 타입에 맞게 넣기위해 배열로 선언

Image

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
**//Enemy.cs**

		//스폰데이터를 그대로 때려박음
    //변수 data에 SpawnData 스크립트를 넣음으로서 SpawnData에 접근할 수 있음
**    public void Init(SpawnData data)
**    {
        // ... 스프라이트 & 애니메이션 변경부분
        //스프라이트의 타입은 인덱스로만 쓴다 (어처피 배열이 애니메이터랑 동일하니까)
        //애니메이터의 컨트롤을 뭐로바꿀래? animCon[스프라이트배열] 로 바꿀게여!
        **anim.runtimeAnimatorController = animCon[data.spriteType];
**
        // ... 스피드부분
        speed = data.speed;

        // ... 피통부분
        **maxHealth = data.health;
        health = data.health;** //최대피통이 올라갔기때문에 현피통도 초기화해준다
    }

💬 댓글

GitHub 계정으로 로그인하여 댓글을 남겨보세요. GitHub 로그인

🔧 댓글 시스템 설정이 필요합니다

GitHub Discussions 기반 댓글 시스템을 활성화하려면:

  1. Giscus 설정 페이지에서 설정 생성
  2. GISCUS_SETUP_GUIDE.md 파일의 안내를 따라 설정 완료
  3. Repository의 Discussions 기능 활성화

Repository 관리자만 설정할 수 있습니다. 설정이 완료되면 모든 방문자가 댓글을 남길 수 있습니다.

목차