Unityã§è€æ°ã®ã·ãŒã³ãæäœããã®ã¯é£ããå Žåãããããã®ã¯ãŒã¯ãããŒãæé©åãããšãã²ãŒã ã®ããã©ãŒãã³ã¹ãšããŒã ã®çç£æ§ã®äž¡æ¹ã«å€§ããªåœ±é¿ããããŸãã仿¥ã¯ããã倧ããªãããžã§ã¯ãã«æ¡åŒµã§ããSceneã§ã¯ãŒã¯ãããŒãèšå®ããããã®ãã³ãã玹ä»ããŸãã
ã»ãšãã©ã®ã²ãŒã ã«ã¯è€æ°ã®ã¬ãã«ããããã¬ãã«ã«ã¯è€æ°ã®ã·ãŒã³ãå«ãŸããŠããããšããããããŸããã·ãŒã³ãæ¯èŒçå°ããã²ãŒã ã§ã¯ããã¬ããã䜿çšããŠã·ãŒã³ãããŸããŸãªéšåã«åå²ã§ããŸãããã ããã²ãŒã äžã«ããããæ¥ç¶ãŸãã¯ã€ã³ã¹ã¿ã³ã¹åããã«ã¯ãããããã¹ãŠã®ãã¬ãããåç §ããå¿ èŠããããŸããããã¯ãã²ãŒã ã倧ãããªãããããã®ãªã³ã¯ãããå€ãã®ã¡ã¢ãªã¹ããŒã¹ãå æããã«ã€ããŠãã·ãŒã³ã®äœ¿çšãããå¹ççã«ãªãããšãæå³ããŸãã
ã¬ãã«ã1ã€ä»¥äžã®Unityã·ãŒã³ã«åå²ã§ããŸãããããã管çããããã®æè¯ã®æ¹æ³ãèŠã€ããããšãéèŠãªãã€ã³ãã«ãªããŸãããã«ãã·ãŒã³ç·šéæ©èœã䜿çšããŠããšãã£ã¿ãŒã§äžåºŠã«è€æ°ã®ã·ãŒã³ãéãããšãã§ããŸããã¬ã€ã€ãŒãè€æ°ã®ã·ãŒã³ã«åå²ãããšãGitãSVNãUnity Collaborateãªã©ã®ã³ã©ãã¬ãŒã·ã§ã³ããŒã«ã§ã®ããŒãžã®ç«¶åãåé¿ããããããããŒã ã¯ãŒã¯ã容æã«ãªããŸãã
è€æ°ã®ã·ãŒã³ã管çããŠã¬ãã«ãäœæãã
以äžã®ãããªã§ã¯ãã²ãŒã ããžãã¯ãšã¬ãã«ã®ããŸããŸãªéšåãè€æ°ã®åå¥ã®Unityã·ãŒã³ã«åå²ããããšã«ãããã¬ãã«ãããå¹ççã«ããŒãããæ¹æ³ã瀺ããŸããæ¬¡ã«ããããã®ã·ãŒã³ãããŒããããšãã«Additive Scene-loadingã¢ãŒãã䜿çšããŠãã©ãã«ãè¡ããªãã²ãŒã ããžãã¯ãšãšãã«ãå¿ èŠãªããŒããããŒãããã³ã¢ã³ããŒãããŸãããã¬ãããã·ãŒã³ã®ã¢ã³ã«ãŒãšããŠäœ¿çšããŸããåã·ãŒã³ã¯ã¬ãã«ã®äžéšã§ãããåå¥ã«ç·šéã§ãããããããŒã ã§äœæ¥ãããšãã«ãæè»æ§ããããŸãã
ãããã®ã·ãŒã³ãç·šéã¢ãŒãã§ããŒããããã€ã§ã[åç]ãæŒããŠãã¬ãã«ãã¶ã€ã³ã®äœæ¥äžã«ãããããã¹ãŠäžç·ã«ã¬ã³ããªã³ã°ããããšãã§ããŸãã
ãããã®ã·ãŒã³ãããŒãããããã®2ã€ã®ç°ãªãæ¹æ³ã瀺ããŸãã1ã€ç®ã¯è·é¢ã«åºã¥ããŠããããªãŒãã³ã¯ãŒã«ããªã©ã®éå éšã¬ãã«ã§ããŸãæ©èœããŸãããã®ææ³ã¯ãããŒããšã¢ã³ããŒãã®ããã»ã¹ãé ãããã®èŠèŠå¹æïŒé§ãªã©ïŒã«ã圹ç«ã¡ãŸãã
2çªç®ã®æ¹æ³ã§ã¯ãããªã¬ãŒã䜿çšããŠãããŒãããå¿ èŠã®ããã·ãŒã³ã確èªããŸããããã¯ãã€ã³ããªã¢ãæäœããå Žåã«ããå¹ççã§ãã
ã¬ãã«å ã®ãã¹ãŠãææ¡ããã®ã§ãã¬ãã«èªäœãããé©åã«ç®¡çããããã«ããã®äžã«ã¬ã€ã€ãŒã远å ã§ããŸãã
ScriptableObjectsã§è€æ°ã®ã²ãŒã ã¬ãã«ãå¶åŸ¡ãã
ã²ãŒã ãã¬ã€å šäœãéããŠãåã¬ãã«ã®ããŸããŸãªã·ãŒã³ã ãã§ãªãããã¹ãŠã®ã¬ãã«ã远跡ããããšèããŠããŸãããããå®çŸãã1ã€ã®å¯èœãªæ¹æ³ã¯ãMonoBehaviourã¹ã¯ãªããã§éç倿°ãšã·ã³ã°ã«ããŒã³ã䜿çšããããšã§ããããã®ãœãªã¥ãŒã·ã§ã³ã¯ããã»ã©ã¹ã ãŒãºã§ã¯ãããŸãããã·ã³ã°ã«ãã³ã䜿çšããããšã¯ãã·ã¹ãã éã®ç·å¯ãªãªã³ã¯ãæå³ãããããå³å¯ã«ã¢ãžã¥ãŒã«åãããŠããããã§ã¯ãããŸãããã·ã¹ãã ã¯åå¥ã«ååšããããšã¯ã§ãããåžžã«çžäºã«äŸåããŸãã
ãã1ã€ã®åé¡ã¯ãéç倿°ã®äœ¿çšã«é¢é£ããŠããŸããã€ã³ã¹ãã¯ã¿ãŒã§ã¯è¡šç€ºãããªããããã³ãŒãã§å®çŸ©ããå¿ èŠããããã¢ãŒãã£ã¹ããã¬ãã«ãã¶ã€ããŒãã²ãŒã ããã¹ãããã®ãé£ãããªããŸããç°ãªãã·ãŒã³éã§ããŒã¿ãå ±æããå¿ èŠãããå Žåã¯ãéç倿°ãDontDestroyOnLoadãšçµã¿åãããŠäœ¿çšââããŸãããåŸè ã¯å¯èœãªéãé¿ããå¿ èŠããããŸãã
ããŸããŸãªã·ãŒã³ã«é¢ããæ å ±ãä¿åããã«ã¯ãäž»ã«ããŒã¿ã®ä¿åã«äœ¿çšãããã·ãªã¢ã«åå¯èœãªã¯ã©ã¹ã§ããScriptableObjectã䜿çšã§ããŸãã GameObjectsã«ãã€ã³ããããã³ã³ããŒãã³ããšããŠäœ¿çšãããMonoBehaviourã¹ã¯ãªãããšã¯ç°ãªããScriptableObjectsã¯ã©ã®GameObjectã«ããã€ã³ããããŠããªãããããããžã§ã¯ãå šäœã®ããŸããŸãªã·ãŒã³ã§äœ¿çšã§ããŸãã
ãã®æ§é ãã²ãŒã ã®ã¬ãã«ãã¡ãã¥ãŒã·ãŒã³ã«äœ¿çšã§ãããšäŸ¿å©ã§ãããããè¡ãã«ã¯ãã¬ãã«ãšã¡ãã¥ãŒã®ããŸããŸãªäžè¬ããããã£ãå«ãGameSceneã¯ã©ã¹ãäœæããŸãã
public class GameScene : ScriptableObject
{
[Header("Information")]
public string sceneName;
public string shortDescription;
[Header("Sounds")]
public AudioClip music;
[Range(0.0f, 1.0f)]
public float musicVolume;
[Header("Visuals")]
public PostProcessProfile postprocess;
}
ã¯ã©ã¹ã¯MonoBehaviourã§ã¯ãªãScriptableObjectãç¶æ¿ããããšã«æ³šæããŠãã ãããã²ãŒã ã«å¿ èŠãªæ°ã®ããããã£ã远å ã§ããŸãããã®æé ã®åŸãäœæããGameSceneã¯ã©ã¹ããç¶æ¿ããLevelã¯ã©ã¹ãšMenuã¯ã©ã¹ãäœæã§ãããããããããScriptableObjectsã«ãªããŸãã
[CreateAssetMenu(fileName = "NewLevel", menuName = "Scene Data/Level")]
public class Level : GameScene
{
// ,
[Header("Level specific")]
public int enemiesCount;
}
äžéšã«CreateAssetMenu 屿§ã远å ãããšãUnityã®[è³ç£]ã¡ãã¥ãŒããæ°ããã¬ãã«ãäœæã§ããŸããMenuã¯ã©ã¹ã«ã€ããŠãåãããšãã§ããŸããåæã远å ããŠãã€ã³ã¹ãã¯ã¿ãŒããã¡ãã¥ãŒã¿ã€ããéžæã§ããããã«ããããšãã§ããŸãã
public enum Type
{
Main_Menu,
Pause_Menu
}
[CreateAssetMenu(fileName = "NewMenu", menuName = "Scene Data/Menu")]
public class Menu : GameScene
{
// ,
[Header("Menu specific")]
public Type type;
}
ã¬ãã«ãšã¡ãã¥ãŒãäœæã§ããããã«ãªã£ãã®ã§ã䟿å®äžããããïŒã¬ãã«ãšã¡ãã¥ãŒïŒããªã¹ãããããŒã¿ããŒã¹ã远å ããŸããããã€ã³ããã¯ã¹ã远å ããŠããã¬ãŒã€ãŒã®çŸåšã®ã¬ãã«ã远跡ããããšãã§ããŸããæ¬¡ã«ãã¡ãœããã远å ããŠãæ°ããã²ãŒã ãããŒããïŒãã®å Žåãæåã®ã¬ãã«ãããŒããããŸãïŒãçŸåšã®ã¬ãã«ãç¹°ãè¿ããæ¬¡ã®ã¬ãã«ã«é²ãããšãã§ããŸãããããã®3ã€ã®ã¡ãœããã§ã¯ã€ã³ããã¯ã¹ã®ã¿ã倿Žããããããã€ã³ããã¯ã¹ããšã«ã¬ãã«ãããŒãããŠåå©çšããã¡ãœãããäœæã§ããããšã«æ³šæããŠãã ããã
[CreateAssetMenu(fileName = "sceneDB", menuName = "Scene Data/Database")]
public class ScenesData : ScriptableObject
{
public List<Level> levels = new List<Level>();
public List<Menu> menus = new List<Menu>();
public int CurrentLevelIndex=1;
/*
*
*/
//
public void LoadLevelWithIndex(int index)
{
if (index <= levels.Count)
{
//
SceneManager.LoadSceneAsync("Gameplay" + index.ToString());
//
SceneManager.LoadSceneAsync("Level" + index.ToString() + "Part1", LoadSceneMode.Additive);
}
// ,
else CurrentLevelIndex =1;
}
//
public void NextLevel()
{
CurrentLevelIndex++;
LoadLevelWithIndex(CurrentLevelIndex);
}
//
public void RestartLevel()
{
LoadLevelWithIndex(CurrentLevelIndex);
}
// ,
public void NewGame()
{
LoadLevelWithIndex(1);
}
/*
*
*/
//
public void LoadMainMenu()
{
SceneManager.LoadSceneAsync(menus[(int)Type.Main_Menu].sceneName);
}
//
public void LoadPauseMenu()
{
SceneManager.LoadSceneAsync(menus[(int)Type.Pause_Menu].sceneName);
}
ã¡ãã¥ãŒã¡ãœããããããåã«äœæããåæåã䜿çšããŠãå¿ èŠãªç¹å®ã®ã¡ãã¥ãŒãããŒãã§ããŸããåæå ã®é åºãšã¡ãã¥ãŒãªã¹ãå ã®é åºãåãã§ããããšã確èªããŠãã ããã
æåŸã«ããããžã§ã¯ããŠã£ã³ããŠãå³ã¯ãªãã¯ããŠã[ã¢ã»ãã]ã¡ãã¥ãŒããããŒã¿ããŒã¹ã¬ãã«ãã¡ãã¥ãŒããŸãã¯ScriptableObjectãäœæã§ããããã«ãªããŸããã
ãããããå¿ èŠãªã¬ãã«ãšã¡ãã¥ãŒã远å ãããã©ã¡ãŒã¿ãŒã調æŽããŠãããã·ãŒã³ããŒã¿ããŒã¹ã«è¿œå ããŸãã以äžã®äŸã¯ãLevel1ãMainMenuãããã³ScenesããŒã¿ãã©ã®ããã«èŠãããã瀺ããŠããŸãã
ãããã®ã¡ãœãããåŒã³åºãæãæ¥ãŸããããã®äŸã§ã¯ããã¬ãŒã€ãŒãã¬ãã«ã®æåŸã«å°éãããšãã«è¡šç€ºããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ïŒUIïŒã®[次ã®ã¬ãã«]ãã¿ã³ãNextLevelã¡ãœãããåŒã³åºããŸããã¡ãœããããã¿ã³ã«ãã€ã³ãããã«ã¯ããã¿ã³ã³ã³ããŒãã³ãã®ã¯ãªãã¯æã€ãã³ããšãã¿ã³ã³ã³ããŒãã³ãã®ãã¿ã³ãã¯ãªãã¯ããŠæ°ããã€ãã³ãã远å ããæ¬¡ã«ç€ºãããã«ãã·ãŒã³ããŒã¿ScriptableObjectããªããžã§ã¯ããã£ãŒã«ãã«ãã©ãã°ããSceneDataããNextLevelã¡ãœãããéžæããŸãã
ããã§ãä»ã®ãã¿ã³ã«å¯ŸããŠåãããã»ã¹ãå®è¡ã§ããŸããã¬ãã«ãåçããããã¡ã€ã³ã¡ãã¥ãŒã«ç§»åããŸããä»ã®ã¹ã¯ãªããããScriptableObjectãåç §ããŠãèæ¯é³æ¥œã®AudioClipãåŸåŠçãããã¡ã€ã«ãªã©ã®ããŸããŸãªããããã£ã«ã¢ã¯ã»ã¹ããããããã¬ãã«ã§äœ¿çšããããšãã§ããŸãã
ããã»ã¹ã®ãšã©ãŒãæå°éã«æããããã®ãã³ã
ããŒã/
ã¢ã³ããŒãã®æå°åãããªã«ç€ºãããŠããScenePartLoaderã¹ã¯ãªããã§ã¯ããã¬ãŒã€ãŒãã³ã©ã€ããŒã«äœåºŠãåºå ¥ããç¶ããã·ãŒã³ããªããŒãããã³ã¢ã³ããŒãã§ããããšãããããŸãããããåé¿ããã«ã¯ãã¹ã¯ãªããã§ã·ãŒã³ã®ããŒãããã³ã¢ã³ããŒãã¡ãœãããåŒã³åºãåã«ã³ã«ãŒãã³ã远å ãããã¬ãŒã€ãŒãããªã¬ãŒãé¢ããå Žåã«ã³ã«ãŒãã³ã忢ããŸãã
åœåèŠå
ãã1ã€ã®ã°ããŒãã«ãªãã³ãã¯ããããžã§ã¯ãã§åŒ·åãªåœåèŠåã䜿çšããããšã§ããããŒã ã¯ãã¹ã¯ãªãããã·ãŒã³ããããããžã§ã¯ãå ã®ãããªã¢ã«ããã®ä»ã®ãã®ãŸã§ãããŸããŸãªã¿ã€ãã®ã¢ã»ããã«ååãä»ããæ¹æ³ã«ã€ããŠäºåã«åæããå¿ èŠããããŸããããã«ããããããžã§ã¯ãã§ã®äœæ¥ã容æã«ãªããããªãã ãã§ãªãããŒã ã¡ãŒãããããžã§ã¯ãããµããŒãã§ããããã«ãªããŸããããã¯åžžã«è¯ãèãã§ããããã®ç¹å®ã®ã±ãŒã¹ã§ã¯ãScriptableObjectsã䜿çšããŠã·ãŒã³ã管çããããã«éåžžã«éèŠã§ãããã®äŸã§ã¯ãåçŽãªã·ãŒã³åããŒã¹ã®ã¢ãããŒãã䜿çšããŸããããã·ãŒã³åã«ããŸãäŸåããªãããŸããŸãªãœãªã¥ãŒã·ã§ã³ããããŸãããã®ã³ã³ããã¹ãã§Unityã·ãŒã³ã®ååã倿Žãããšããã®ã·ãŒã³ã¯ã²ãŒã ã®ä»ã®å Žæã«èªã¿èŸŒãŸããªããããæååããŒã¹ã®ã¢ãããŒãã¯é¿ããŠãã ããã
ç¹å¥ãªããŒã«
ã²ãŒã å šäœã§ååã«äŸåããªãããã«ãã1ã€ã®æ¹æ³ã¯ãã·ãŒã³ãObjectåãšããŠåç §ããããã«ã¹ã¯ãªãããæ§æããããšã§ããããã«ãããã·ãŒã³ãªãœãŒã¹ãã€ã³ã¹ãã¯ã¿ãŒã«ãã©ãã°ã¢ã³ãããããããŠãã¹ã¯ãªããã§ãã®ååãéãã«ååŸã§ããŸãããã ããããã¯Editorã¯ã©ã¹ã§ãããããå®è¡æã«AssetDatabaseã¯ã©ã¹ã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããããããã£ãŠããšãã£ã¿ãŒã§æ©èœãã人çãšã©ãŒãé²ããå®è¡æã«æ©èœãããœãªã¥ãŒã·ã§ã³ãäœæããã«ã¯ãäž¡æ¹ã®ããŒã¿ãçµã¿åãããå¿ èŠããããŸããã·ãªã¢ã«ååŸã«Sceneã¢ã»ããããæååãã¹ãååŸããŠå®è¡æã«äœ¿çšã§ããããã«ä¿åã§ãããªããžã§ã¯ããå®è£ ããæ¹æ³ã®äŸã«ã€ããŠã¯ãISerializationCallbackReceiverã€ã³ã¿ãŒãã§ã€ã¹ãåç §ããŠãã ããã
ãŸãã¯ãç¬èªã®ã€ã³ã¹ãã¯ã¿ãŒãäœæããŠããã®ã¡ãã¥ãŒããæåã§ã·ãŒã³ã远å ããŠåæãç¶æãã代ããã«ããã¿ã³ã䜿çšããŠãã«ãèšå®ã«ã·ãŒã³ããã°ããç°¡åã«è¿œå ã§ããããã«ããããšãã§ããŸãã
ãã®ã¿ã€ãã®ããŒã«ã®äŸã«ã€ããŠã¯ãéçºè JohannesMPã«ãããã®çŽ æŽããããªãŒãã³ãœãŒã¹ã®å®è£ ã確èªããŠãã ããïŒããã¯å ¬åŒã®UnityãªãœãŒã¹ã§ã¯ãããŸããïŒã
ãæèŠããèãããã ãã
ãã®æçš¿ã¯ããã¬ãããšçµã¿åãããŠè€æ°ã®ã·ãŒã³ãæäœãããšãã«ScriptableObjectsãã¯ãŒã¯ãããŒãæ¹åã§ãã1ã€ã®æ¹æ³ã®ã¿ã瀺ããŠããŸããã²ãŒã ãç°ãªãã°ãã·ãŒã³ãå¶åŸ¡ããæ¹æ³ããŸã£ããç°ãªããŸããåäžã®ãœãªã¥ãŒã·ã§ã³ããã¹ãŠã®ã²ãŒã æ§é ã«äžåºŠã«é©åããããã§ã¯ãããŸããããããžã§ã¯ãçµç¹ã«åãããŠç¬èªã®ããŒã«ãå®è£ ããããšã¯çã«ããªã£ãŠããŸãã
ãã®æ å ±ããããžã§ã¯ãã«åœ¹ç«ã€ããç¬èªã®ã·ãŒã³ç®¡çããŒã«ãäœæãããã£ããã«ãªãããšãé¡ã£ãŠããŸãã
ãäžæãªç¹ãããããŸããããã³ã¡ã³ãã§ãç¥ãããã ãããã²ãŒã ã®ã·ãŒã³ãæäœããããã«ã©ã®ãããªãã¯ããã¯ã䜿çšããŠããã®ãèããŠã¿ããã§ãããŸããä»åŸã®æçš¿ã§æ€èšããããã«ææ¡ãããä»ã®ãŠãŒã¹ã±ãŒã¹ãèªç±ã«ææ¡ããŠãã ããã