Unity¤Ë´ØÏ¢¤¹¤ëµ­»ö¤Ç¤¹

×

¤Ï¤¸¤á¤Ë


¡¡¥¿¥¯¥Æ¥£¥«¥ë¥Ð¥È¥ë(¥·¥ß¥å¥ì¡¼¥·¥ç¥ó)¥²¡¼¥à³«È¯¤Ë¤ª¤¤¤Æ¡¢¡Ö°Üư¥¿¥¤¥×¡×¤ò½ÀÆð¤Ë´ÉÍý¤·¤¿¤¤¤È¤¤¤¦Í×˾¤ÏÈó¾ï¤Ë¿¤¤¤È»×¤¤¤Þ¤¹¡£
¥¿¥¤¥ë¥Þ¥Ã¥×(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);
}



¡¡¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ç¤Ï¥á¥½¥Ã¥É¤ÎÆâÉô¼ÂÁõ¤Ï¹Ô¤¤¤Þ¤»¤ó¡£³Æ¥¯¥é¥¹¤Ë¤ª¤¤¤Æ¿¶¤ëÉñ¤¤¤òÊѤ¨¤ë·Á¤Ç½ñ¤­¤Þ¤¹¡£

¡¡¤³¤Á¤é¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤¿¥¯¥é¥¹¤ò¡¢°Üư¥¿¥¤¥×¤Î¿ô¤À¤±ºîÀ®¤·¤Æ¡¢¤½¤Á¤é¤Ë°Üư¥¿¥¤¥×¤´¤È¤Î½èÍý¤ò¼ÂÁõ¤¹¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢Êâʼ¤äÈô¹Ôʼ¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤½¤ì¤¾¤ì¤Î¥¯¥é¥¹¤È¤·¤ÆÄêµÁ¤Ç¤­¤Þ¤¹¡£


¡ãÊâʼ¤Î°Üư¥¿¥¤¥×¡ä

InfantryMoveType.cs
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,
        };
    }
}


¡ãµ³Ê¼¤Î°Üư¥¿¥¤¥×¡ä

CavalryMoveType.cs
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¤ÎÄ̾ïÍÑÅӤǤÏÌäÂê¤Ï¤¢¤ê¤Þ¤»¤ó¡£


¤Þ¤È¤á


¡¡³ÈÄ¥À­¤ò°Õ¼±¤·¤¿À߷פò¤·¤¿¤¤Êý¤Ë¤È¤Ã¤Æ¡¢¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤È¥ê¥Õ¥ì¥¯¥·¥ç¥ó¤Ï¤È¤Æ¤â¶¯ÎϤÊÉð´ï¤Ë¤Ê¤ê¤Þ¤¹¡£
¥²¡¼¥à³«È¯¤Ë¤ª¤¤¤Æ¡Ö»ÅÍͤÎÄɲá¦Êѹ¹¡×¤¬ÉÑÈˤ˵¯¤³¤ë¾ìÌ̤Ǥϡ¢ÆÃ¤Ë°ÒÎϤòȯ´ø¤¹¤ë¹Í¤¨Êý¤Ç¤¹¡£

¡¡º£¸å¤Ï¡¢°Üư¤À¤±¤Ç¤Ê¤¯¹¶·â¤ä¥¹¥­¥ë¤Ê¤É¤Ë¤â¤³¤Î¹Í¤¨Êý¤ò±þÍѤ·¤Æ¤¤¤¯¤³¤È¤Ç¡¢¥×¥í¥¸¥§¥¯¥ÈÁ´ÂΤγÈÄ¥À­¤ò¤µ¤é¤Ë¹â¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

¥³¥á¥ó¥È¤ò¤«¤¯


¡Öhttp://¡×¤ò´Þ¤àÅê¹Æ¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

ÍøÍѵ¬Ìó¤ò¤´³Îǧ¤Î¤¦¤¨¤´µ­Æþ²¼¤µ¤¤

Menu


´ðÁÃ

µ»½Ñ/Ãμ±(¼ÂÁõÎã)

3D¥¢¥¯¥·¥ç¥ó¥²¡¼¥à

2D¤ª¤Ï¤¸¤­¥²¡¼¥à(ȯŸÊÔ)

2D¶¯À©²£¥¹¥¯¥í¡¼¥ë¥¢¥¯¥·¥ç¥ó(ȯŸÊÔ)

2D¥¿¥Ã¥×¥·¥å¡¼¥Æ¥£¥ó¥°(³ÈÄ¥ÊÔ)

¥ì¡¼¥¹¥²¡¼¥à(È´¿è)

2DÊüÃÖ¥²¡¼¥à(ȯŸÊÔ)

3D¥ì¡¼¥ë¥¬¥ó¥·¥å¡¼¥Æ¥£¥ó¥°(±þÍÑÊÔ)

3Dæ½Ð¥²¡¼¥à(È´¿è)

2D¥ê¥¢¥ë¥¿¥¤¥à¥¹¥È¥é¥Æ¥¸¡¼

3D¥¿¥Ã¥×¥¢¥¯¥·¥ç¥ó(NavMeshAgent »ÈÍÑ)

2D¥È¥Ã¥×¥Ó¥å¡¼¥¢¥¯¥·¥ç¥ó(¥«¥¨¥ë¤Î°Ù¤Ë¡Á¡¢¥Ü¥³¥¹¥«¥¦¥©¡¼¥ºÉ÷)

VideoPlayer ¥¤¥Ù¥ó¥ÈϢư¤Î¼ÂÁõÎã

VideoPlayer ¥ê¥¹¥ÈÆâ¤«¤é¥à¡¼¥Ó¡¼ºÆÀ¸¤Î¼ÂÁõÎã(ȯŸ)

AR ²èÁüÉÕ¤­¥ª¥Ö¥¸¥§¥¯¥ÈÀ¸À®¤Î¼ÂÁõÎã

AR ¥ê¥¹¥ÈÆâ¤«¤éÀ¸À®¤Î¼ÂÁõÎã(ȯŸ)

2D¥È¥Ã¥×¥Ó¥å¡¼¥¢¥¯¥·¥ç¥ó(¥µ¥Ð¥¤¥Ð¡¼É÷)

private



¤³¤Î¥µ¥¤¥ÈÆâ¤ÎºîÉʤϥæ¥Ë¥Æ¥£¤Á¤ã¤ó¥é¥¤¥»¥ó¥¹¾ò¹à¤Î¸µ¤ËÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£

´ÉÍý¿Í/Éû´ÉÍý¿Í¤Î¤ßÊÔ½¸¤Ç¤­¤Þ¤¹