레벨에 따라 게임의 난이도를 변경하는 구현
14130 단어 게임 제작C#ScriptableObjectUnity
UNITY로 게임을 만들 때 난이도 조정을 위한 데이터 만들기에 대해
ScriptableObject를 사용합니다.
이러한 수치 조정을 UNITY상에서 하고 싶은 경우의 방법입니다.
위의 이미지에 있는 데이터는 몇 가지 물건을 부수면 다음 레벨로 진행하거나 그 레벨의 난이도는 어느 정도인지 등의 데이터를 나타냅니다.
어떤 게임을 만들 때 사용한 것인가?
우선 Garbagers라는 게임을 만들었는데, 그 때의 난이도 등에 관한 데이터 만들기에 관해서 만든 것입니다.
htps : //도 sq. xy · r 가시 rs /
우선 기본이 되는 데이터
3매치 퍼즐 게임에서 많은 쓰레기를 깨면 다음 레벨로 진행되어 조금씩 어려워지는 게임이었습니다. 테트리스처럼.
그래서 몇 파괴하면 다음 레벨로 진행할지(int), 쓰레기가 출현하는 인터벌 시간(float)을 설정할 수 있도록 했습니다. (GVLevelInfo)
게다가 쓰레기가 붙어 쌓이면 쓰레기가 빨리 나오게 했습니다.
가로, 세로로의 속도, 회전 속도, 인터벌을 지정할 수 있도록 했습니다. (GVPressureInfo)
LevelClasses.csusing 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.csusing 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.csusing 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.csusing 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.csusing System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GarbagersSystem : MonoBehaviour {
[SerializeField]
LevelInfoUI _levelInfo;
[SerializeField]
GVPressureInfoList _pressureInfo;
...
인스펙터에 방금 전의 메뉴로부터 만든 데이터를 드래그&드롭 하면 데이터가 들어가므로, 사용합시다.
Reference
이 문제에 관하여(레벨에 따라 게임의 난이도를 변경하는 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/drfters/items/3897b248f11dc264978c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
우선 Garbagers라는 게임을 만들었는데, 그 때의 난이도 등에 관한 데이터 만들기에 관해서 만든 것입니다.
htps : //도 sq. xy · r 가시 rs /
우선 기본이 되는 데이터
3매치 퍼즐 게임에서 많은 쓰레기를 깨면 다음 레벨로 진행되어 조금씩 어려워지는 게임이었습니다. 테트리스처럼.
그래서 몇 파괴하면 다음 레벨로 진행할지(int), 쓰레기가 출현하는 인터벌 시간(float)을 설정할 수 있도록 했습니다. (GVLevelInfo)
게다가 쓰레기가 붙어 쌓이면 쓰레기가 빨리 나오게 했습니다.
가로, 세로로의 속도, 회전 속도, 인터벌을 지정할 수 있도록 했습니다. (GVPressureInfo)
LevelClasses.csusing 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.csusing 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.csusing 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.csusing 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.csusing System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GarbagersSystem : MonoBehaviour {
[SerializeField]
LevelInfoUI _levelInfo;
[SerializeField]
GVPressureInfoList _pressureInfo;
...
인스펙터에 방금 전의 메뉴로부터 만든 데이터를 드래그&드롭 하면 데이터가 들어가므로, 사용합시다.
Reference
이 문제에 관하여(레벨에 따라 게임의 난이도를 변경하는 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/drfters/items/3897b248f11dc264978c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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;
}
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.csusing 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.csusing System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GarbagersSystem : MonoBehaviour {
[SerializeField]
LevelInfoUI _levelInfo;
[SerializeField]
GVPressureInfoList _pressureInfo;
...
인스펙터에 방금 전의 메뉴로부터 만든 데이터를 드래그&드롭 하면 데이터가 들어가므로, 사용합시다.
Reference
이 문제에 관하여(레벨에 따라 게임의 난이도를 변경하는 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/drfters/items/3897b248f11dc264978c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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 ();
}
}
일반적으로 MonoBehaviour는 Inspector에서 설정할 수 있습니다.
GarbagersSystem.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GarbagersSystem : MonoBehaviour {
[SerializeField]
LevelInfoUI _levelInfo;
[SerializeField]
GVPressureInfoList _pressureInfo;
...
인스펙터에 방금 전의 메뉴로부터 만든 데이터를 드래그&드롭 하면 데이터가 들어가므로, 사용합시다.
Reference
이 문제에 관하여(레벨에 따라 게임의 난이도를 변경하는 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/drfters/items/3897b248f11dc264978c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)