레벨에 따라 게임의 난이도를 변경하는 구현

UNITY로 게임을 만들 때 난이도 조정을 위한 데이터 만들기에 대해



ScriptableObject를 사용합니다.
이러한 수치 조정을 UNITY상에서 하고 싶은 경우의 방법입니다.


위의 이미지에 있는 데이터는 몇 가지 물건을 부수면 다음 레벨로 진행하거나 그 레벨의 난이도는 어느 정도인지 등의 데이터를 나타냅니다.

어떤 게임을 만들 때 사용한 것인가?



우선 Garbagers라는 게임을 만들었는데, 그 때의 난이도 등에 관한 데이터 만들기에 관해서 만든 것입니다.
htps : //도 sq. xy · r 가시 rs /

우선 기본이 되는 데이터



3매치 퍼즐 게임에서 많은 쓰레기를 깨면 다음 레벨로 진행되어 조금씩 어려워지는 게임이었습니다. 테트리스처럼.
그래서 몇 파괴하면 다음 레벨로 진행할지(int), 쓰레기가 출현하는 인터벌 시간(float)을 설정할 수 있도록 했습니다. (GVLevelInfo)
게다가 쓰레기가 붙어 쌓이면 쓰레기가 빨리 나오게 했습니다.
가로, 세로로의 속도, 회전 속도, 인터벌을 지정할 수 있도록 했습니다. (GVPressureInfo)

LevelClasses.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[Serializable]
public class GVLevelInfo
{
    public int NextBlockCount;
    public float SpawnInterval = 0f;
}

[Serializable]
public class GVPressureInfo
{
    public float HorizontalSpeed;
    public float VerticalSpeed;
    public float AngularSpeed;
    public float Interval;
}

[Serializable] 속성을 추가해야 합니다.
이들을 레벨별로 준비하기 위해 목록으로 만듭니다.
그리고 ScriptableObject로 해, UNITY상에 둘 수 있는 데이터로 합니다.
(전부 public으로 써 버리고 있습니다만, UNITY에서는 [SerializeField] 애트리뷰트를 붙여도 시리얼라이즈 됩니다)

GVLevelInfo의 나열된 ScriptableObject 만들기



class 선언 이후, 3행만이 중요하고 나머지는 덤의 함수입니다.

GVLevelInfoList.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class GVLevelInfoList : ScriptableObject
{
    public List<GVLevelInfo> List = new List<GVLevelInfo>();

    public int GetLevel(int breakCount)
    {
        int level = 0;
        foreach(var v in List)
        {
            if (v.NextBlockCount <= breakCount)
            {
                ++level;
                continue;
            }
            break;
        }
        return level;
    }

    public float ToNextRatio(int level,int breakCount)
    {
        int prevCount = 0;      
        if (0 <= level-1)
        {
            prevCount = List[level-1].NextBlockCount;
        }
        if (level < List.Count)
        {
            var v = List[level];
            return (breakCount - prevCount) / (float)(v.NextBlockCount-prevCount);
        }
        return 1f;
    }
}

GVPressureInfo 목록도 마찬가지로 만듭니다.

GVPressureInfoList.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GVPressureInfoList : ScriptableObject
{
    public List<GVPressureInfo> List = new List<GVPressureInfo>();

    public GVPressureInfo GetPressure(int pressure)
    {
        return List[Mathf.Clamp(pressure,0,List.Count-1)];
    }
}

그래서 데이터 구조로 준비 할 수있었습니다.
그런 다음이 데이터를 UNITY 프로젝트에 추가하는 방법입니다.

Editor 폴더 만들기



UNITY에서 Editor 폴더는 특별한 이름입니다.
여기에 놓인 스크립트 파일은 UNITY 편집기에서만 사용되며 빌드하여 출력한 앱 등에는 포함되지 않습니다.
편집기에서 데이터를 만들 때 사용할 수 있습니다.

LevelInfoMenu.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public static class LevelInfoMenu
{
    [MenuItem ("Create/CreateGVLevelInfoList")]
    static void CreateGVLevelInfoList ()
    {
        var asset = ScriptableObject.CreateInstance<GVLevelInfoList> ();

        AssetDatabase.CreateAsset (asset, "Assets/LevelInfoList.asset");
        AssetDatabase.Refresh ();
    }

    [MenuItem ("Create/CreateGVPressureInfoList")]
    static void CreatePressureInfoList ()
    {
        var asset = ScriptableObject.CreateInstance<GVPressureInfoList> ();

        AssetDatabase.CreateAsset (asset, "Assets/PressureInfoList.asset");
        AssetDatabase.Refresh ();
    }
}

이 스크립트를 작성하면 유니티의 최상위 메뉴에 Create가 추가됩니다.
실행하면 지정된 경로의 위치에 데이터가 추가됩니다.
Inspector에서 데이터를 편집할 수 있습니다.

저장 위치를 ​​선택할 수 있도록 하려면 아래와 같은 함수를 사용합니다.
htps : // / cs. 글쎄, ty3d. 이 m/쟈/콰렌 t/Sc리 pt레후렌세/에아 토르치 ty. 사후 훗파네 l. HTML
→프로젝트 내에 저장하는 경우는 이쪽이었습니다.
htps : // / cs. 글쎄, ty3d. 이 m / Sc 리 pt 레후 렌세 / 에아 토루치 ty. 글쎄, 푹 빠네 P 로지 ct. HTML





이것을 게임에서 사용합니다.

실제로 사용



일반적으로 MonoBehaviour는 Inspector에서 설정할 수 있습니다.

GarbagersSystem.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GarbagersSystem : MonoBehaviour {
    [SerializeField]
    LevelInfoUI _levelInfo;
    [SerializeField]
    GVPressureInfoList _pressureInfo;
...

인스펙터에 방금 전의 메뉴로부터 만든 데이터를 드래그&드롭 하면 데이터가 들어가므로, 사용합시다.

좋은 웹페이지 즐겨찾기