ºÇ½ª¹¹¿·¡§
orika_ex_miyako 2025ǯ04·î25Æü(¶â) 09:10:30ÍúÎò
¡¡¥¿¥¯¥Æ¥£¥«¥ë¥Ð¥È¥ë(¥·¥ß¥å¥ì¡¼¥·¥ç¥ó)¥²¡¼¥à³«È¯¤Ë¤ª¤¤¤Æ¡¢¡Ö°Üư¥¿¥¤¥×¡×¤ò½ÀÆð¤Ë´ÉÍý¤·¤¿¤¤¤È¤¤¤¦Í×˾¤ÏÈó¾ï¤Ë¿¤¤¤È»×¤¤¤Þ¤¹¡£
¥¿¥¤¥ë¥Þ¥Ã¥×(Tilemap)¤òÍøÍѤ·¤¿¼ÂÁõ¤Ë¤â¤ª¤¤¤Æ¤â¡¢¤¤Ã¤ÈƱ¤¸Çº¤ß¤¬¤¢¤ë¤Ç¤·¤ç¤¦¡£
¡¡¤¿¤È¤¨¤Ð¡¢Êâʼ¡¢µ³Ê¼¡¢Èô¹Ôʼ¤Ê¤É¤Î¡Öʼ¼ï¡×¤Ë¤è¤ë¤â¤Î¡¢¤¢¤ë¤¤¤Ï·ÚÊâ¡¢ÆßÊâ¡¢Èô¹Ô¤Ê¤É¤Î¡ÖÊâ¹Ô¥¿¥¤¥×¡×¤Ë¤è¤ë¤â¤Î¤Ê¤É¡¢¥²¡¼¥àÆâÍÆ¤Ë¤è¤êÍÍ¡¹¤Ê¡Ö°Üư¥¿¥¤¥×¡×¤¬¤¢¤ë¤È»×¤¤¤Þ¤¹¡£
²Ã¤¨¤ÆÃÏ·Á¤Î±Æ¶Á¤ò¼õ¤±¤ë¤«¤É¤¦¤«¤Ç½èÍý¤¬ÊѤï¤ë(°ÜưÈϰϤ¬ÊѤï¤ë)¤¿¤á¡¢¤½¤ì¤¾¤ì¤Ë±þ¤¸¤¿°Üư¥í¥¸¥Ã¥¯¤òÍѰդ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
Î㤨¤Ð¡¢¿åÊդˤϿ¯Æþ¤Ç¤¤Ê¤¤Ê¼¼ï¤¬¤¢¤ë¡¢»³¤òÄ̲᤹¤ë¤Ë¤Ï°Üư¥³¥¹¥È¤¬Â¿¤¯¤«¤«¤ëʼ¼ï¤¬¤¢¤ë¡¢¤È¤¤¤Ã¤¿¥±¡¼¥¹¤Ç¤¹¡£
¡¡¤³¤Î¤è¤¦¤ÊÀ߷פˤª¤¤¤Æ¤Ï¡¢enum ¤È switch ʸ¤Ë¤è¤ëʬ´ô¤Ë¤è¤ë¼ÂÁõ¤¬Â¿¤¤¤«¤È»×¤¤¤Þ¤¹¡£
¡¡Ëܵ»ö¤Ç¤ÏÂå¤ï¤ê¤Ë¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤òÍѤ¤¤¿³ÈÄ¥À¤Î¹â¤¤¼ÂÁõ¤È¡¢¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤ò³èÍѤ·¤Æ·¿¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òưŪ¤ËÀ¸À®¤¹¤ëÊýË¡(¥Õ¥¡¥¯¥È¥ê¡¼¥Ñ¥¿¡¼¥ó(Simple Factory))¤ò¾Ò²ð¤·¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢switch ʸ¤ò»È¤ï¤Ê¤¤¡¢Êѹ¹¤Ë¶¯¤¤À߷פ¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡¤³¤Îµ»ö¤Ç¤Ï¡¢¥¿¥¤¥ë¥Þ¥Ã¥×¤òÍøÍѤ¹¤ëÁ°Äó¤Ç¡¢°Üư¥¿¥¤¥×¤Ïʼ¼ï¤ò¥Ù¡¼¥¹¤Ë¿Ê¤á¤Æ¤¤¤¤Þ¤¹¡£
¡¡¤Þ¤ºÊ¼¼ï¤Ë¤Ä¤¤¤Æ¡¢MoveTypeEnum ¤È¤¤¤¦ enum ·¿¤òÍѰդ·¤Æ¤ª¤¤Þ¤¹¡£Ê¼¼ï¤¬Áý¤¨¤¿ºÝ¤Ë¤ÏÎóµó»Ò¤ÎÄɲäò¹Ô¤¤¤Þ¤¹¡£
¤½¤ì¤ò CharaData ¥¯¥é¥¹Æâ¤Ë MoveTypeEnum ¤È¤¤¤¦ enum ·¿¤ÎÊÑ¿ô¤È¤·¤ÆÀë¸À¤µ¤ì¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£
MoveTypeEnum.cs
/// <summary> /// ʼ¼ï¤Î¼ïÎà /// </summary> public enum MoveTypeEnum { Infantry, // Êâʼ Cavalry, // µ³Ê¼ Flying // Èô¹Ôʼ ¡¡¡¡// TODO ʼ¼ï¤¬Áý¤¨¤¿¤ê¸º¤Ã¤¿¤ê¤·¤¿¤éÄɲᦽ¤Àµ¤¹¤ë }
CharaData.cs(È´¿è)
/// <summary> /// ¥¥ã¥é¤Î¥Ç¡¼¥¿ /// </summary> using System.Collections.Generic; [System.Serializable] public class CharaData { public int charaId; public int movePower; // °ÜưÎÏ public string name; public MoveTypeEnum moveType; // °Üư¥¿¥¤¥× }
¡¡¤µ¤ÆÊ¼¼ï¤´¤È¤Ë°Û¤Ê¤ë°Üư¥ë¡¼¥ë¤È¤·¤Æ¡¢Ê¼¼ï¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤Ê°ã¤¤¤¬¤¢¤ë¤È¤·¤Þ¤¹¡£
¡ã²¾¤ÎÀßÄê¡ä
¡¡¡¦Êâʼ¡§»³¤ÏÄ̤ì¤Ê¤¤ ¡¡¡¦µ³Ê¼¡§¿¹¤Ç°Üư¥³¥¹¥È¤¬¾å¤¬¤ë ¡¡¡¦Èô¹Ôʼ¡§¤¹¤Ù¤Æ¤ÎÃÏ·Á¤ò̵»ë¤·¤Æ°Üư¤Ç¤¤ë
¡¡¤³¤Á¤é¤ÎÍ×·ï¤òËþ¤¿¤¹¤¿¤á¡¢switch ʸ¤È enum ¤òÁȤ߹ç¤ï¤»¤¿ÊýË¡¤Î¼ÂÁõÎã¤Ç¤¹¡£
// ¥¥ã¥é¤Î°Üư¥¿¥¤¥×¤ò¸«¤ÆÈ½Äê switch (charaData.moveType) { // Êâʼ¤Î¾ì¹ç case MoveTypeEnum.Infantry: ¡¡¡¡¡¡¡¡// Êâʼ¤Î°Üư²Äǽ¤Ê¥¿¥¤¥ë¤ä¡¢°Üư¥³¥¹¥È¤ò»»½Ð(»³¤ÏÄ̤ì¤Ê¤¤) break; // µ³Ê¼¤Î¾ì¹ç ¡¡¡¡case MoveTypeEnum.Cavalry: ¡¡¡¡¡¡¡¡// µ³Ê¼¤Î°Üư²Äǽ¤Ê¥¿¥¤¥ë¤ä¡¢°Üư¥³¥¹¥È¤ò»»½Ð(¿¹¤Ç°Üư¥³¥¹¥È¤¬¾å¤¬¤ë) break; ¡¡¡¡// Èô¹Ôʼ¤Î¾ì¹ç case MoveType.Flying: ¡¡¡¡¡¡¡¡// Èô¹Ôʼ¤Î°Üư²Äǽ¤Ê¥¿¥¤¥ë¤ä¡¢°Üư¥³¥¹¥È¤ò»»½Ð(¤¹¤Ù¤Æ¤ÎÃÏ·Á¤ò̵»ë¤·¤Æ°Üư¤Ç¤¤ë) break; // TODO ¤â¤·¤â°Üư¥¿¥¤¥×¤¬Äɲ䵤줿¤é¡¢¤³¤³¤ËÄɲ䷤Ƥ¤¤¯ }
¡¡¤³¤Î¤è¤¦¤Ë enum ¤È switch ¤ò»È¤Ã¤¿¾ì¹ç¡¢¿·¤·¤¤°Üư¥¿¥¤¥×¤ÎÄɲᦺï½ü¤Î¤¿¤Ó¤Ë¡¢switchʸ(·×»»¥í¥¸¥Ã¥¯)¤ò½¤Àµ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¡¡¤Þ¤¿¤³¤ì¤Ï»Äǰ¤Ê¤¬¤é¡Ö¥ª¡¼¥×¥ó/¥¯¥í¡¼¥º¥É¸¶Â§¡×¤ËÈ¿¤·¤Æ¤·¤Þ¤Ã¤Æ¤¤¤Þ¤¹¡£¡Ê¥³¡¼¥É¤Ï³ÈÄ¥¤Ë³«¤«¤ì¡¢½¤Àµ¤ËÊĤ¸¤Æ¤¤¤ë¤Ù¤¡Ë
¡¡¤³¤¦¤¤¤Ã¤¿¥±¡¼¥¹¤Ë¤ª¤¤¤Æ¤Ï¡¢¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò³èÍѤ¹¤ë¤³¤È¤Ç¡¢³ÈÄ¥À¤òÊݤÁ¤Ä¤Ä¡¢ÀÕ̳¤òʬΥ¤·¤¿·Á¤ÇÀ߷פȼÂÁõ¤ò¹Ô¤¦¤³¤È¤¬²Äǽ¤Ç¤¹¡£
¡¡º£²ó¤Ï IMoveType ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤òºîÀ®¤·¡¢£²¤Ä¤Î¥á¥½¥Ã¥É¤òÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£
¤Þ¤¿¤³¤³¤Ç¤Ï¥¿¥¤¥ë¥Þ¥Ã¥×ÍѤΥ¯¥é¥¹¤È¤·¤Æ¡¢Ê̤ε»ö¤Ë¤¢¤ë AdvancedTile ¥¯¥é¥¹¤òÍøÍѤ·¤Æ¤¤¤Þ¤¹¡£
¡¡¡¡¢ª¡¡Tilemap ¤Î°Üư¥³¥¹¥È´ÉÍýÊýË¡Îã
IMoveType.cs
using UnityEngine.Tilemaps; /// <summary> /// ³ÆÊ¼¼ï¤Î°Üư¥¿¥¤¥×¤¬¼ÂÁõ¤¹¤ë¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¡£¥¿¥¤¥ë¤¬°Üư²Äǽ¤«¡¢°Üư¥³¥¹¥È¤ò¼èÆÀ¤Ç¤¤ë¡£ /// </summary> public interface IMoveType { /// <summary> /// »ØÄ꥿¥¤¥ë¤Ë¿¯Æþ¤Ç¤¤ë¤«¤É¤¦¤«¤òÊÖ¤·¤Þ¤¹¡£ /// </summary> /// <param name="tile">Âоݥ¿¥¤¥ë</param> /// <returns>¿¯Æþ²Äǽ¤«</returns> bool IsWalkable(TileBase tile); /// <summary> /// ¥¿¥¤¥ë¤Ë¿¯Æþ¤¹¤ëºÝ¤Î°Üư¥³¥¹¥È¤òÊÖ¤·¤Þ¤¹¡£ /// </summary> /// <param name="tile">Âоݥ¿¥¤¥ë</param> /// <returns>°Üư¥³¥¹¥È</returns> int GetMoveCost(TileBase tile); }
¡¡¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ç¤Ï¥á¥½¥Ã¥É¤ÎÆâÉô¼ÂÁõ¤Ï¹Ô¤¤¤Þ¤»¤ó¡£³Æ¥¯¥é¥¹¤Ë¤ª¤¤¤Æ¿¶¤ëÉñ¤¤¤òÊѤ¨¤ë·Á¤Ç½ñ¤¤Þ¤¹¡£
¡¡¤³¤Á¤é¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤¿¥¯¥é¥¹¤ò¡¢°Üư¥¿¥¤¥×¤Î¿ô¤À¤±ºîÀ®¤·¤Æ¡¢¤½¤Á¤é¤Ë°Üư¥¿¥¤¥×¤´¤È¤Î½èÍý¤ò¼ÂÁõ¤¹¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢Êâʼ¤äÈô¹Ôʼ¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤½¤ì¤¾¤ì¤Î¥¯¥é¥¹¤È¤·¤ÆÄêµÁ¤Ç¤¤Þ¤¹¡£
using UnityEngine.Tilemaps; public class InfantryMoveType : IMoveType { public bool IsWalkable(TileBase tile) { ¡¡¡¡¡¡¡¡// tile ÊÑ¿ô¤Î·¿¤¬ AdvancedTile ¥¯¥é¥¹¤Ç¤¢¤ë¾ì¹ç if (tile is AdvancedTile advTile) { // »³¤ÏÊâʼ¤ÏÄ̤ì¤Ê¤¤¡¢¤½¤ì°Ê³°¤ÏÄ̤ì¤ë return advTile.terrainType != TerrainType.Mountain; } return false; } public int GetMoveCost(TileBase tile) { ¡¡¡¡¡¡¡¡// tile ÊÑ¿ô¤Î·¿¤¬ AdvancedTile ¥¯¥é¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç ¡¡¡¡¡¡¡¡if (tile is not AdvancedTile advTile) { ¡¡¡¡return 1; ¡¡¡¡¡¡ } ¡¡ return advTile.terrainType switch { TerrainType.Plain => 1, TerrainType.Water => 1, TerrainType.Forest => 2, TerrainType.Mountain => 999, // Ä̤ì¤Ê¤¤°·¤¤ _ => 1, }; } }
using UnityEngine.Tilemaps; public class CavalryMoveType : IMoveType { ¡¡¡¡public bool IsWalkable(TileBase tile) { ¡¡¡¡¡¡¡¡// tile ÊÑ¿ô¤Î·¿¤¬ AdvancedTile ¥¯¥é¥¹¤Ç¤¢¤ë¾ì¹ç ¡¡¡¡if (tile is AdvancedTile advTile) { ¡¡¡¡// ¤É¤ÎÃÏ·Á¤âÄ̤ì¤ë ¡¡¡¡return true; ¡¡¡¡} ¡¡¡¡} public int GetMoveCost(TileBase tile) { ¡¡¡¡¡¡¡¡// tile ÊÑ¿ô¤Î·¿¤¬ AdvancedTile ¥¯¥é¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç ¡¡¡¡¡¡¡¡if (tile is not AdvancedTile advTile) { ¡¡¡¡return 1; ¡¡¡¡¡¡ } ¡¡ return advTile.terrainType switch { TerrainType.Plain => 1, TerrainType.Water => 1, TerrainType.Forest => 2, TerrainType.Mountain => 1, _ => 1, }; } }
¡¡¤³¤Á¤é¤Î¤ß°ú¿ô¤ò AdvancedTile ¤Ë¤·¤Æ¡¢½èÍýÆâÉô¤ò´Ê·é²½¤·¤Æ¤¤¤Þ¤¹¤¬¡¢¤Û¤«¤Î MoveType ¤ÈƱ¤¸¤è¤¦¤Ë¤â½ñ¤±¤Þ¤¹¡£
FlyingMoveType.cs
public class FlyingMoveType : IMoveType { public bool IsWalkable(AdvancedTile tile) => true; // Èô¹Ô¤Ï¤¹¤Ù¤ÆÄ̲á²Äǽ public int GetMoveCost(AdvancedTile tile) => 1; // Èô¹Ô¤Ï¾ï¤Ë1¥³¥¹¥È }
¡¡¤³¤Î¤è¤¦¤Ë¤·¤Æ MoveTypeEnum ¤ÎÎóµó»Ò¤Ë¹ç¤ï¤»¤¿·Á¤Ç¡¢IMoveType ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤¿¥¯¥é¥¹¤òÍѰդ·¤Þ¤¹¡£
¡¡°Üư¥¿¥¤¥×¤Î³Æ¥¯¥é¥¹Ì¾¤Ï¡¢¡ÚMoveTypeEnum Æâ¤ÎÎóµó»Ò¤Î̾Á° ¡Ü MoveType¡Û ¤Î½ñ¼°¤Ç¹ç¤ï¤»¤Æ¤ª¤¤Þ¤¹¡£(MoveType ¤Ï¥¯¥é¥¹Ì¾¤È¹ç¤ï¤»¤ë¤¿¤á¤ËÉÕ¤±¤Æ¤¤¤Þ¤¹¡£)
¤³¤Î¤è¤¦¤Ë½ñ¼°¤òÅý°ì¤·¤Æ¤ª¤¯¤³¤È¤Ç¡¢¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤Îµ¡Ç½¤ò¹ç¤ï¤»¤ÆÍøÍѤ¹¤ë¤³¤È¤¬Íưפˤʤ뤿¤á¤Ç¤¹¡£
¡¡£±¡¥ÀÕ̳¤òʬ¤±¤é¤ì¤ë¡§ ¡¡¡¡¡¡¡¡¡¡Ê¼¼ï¤´¤È¤Î°Üư¥ë¡¼¥ë¤ò¡¢¥¥ã¥é¤ä¥Þ¥Í¡¼¥¸¥ã¡¼¤«¤éÆÈΩ¤·¤Æ´ÉÍý¤Ç¤¤ë¡£
¡¡£²¡¥Êѹ¹¤Ë¶¯¤¤¡§ ¡¡¡¡¡¡¡¡¡¡¿·¤·¤¤Ê¼¼ï¤òÄɲ䷤Ƥ⡢¾¤Î¥³¡¼¥É¤Ë¤Ï°ìÀÚ¼ê¤ò²Ã¤¨¤º¤ËºÑ¤à¡£
¡¡£³¡¥¥Æ¥¹¥È¤¬¤·¤ä¤¹¤¤¡§ ¡¡¡¡¡¡¡¡¡¡¤½¤ì¤¾¤ì¤Î°Üư¥í¥¸¥Ã¥¯¤À¤±¤ò¸ÄÊ̤˥ƥ¹¥È²Äǽ¡£
¡¡£´¡¥¥³¡¼¥É¤¬¸«¤ä¤¹¤¤¡§ ¡¡¡¡¡¡¡¡¡¡switchʸ¤¬ÉÔÍפˤʤꡢ¾ò·ïʬ´ô¤¬¸º¤Ã¤ÆÆÉ¤ß¤ä¤¹¤¯¤Ê¤ë¡£
¡¡¤³¤ÎÀ߷פǤϡ¢¿·¤·¤¤°Üư¥¿¥¤¥×¤¬Áý¤¨¤¿¾ì¹ç¤Ë¤Ï¥×¥í¥°¥é¥à¤ò½¤Àµ¤¹¤ë¤³¤È¤Ï¤»¤º¡¢
IMoveType ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤¿¥¯¥é¥¹¤ò£±¤ÄÄɲ乤ì¤Ð³ÈÄ¥¤¬²Äǽ¤Ç¤¹¡£
¡¡¤Þ¤¿½èÍý¤Î½¤Àµ¤ò¹Ô¤¦¾ì¹ç¤Ë¤â³Æ¥¯¥é¥¹¤Î¤ß¤ÇºÑ¤à¤¿¤á¡¢½¤Àµ¤Ë¤è¤ë±Æ¶ÁÈϰϤòºÇ¾®¸Â¤ËÍÞ¤¨¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡£
¡¡»ý¤¿¤»¤¿¤¤µ¤»ý¤Á¤Ï¤ï¤«¤ê¤Þ¤¹¤¬¡¢¤½¤ì¤Ï¡Öï¤Ë¤È¤Ã¤ÆÄ̤ì¤ë¤Î¤«¡©¡× ¤È¤¤¤¦Ì䤤¤ËÅú¤¨¤é¤ì¤Þ¤»¤ó¡£
¡¡Êâʼ¤Ë¤È¤Ã¤ÆÄ̤ì¤Ê¤¤¾ì½ê¤Ç¤â¡¢Èô¹Ôʼ¤Ï¼«Í³¤Ë°Üư¤Ç¤¤ë¤³¤È¤¬Â¿¤¤¤Ç¤·¤ç¤¦¡£
¤½¤Î¤¿¤á¡¢¥¿¥¤¥ëñÂΤǤÎȽÄê¤Ç¤Ï½ÀÆðÀ¤Ë·ç¤±¤ëÀ߷פˤʤê¤Þ¤¹¡£
¡Ö¤É¤Îʼ¼ï¤¬¤½¤Î¥¿¥¤¥ë¤òÄ̤ì¤ë¤«¡×¤È¤¤¤¦È½ÃǤϡ¢¥¿¥¤¥ë¤Ç¤Ï¤Ê¤¯¡¢Ê¼¼ï¡ÊIMoveType¡Ë¦¤¬»ý¤Ä¤Ù¤ÀÕ̳¤Ç¤¹¡£
¡¡¤è¤Ã¤Æ¡¢¤è¤ê¤è¤¤²ò·èÊýË¡¤È¤·¤Þ¤·¤Æ¤Ï¡¢Ä̹ÔȽÄê¤È¥³¥¹¥È¤Î¥í¥¸¥Ã¥¯¤ò¥¿¥¤¥ë¤«¤éÀÚ¤êÎ¥¤·¡¢Ê¼¼ï¦¡ÊIMoveType ¼ÂÁõ¥¯¥é¥¹¡Ë¤Ë»ý¤¿¤»¤ë¤³¤È¤Ç¡¢ÀÕǤ¤ÎʬΥ¤¬¤Ç¤¤Þ¤¹¡£
¡¡C# ¤Ë¤Ï¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤È¤¤¤¦µ¡Ç½¤¬¤¢¤ê¤Þ¤¹¡£
¤½¤Î£±¤Ä¤Ë¡¢string ·¿¤Îʸ»úÎó¤ò¥¯¥é¥¹Ì¾(·¿Ì¾)¤ËÃÖ¤´¹¤¨¤Æ¡¢Æ±Ì¾¤Î·¿¾ðÊó¤¬¥×¥í¥¸¥§¥¯¥ÈÆâ¤Ë¸ºß¤¹¤ë¾ì¹ç¤Ë¤Ï
¥¤¥ó¥¹¥¿¥ó¥¹¤òưŪ¤ËÀ¸À®¤¹¤ë Activator.CreateInstance ¥á¥½¥Ã¥É¤¬ÍѰդµ¤ì¤Æ¤¤¤Þ¤¹¡£
¡¡º£²ó¤Î¤è¤¦¤Ëʼ¼ï¤ò enum(¤¢¤ë¤¤¤Ï string)¤È¤·¤Æ»ý¤Ã¤Æ¤¤¤ë¾ì¹ç¡¢°Ê²¼¤Î¤è¤¦¤Ë¤·¤Æ¥¯¥é¥¹Ì¾¤«¤éưŪ¤Ë¥¤¥ó¥¹¥¿¥ó¥¹²½¤Ç¤¤Þ¤¹¡£
¡¡Î㤨¤Ð¡¢Cavalry ¤È¤¤¤¦ enum ¤ÎÎóµó»Ò¤ò string ·¿¤ËÃÖ¤´¹¤¨¤Æ¡¢¤½¤Î¤¢¤È¤Ë MoveType ¤ò¤¯¤Ã¤Ä¤±¤Þ¤¹¡£
¤½¤¦¤¹¤ë¤³¤È¤Ç¡¢Àè¤Û¤ÉºîÀ®¤·¤¿¥¯¥é¥¹Ì¾¤ÈƱ¤¸ CavalryMoveType ¤È¤¤¤¦Ì¾Á°¤Îʸ»úÎó¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡¤³¤ì¤ò¡Ö¥¯¥é¥¹Ì¾(·¿Ì¾)¡×¤È¤·¤ÆÄ´¤Ù¤Æ¡¢Æ±¤¸Ì¾Á°¤Î¥¯¥é¥¹Ì¾¤¬Â¸ºß¤·¤Æ¤¤¤ë¤Ê¤é¡¢¤½¤ì¤ò CavalyMoveType ¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤È¤·¤ÆÀ¸À®¤¹¤ë¡¢¤È¤¤¤¦½èÍý¤Ç¤¹¡£
using System; using UnityEngine; public static class MoveTypeFactory { /// <summary> /// °Üư¥¿¥¤¥×¤Ë±þ¤¸¤¿ MoveType ¤ÎÀ¸À® /// </summary> /// <param name="moveType"></param> /// <returns></returns> public static IMoveType Create(MoveTypeEnum moveType) { // Enum ̾ + MoveType ¤Îʸ»úÎó¤òºîÀ®¤·¤Æ¡¢¥¯¥é¥¹Ì¾¤È¾È¹ç¤µ¤»¤ë string className = $"{moveType}MoveType"; // ɬÍפ˱þ¤¸¤Æ NameSpace ¤òÄɲà Type type = Type.GetType(className); // type ¤¬ÆÃÄê¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹(IMoveType)¤ò´Þ¤ó¤Ç¤¤¤ë¤«È½Äê(Type.IsSubclassOf ¤Ç¤Ï¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ÏÄ´¤Ù¤é¤ì¤Ê¤¤) if (type != null && typeof(IMoveType).IsAssignableFrom(type)) { // ¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤òÍøÍѤ·¤Æ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òºîÀ® return Activator.CreateInstance(type) as IMoveType; } Debug.Log($"MoveType ¥¯¥é¥¹ {className} ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó"); return null; } }
¡¡CharaData ¥¯¥é¥¹¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë MoveTypeEnum ·¿¤Î¾ðÊó¤Ï¡¢¤¢¤¯¤Þ¤Ç¤â Enum ·¿¤Ç¤¢¤ê¡¢¤³¤ì¤ò¤½¤Î¤Þ¤Þ»È¤¦¤È¤Ê¤ë¤È¡¢ºÇ½é¤ËÄ󼨤·¤¿¤è¤¦¤Ê switch ʸ¤Ê¤É¤Ë¤è¤ëʬ´ô¤òºî¤é¤¶¤ë¤òÆÀ¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£
¡¡¤½¤³¤Çº£²ó¤Ï¡¢¤³¤Î MoveTypeEnum ·¿¤Î¾ðÊó¤òÍøÍѤ·¡¢»öÁ°¤ËÍѰդ·¤Æ¤ª¤¤¤¿ IMoveType ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤¿¥¯¥é¥¹¤È¤·¤Æ»È¤¨¤ë¤è¤¦¤Ë½èÍý¤·¤Æ¤¤¤ë¤Î¤¬¡¢¾åµ¤Î¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤ò³èÍѤ·¤¿½èÍý¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡¤³¤¦¤¹¤ë¤³¤È¤Ç¡¢CharaData ¤Ë¤Ï¡¢MoveTypeEnum ·¿¤Ë±þ¤¸¤¿°Üư¥¿¥¤¥×¤Î¾ðÊó¤ò½èÍý¤Ç¤¤ë¥¯¥é¥¹¤¬Äɲ䵤ì¤Þ¤¹¤Î¤Ç¡¢
¤¢¤È¤Ï¤³¤Î¥¯¥é¥¹¤ò³èÍѤ·¤Æ¡¢Êâʼ¤Î°Üư¤Ç¤¢¤Ã¤¿¤ê¡¢µ³Ê¼¤Î°Üư¤Ç¤¢¤Ã¤¿¤ê¤òɽ¸½¤·¤Æ¤¤¤¯¤³¤È¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡Ãê¾ÝŪ¤ÊÀ߷פˤʤ뤿¤á¡¢Á´ÂÎÁü¤òÇİ®¤·¤Æ¤¤¤Ê¤¤¤È¤É¤³¤Ç²¿¤¬»È¤ï¤ì¤Æ¤¤¤ë¤«Ê¬¤«¤ê¤Å¤é¤¯¤Ê¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£
¡¡½é´üÃʳ¬¤Ç¤Ï¼ÂÁõ¤¬Áý¤¨¤ÆÈÑ»¨¤Ë¸«¤¨¤ë¤³¤È¤â¤¢¤ê¤Þ¤¹¤¬¡¢³ÈÄ¥À¤ò°Õ¼±¤·¤¿À߷פˤÏÉԲķç¤Ç¤¹¡£
¡¡ÆÃ¤ËÌÀ³Î¤ÊÀÕ̳¤ò°Õ¼±¤·¤ÆÀ߷פ¹¤ì¤Ð¡¢Ä¹´üŪ¤Ë¥á¥ó¥Æ¥Ê¥ó¥¹À¤¬¹â¤¯¤Ê¤ê¤Þ¤¹¡£
¡¡Ê¸»úÎó¤Ç·¿¤ò»ØÄꤹ¤ë¤¿¤á¡¢·¿Ì¾¤ÎÊѹ¹¤ä¥ß¥¹¥¹¥Ú¥ë¤Ë¤è¤ê null ¤¬ÊÖ¤ë²ÄǽÀ(¼Â¹Ô»þ¥¨¥é¡¼¤Ë¤Ê¤ë²ÄǽÀ¤¬¤¢¤ë¡Ê¡á¥¨¥Ç¥£¥¿¾å¤Ç¸¡ÃΤǤ¤Ê¤¤¡Ë)¤¬¤¢¤ê¤Þ¤¹¡£
¡¡¤Þ¤¿ÉÑÈˤ˥ê¥Õ¥ì¥¯¥·¥ç¥ó¤ò»È¤¦¤È¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Ë°±Æ¶Á¤òµÚ¤Ü¤¹¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£
´ðËÜŪ¤Ë¤Ï½é´ü²½»þ¤À¤±¤Ë»ÈÍѤ·¡¢°Ê¸å¤Ï¥¥ã¥Ã¥·¥å¤·¤Æ»È¤¤²ó¤·¤Þ¤·¤ç¤¦¡£
º£²ó¤Î¥±¡¼¥¹¤Ç¤Ï½é´ü²½»þ¤Î¤ß¤Ç¤¹¤Î¤Ç¡¢ÆÃ¤ËÌäÂꤢ¤ê¤Þ¤»¤ó¤¬¡¢¼Â¹Ô¿ô¤Ï¾¯¤Ê¤¤¤Ë±Û¤·¤¿¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¡£
¡¡¤Þ¤¿¥¢¥»¥ó¥Ö¥ê¤ä̾Á°¶õ´Ö¤Ê¤É¤Ë¤â¹Íθ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
º£²ó¤Ï̾Á°¶õ´Ö¤òÍøÍѤ·¤Æ¤¤¤Þ¤»¤ó¤¬¡¢Ì¾Á°¶õ´ÖÆâ¤Ë¥¯¥é¥¹¤¬Â¸ºß¤·¤Æ¤¤¤ë¤Î¤Ç¤¢¤ì¤Ð¡¢¡Ú̾Á°¶õ´Ö.¥¯¥é¥¹Ì¾¡Û¤Î½ñ¼°(´°Á´½¤¾þ»Ò̾)¤Ç»ØÄê¤ò¹Ô¤ï¤Ê¤¤¤È¥¯¥é¥¹¤ò¸«¤Ä¤±¤ë¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¡£
¡¡CharaUnit ¥¯¥é¥¹¤òºîÀ®¤·¤Þ¤¹¡£
¡¡¤³¤Á¤é¤Ï¼ÂºÝ¤Ë²èÌ̤ËÇÛÃÖ¤µ¤ì¤ë¥¥ã¥éÍѤΥª¥Ö¥¸¥§¥¯¥È¤Ë¥¢¥¿¥Ã¥Á¤¹¤ëÁ°Äó¤Î¥¯¥é¥¹¤Ç¤¹¡£¤³¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï¥×¥ì¥Ï¥Ö¤ÇÍøÍѤ¹¤ë²ÄǽÀ¤â¹â¤¤¤Ç¤·¤ç¤¦¡£
CharaUnit.cs(È´¿è)
using System.Collections.Generic; public class CharaUnit : MonoBehaviour { public CharaData charaData; public OwnerType ownerType; public IMoveType moveType; ¡¡¡¡// ¥Æ¥¹¥ÈÍÑ void Start() { Initialize(charaData); } public void Initialize(CharaData charaData) { this.charaData = charaData; moveType = MoveTypeFactory.Create(charaData.moveType); Debug.Log(moveType); // TODO ¥¿¡¼¥ó¹ØÆÉ // ¥×¥ì¥¤¥ä¡¼¤Î¥¿¡¼¥ó¤Ë¤Ê¤Ã¤¿¤é¥ê¥Õ¥ì¥Ã¥·¥å¤¹¤ë } }
¡¡¤³¤Á¤é¤ò¥¥ã¥éÍѤΥ²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥¢¥¿¥Ã¥Á¤·¤Æ¡¢Start ¥á¥½¥Ã¥É¤òÍøÍѤ·¤Æ¥Æ¥¹¥È¤ò¹Ô¤¤¤Þ¤¹¡£
¼ÂºÝ¤Ë¤Ï Start ¥á¥½¥Ã¥É¤Ç¤Ï¤Ê¤¯¡¢¤³¤Î¥×¥ì¥Ï¥Ö¤òÀ¸À®¤·¡¢¤½¤Î¸å Initialize ¥á¥½¥Ã¥É¤ò¼Â¹Ô¤¹¤ë¡¢¤È¤¤¤¦½èÍý¤Îή¤ì¤Ë¤Ê¤ë¤È»×¤¤¤Þ¤¹¡£
¡¡CharaData ¤Î¾ðÊó¤Ï¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤ÇÀßÄê²Äǽ¤Ç¤¹¤Î¤Ç¡¢MoveTypeEnum ·¿¤Î moveType ¤òǤ°Õ¤ÎÎóµó»Ò¤ËÊѹ¹¤·¤Æ¤¯¤À¤µ¤¤¡£
¡¡¤¢¤È¤Ï¥²¡¼¥à¤ò¼Â¹Ô¤·¤Æ¡¢¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤òÍøÍѤ·¤Æ¡¢IMoveType ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤¿¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤µ¤ì¤ë¤«¤ò³Îǧ¤·¤Þ¤¹¡£
¤¿¤È¤¨¤Ð¡¢Cavalry ¤òÀßÄꤷ¤Æ¤¤¤ë¤Ê¤é¡¢CavalryMoveType ¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ÎÀ¸À®¤¬ÌÜɸ¤Ç¤¹¡£
¡¡Debug.Log ¥á¥½¥Ã¥É¤òµ½Ò¤·¤Æ¤¢¤ê¤Þ¤¹¤Î¤Ç¡¢Console ¥Ó¥å¡¼¤ò³Îǧ¤·¡¢moveType ÊÑ¿ô¤Ç»ØÄꤷ¤¿Ì¾Á°¤ò»ý¤Ä¥¯¥é¥¹Ì¾¤¬É½¼¨¤µ¤ì¤ì¤Ð¡¢Ìµ»ö¤Ë¥¤¥ó¥¹¥¿¥ó¥¹¤ÎÀ¸À®¤¬À®¸ù¤Ç¤¹¡£
¡¡Î㤨¤Ð¥¿¥¤¥ë¥Þ¥Ã¥×¤ò»È¤Ã¤¿¥²¡¼¥à¤Ç¤¢¤ì¤Ð¡¢³Æ CharaUnit ¥¯¥é¥¹¤Î ¡Á MoveType ¥¯¥é¥¹¤Ë¥¢¥¯¥»¥¹¤¹¤ì¤Ð¡¢IsWalkable ¥á¥½¥Ã¥É¤Ë¤è¤ê°Üư¤Ç¤¤ë¥¿¥¤¥ë¤ò³Æ°Üư¥¿¥¤¥×¤´¤È¤ËȽÄê¤Ç¤¤Þ¤¹¤·¡¢
GetMoveCost ¥á¥½¥Ã¥É¤Ë¤è¤ê¡¢¥¿¥¤¥ë¤ÎÃÏ·Á¤Ë¹ç¤ï¤»¤¿°Üư¥¿¥¤¥×¤´¤È¤Î°Üư¥³¥¹¥È¤ò¼èÆÀ¤¹¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡£
¡¡Ìµ»ö¤Ë¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤Î½èÍý¤¬Æ°¤¤¤Æ MoveType ¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤¬À¸À®¤µ¤ì¤¿¤é¡¢¼¡¤Ï MoveTypeFactory ¥¯¥é¥¹¤ò²þÎɤ·¤Æ¤ß¤Þ¤·¤ç¤¦¡£
¡¡¸½ºß¤Î¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤Î½èÍý¤Ï¡¢CharaUnit 1ÂΤˤĤ¡¢£±¤Ä¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
¤½¤Î¤¿¤á¡¢¥²¡¼¥àÆâ¤Ë CharaUnit ¤¬20ÂÎÀ¸À®¤µ¤ì¤ì¤Ð¡¢Æ±¤¸¿ô¤À¤±¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤¬¼Â¹Ô¤µ¤ì¤Æ¡¢20¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤¬À¸À®¤µ¤ì¤ë»ÅÁȤߤǤ¹¡£
¡¡¤Ç¤¹¤¬¡¢º£²ó¤Î¾ì¹ç¡¢¤½¤ì¤¾¤ì¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ï¥¹¥Æ¡¼¥È¡ÊÆâÉô¾õÂ֡ˤò»ý¤¿¤Ê¤¤¥¯¥é¥¹¤Ç¤¹¡£
°Üư²Äǽ¤«¤É¤¦¤«¤ä¥³¥¹¥È¤Î»»½Ð¤Ï¡¢Ëè²óƱ¤¸¾ò·ï¤ÇƱ¤¸·ë²Ì¤¬½Ð¤ë½èÍý¤Ê¤Î¤Ç¡¢¤³¤¦¤¤¤Ã¤¿¥±¡¼¥¹¤Ç¤Ï¥·¥ó¥°¥ë¥È¥óŪ¤Ë¡¢Æ±¤¸¥¤¥ó¥¹¥¿¥ó¥¹¤ò²¿ÅÙ¤â»È¤¤²ó¤·¤¿Êý¤¬¸úΨŪ¤Ç¤¹¡£
¡¡¤Ä¤Þ¤ê¡¢CharaUnit ¤¬20ÂΤ¤¤¿¤È¤·¤Æ¤â¡¢MoveType ¤Î¥¯¥é¥¹¤Ï¸½ºß¤Î¤È¤³¤í3¼ïÎष¤«¤Ê¤¯¡¢¤Þ¤¿½èÍý¤Î·ë²Ì¤âƱ¤¸¤Ë¤Ê¤ë¤Î¤Ç¡¢
20¸Ä¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òºî¤ë¤Î¤Ï̵Â̤ʽèÍý¤Ê¤Î¤Ç¤Ï¤Ê¤¤¤«¡©¡¡¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
¡¡
¡¡¤½¤³¤Ç¡¢³Æ MoveType ¥¯¥é¥¹¤ò£±¤Ä¤º¤Ä¤À¤±¥¤¥ó¥¹¥¿¥ó¥¹²½¤·¤Æ¡¢¤½¤ì¤òºÆÍøÍѤ¹¤ëÊýË¡¤Ë½¤Àµ¤·¤Æ¤ß¤Þ¤·¤ç¤¦¡£
¡¡¤Þ¤º Dictionary ¤ò¿·¤·¤¯Àë¸À¤·¡¢enum ¤ÎÎóµó»Ò(Key)¤ÈÂбþ¤¹¤ë¥¯¥é¥¹(Value)¤ò¥Þ¥Ã¥Ô¥ó¥°(´ØÏ¢ÉÕ¤±)¤Ç¤¤ë¤è¤¦¤Ë¤·¤Æ¤ª¤¤Þ¤¹¡£
Î㤨¤Ð¡¢Flying(enum) ¤È FlyingMoveType(IMoveType ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤¿¥¯¥é¥¹) ¤¬£±¥»¥Ã¥È¤Ë¤Ê¤Ã¤Æ¤¤¤ë·Á¤Ç¤¹¡£
¡¡¤³¤ì¤ò¥²¡¼¥à³«»Ï»þ¤Ë£±²ó¤À¤±½èÍý¤·¤¿¤¤¤Î¤Ç¡¢¿·¤·¤¯¥³¥ó¥¹¥È¥é¥¯¥¿¤òºîÀ®¤·¡¢¤½¤Î½é´ü²½½èÍýÆâ¤ÇÎóµó»Ò¤Î¿ô¤À¤±·«¤êÊÖ¤·¤Æ¡¢ºÇ½é¤Ë¥¤¥ó¥¹¥¿¥ó¥¹¤òºîÀ®¤·¤Æ¤ª¤¤Þ¤¹¡£
¡¡¤¢¤È¤Ï¡¢CharaUnit ¤´¤È¤Ë¡¢¤½¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Î»²¾È¤ò¤â¤é¤Ã¤Æ»È¤¦¤¿¤á¤Î¥á¥½¥Ã¥É¤òÍѰդ·¤Þ¤¹¡£
¡¡¤³¤Î¤è¤¦¤Ë²þÎɤ¹¤ë¤³¤È¤Ç¡¢Î㤨¤Ð¡¢CharaUnit ¤¬20ÂΤ¤¤ë¾ì¹ç¡¢º£¤Þ¤Ç¤Ç¤¢¤ì¤ÐƱ¤¸ MoveType ¤Ç¤¢¤Ã¤Æ¤â¥¤¥ó¥¹¥¿¥ó¥¹¤ò¤¹¤ë¤Î¤Ç·×20²ó¤Î¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤¬É¬ÍפǤ·¤¿¤¬¡¢
ºÇ½é¤Ë enum ¤ÎÎóµó»Ò¤Î¿ô¤À¤±¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤Ç¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤·¤Æ¤ª¤¤¤Æ¡¢¤¢¤È¤Ï CharaUnit ¦¤Ë¤Ï»²¾È¤µ¤»¤ë¤À¤±¡¢¤È¤¤¤¦¹½Â¤¤ËÊѲ½¤·¤Þ¤·¤¿¡£
¡¡º£¸å¤Ï CharaUnit ¤Î¿ô¤Ë´Ø·¸¤Ê¤¯¡¢¤¹¤Ç¤Ë¥¥ã¥Ã¥·¥å¤µ¤ì¤Æ¤¤¤ëɬÍ×¤Ê MoveType ¤òÅϤ¹¤À¤±¤ÇºÑ¤à¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¤Î¤Ç¡¢
¥²¡¼¥à³«»Ï»þ°Ê³°¤Ë¤Ï¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ëɬÍפâ¤Ê¤¯¤Ê¤ê¡¢ÂçÊѸúΨŪ¤Ê½èÍý¤¬½ÐÍè¾å¤¬¤ê¤Þ¤¹¡£
MoveTypeFactory.cs
using System; using System.Collections.Generic; using UnityEngine; public static class MoveTypeFactory { private static readonly Dictionary<MoveTypeEnum, IMoveType> _cache = new(); // enum ¤ÎÎóµó»Ò¤È¡¢Âбþ¤¹¤ë¥¯¥é¥¹¤ò¥Þ¥Ã¥Ô¥ó¥°¤·¤Æ¡¢¥¤¥ó¥¹¥¿¥ó¥¹¤ò¥¥ã¥Ã¥·¥å¤·¤Æ¤ª¤¯ /// <summary> /// ¥³¥ó¥¹¥È¥é¥¯¥¿ /// </summary> static MoveTypeFactory() { // ¤¹¤Ù¤Æ¤ÎÎóµó»Ò¤Î¿ô¤À¤±½èÍý¤¹¤ë foreach (MoveTypeEnum moveType in Enum.GetValues(typeof(MoveTypeEnum))) { // ¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤òÍøÍѤ·¤Æ¥¤¥ó¥¹¥¿¥ó¥¹ºîÀ®(¤¹¤Ç¤Ë¤¢¤ë Create ¥á¥½¥Ã¥É¤òÍøÍÑ) var instance = Create(moveType); // ºîÀ®¤Ç¤¤¿¾ì¹ç¤Î¤ß Dictionary ¤ËÄɲ䷤ƥ¥ã¥Ã¥·¥å¤·¤Æ¤ª¤¯ if (instance != null) { _cache[moveType] = instance; } } } /// <summary> /// ³°Éô¥¯¥é¥¹¤«¤éÍøÍÑ /// ¥¥ã¥Ã¥·¥å¤«¤é³ºÅö¤¹¤ë IMoveType ¤ò¼èÆÀ /// </summary> /// <param name="moveType"></param> /// <returns></returns> public static IMoveType Get(MoveTypeEnum moveType) { // ³ºÅö¤¹¤ë MoveType ¤¬Â¸ºß¤¹¤ë¤«¥Á¥§¥Ã¥¯¤·¡¢Â¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤Î MoveType ¤Î»²¾È¤òÊÖ¤¹ if (_cache.TryGetValue(moveType, out var instance)) { return instance; } Debug.Log($"MoveType {moveType} ¤Ï̤ÄêµÁ¤Ç¤¹"); return null; } /// <summary> /// ¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤Ç°Üư¥¿¥¤¥×¤Ë±þ¤¸¤¿ MoveType ¥¯¥é¥¹¤òÀ¸À®(³°Éô¤«¤é¤â»È¤¨¤ëÈÆÍѥ᥽¥Ã¥É) /// </summary> /// <param name="moveType"></param> /// <returns></returns> public static IMoveType Create(MoveTypeEnum moveType) { // Enum ̾ + MoveType ¤Îʸ»úÎó¤òºîÀ®¤·¤Æ¡¢¥¯¥é¥¹Ì¾¤È¾È¹ç¤µ¤»¤ë string className = $"{moveType}MoveType"; // ɬÍפ˱þ¤¸¤Æ NameSpace ¤òÄɲà Type type = Type.GetType(className); // type ¤¬ÆÃÄê¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹(IMoveType)¤ò´Þ¤ó¤Ç¤¤¤ë¤«È½Äê(Type.IsSubclassOf ¤Ç¤Ï¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ÏÄ´¤Ù¤é¤ì¤Ê¤¤) if (type != null && typeof(IMoveType).IsAssignableFrom(type)) { // ¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤òÍøÍѤ·¤Æ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òºîÀ® return Activator.CreateInstance(type) as IMoveType; } Debug.Log($"MoveType ¥¯¥é¥¹ {className} ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó"); return null; } }
¡¡º£²ó¤Î¤è¤¦¤Ê·Á¤Ç¤Î¼ÂÁõ¤Ë²þÎɤ¹¤ë¤³¤È¤Ë¤è¤ê¡¢¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤Î¥³¥¹¥Èºï¸º¤¬¹Ô¤¨¤Æ¤¤¤Þ¤¹¡£
¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤Ï¼Â¹Ô»þ¤ËưŪ¤Ë·¿¾ðÊó¤ò¼èÆÀ¤·¤Æ¥¤¥ó¥¹¥¿¥ó¥¹¤òºîÀ®¤¹¤ë¤¿¤á¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¥³¥¹¥È¤¬¹â¤¤½èÍý¤Ç¤¹¡£
¡¡º£²ó¤Ï¥¥ã¥é¤Î½é´ü²½»þ¤Î¤ß¤Ç¤Ï¤¢¤ê¤Þ¤¹¤¬¡¢¤ä¤Ï¤ê²Äǽ¤Ê¸Â¤ê¡¢¾¯¤Ê¤¤½èÍý¿ô¤ÎÊý¤¬¤è¤¤¤Ç¤¹¡£
¡¡¡¦ºÇ½é¤Î°ìÅÙ¤À¤±¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤ÇÀ¸À®¤·¡¢ ¡¡¡¦¤¢¤È¤Ï Dictionary<MoveTypeEnum, IMoveType> ·Ðͳ¤Ç»È¤¤²ó¤¹(ºÆÍøÍÑ)
¡¡ºÆÍøÍѤµ¤»¤ë¤³¤È¤Ç¡¢ÂçÉý¤Ê¥³¥¹¥Èºï¸º¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡¤Þ¤¿¡¢¥ê¥Õ¥¡¥¯¥¿¥ê¥ó¥°¡¦¥Ç¥Ð¥Ã¥°¤Î¤·¤ä¤¹¤µ¤â¸þ¾å¤·¤Þ¤¹¡£
¤¹¤Ù¤Æ¤Î MoveType ¤¬ MoveTypeFactory ¤Ç´ÉÍý¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ë¤¿¤á¡¢
¡¡¡¦¤É¤³¤Ç²¿¤¬»È¤ï¤ì¤Æ¤¤¤ë¤«¤¬°ì¸µ´ÉÍý¤Ç¤¤ë ¡¡¡¦ÉÔÍ×¤Ê MoveType ¤ò¸«¤Ä¤±¤ä¤¹¤¤ ¡¡¡¦¿·¤·¤¤·¿¤ÎÄɲäˤ⶯¤¯¤Ê¤ë
¡¡¤³¤¦¤¤¤Ã¤¿¥á¥ê¥Ã¥È¤â¾å¤²¤é¤ì¤Þ¤¹¡£
¡¡¼¡¤Ë CharaUnit ¥¯¥é¥¹Â¦¤Î MoveTypeFactory ¤Ø¤Î¸Æ¤Ó½Ð¤·Ì¿Îá Create ¥á¥½¥Ã¥É¤«¤é Get ¥á¥½¥Ã¥É¤ËÃÖ¤´¹¤¨¤Þ¤¹¡£
CharaUnit.cs(È´¿è)
using System.Collections.Generic; public class CharaUnit : MonoBehaviour { public CharaData charaData; public OwnerType ownerType; public IMoveType moveType; ¡¡¡¡// ¥Æ¥¹¥ÈÍÑ void Start() { Initialize(charaData); } public void Initialize(CharaData charaData) { this.charaData = charaData; //moveType = MoveTypeFactory.Create(charaData.moveType); // ¤³¤Á¤é¤ËÃÖ¤´¹¤¨ moveType = MoveTypeFactory.Get(charaData.moveType); Debug.Log(moveType); // TODO ¥¿¡¼¥ó¹ØÆÉ // ¥×¥ì¥¤¥ä¡¼¤Î¥¿¡¼¥ó¤Ë¤Ê¤Ã¤¿¤é¥ê¥Õ¥ì¥Ã¥·¥å¤¹¤ë } }
¡¡°Ê¾å¤Ç´°À®¤Ç¤¹¡£
¡¡¤³¤Á¤é¤ÇƱ¤¸¤è¤¦¤Ë¥²¡¼¥à¤ò¼Â¹Ô¤·¤Æ½èÍý¤¬Àµ¾ï¤Ëưºî¤¹¤ë¤«¤ò³Îǧ¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
¡¡ºÇ¸å¤ËÃí°ÕÅÀ¤Ç¤¹¡£
¡¡¤Þ¤ºÁ°Äó¤È¤·¤Æ¡¢IMoveType ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤¿¥¯¥é¥¹¤¬¾õÂÖ¤òÊÝ»ý¤·¤Ê¤¤À߷פǤ¢¤ë¤³¤È¡Ê¡áºÆÍøÍѲÄǽ¤Ç¤¢¤ë¤³¤È¡Ë¡£
¤³¤ì¤¬ÊÑ¿ô¤Ê¤É¤ò»ý¤Á¡¢¤½¤ÎÅÔÅÙÃͤ¬ÊѲ½¤·¤Æ¤·¤Þ¤¦¤È¡¢½èÍý·ë²Ì¤¬°Û¤Ê¤ë·ë²Ì¤È¤Ê¤ë¤¿¤á¡¢ºÆÍøÍѤ¬¤Ç¤¤Ê¤¤¾õÂ֤ˤʤê¤Þ¤¹¡£
¡¡¤â¤·¾Í衢ʼ¼ï¤´¤È¤Ë¥«¥¹¥¿¥Þ¥¤¥º²Äǽ¤Ê MoveType ¤òºî¤ë¾ì¹ç¡Ê¡á¾õÂÖ¤ò»ý¤Ä¾ì¹ç¡Ë¤Ï¡¢¤³¤ÎÊý¼°¤Ç¤ÏºÆÍøÍѤ¬¤Ç¤¤Þ¤»¤ó¡£
¤½¤Î¾ì¹ç¤ÏËè²ó new ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£(²þÎÉÁ°¤Î¤è¤¦¤Ë¡¢Ëè²ó Create ¥á¥½¥Ã¥É¤ò»È¤Ã¤Æ¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤òÍøÍѤ¹¤ë)
¡¡Ê£¿ô¥¹¥ì¥Ã¥É¤Ç»È¤¦¾ì¹ç¤Ï¥¹¥ì¥Ã¥É¥»¡¼¥ÕÀ߷פËÃí°Õ¤Ç¤¹¤¬¡¢´ðËÜŪ¤Ë¤Ï Unity¤ÎÄ̾ïÍÑÅӤǤÏÌäÂê¤Ï¤¢¤ê¤Þ¤»¤ó¡£
¡¡³ÈÄ¥À¤ò°Õ¼±¤·¤¿À߷פò¤·¤¿¤¤Êý¤Ë¤È¤Ã¤Æ¡¢¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤È¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤Ï¤È¤Æ¤â¶¯ÎϤÊÉð´ï¤Ë¤Ê¤ê¤Þ¤¹¡£
¥²¡¼¥à³«È¯¤Ë¤ª¤¤¤Æ¡Ö»ÅÍͤÎÄɲá¦Êѹ¹¡×¤¬ÉÑÈˤ˵¯¤³¤ë¾ìÌ̤Ǥϡ¢ÆÃ¤Ë°ÒÎϤòȯ´ø¤¹¤ë¹Í¤¨Êý¤Ç¤¹¡£
¡¡º£¸å¤Ï¡¢°Üư¤À¤±¤Ç¤Ê¤¯¹¶·â¤ä¥¹¥¥ë¤Ê¤É¤Ë¤â¤³¤Î¹Í¤¨Êý¤ò±þÍѤ·¤Æ¤¤¤¯¤³¤È¤Ç¡¢¥×¥í¥¸¥§¥¯¥ÈÁ´ÂΤγÈÄ¥À¤ò¤µ¤é¤Ë¹â¤á¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
- ¥«¥Æ¥´¥ê¡§
- ¿Ê³Ø/¥¹¥¯¡¼¥ë
- ¥×¥í¥°¥é¥ß¥ó¥°
¥³¥á¥ó¥È¤ò¤«¤¯