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

×
¡¡¥¿¥¤¥ë¥Þ¥Ã¥×¤ò»È¤Ã¤¿¥²¡¼¥à¤Ç¤Ï¡¢¥Þ¥¹Ìܤ˱è¤Ã¤Æ¥«¡¼¥½¥ë¤ò°Üư¤µ¤»¤ë½èÍý(¥°¥ê¥Ã¥É°Üư)¤¬É¬Íפˤʤ뤳¤È¤¬¤è¤¯¤¢¤ê¤Þ¤¹¡£
ÆÃ¤Ë¡¢¥·¥ß¥å¥ì¡¼¥·¥ç¥óRPG¤ä¥¿¥¯¥Æ¥£¥¯¥¹·Ï¤Î¥²¡¼¥à¤Ç¤Ï¡¢¥Þ¥¹Ã±°Ì¤Ç°Üư¤¹¤ë¥«¡¼¥½¥ë¤ÏÉԲķç¤Ç¤¹¡£
¡¡
¡¡Ëܵ­»ö¤Ç¤Ï¡¢Unity¤ÎTilemapµ¡Ç½¤ò³èÍѤ·¡¢¥­¡¼¥Ü¡¼¥É¤ä¥Þ¥¦¥¹¤Ç¥«¡¼¥½¥ë¤ò°Üư¤Ç¤­¤ë¥·¥¹¥Æ¥à¤ò¼ÂÁõ¤¹¤ëÊýË¡¤ò¾Ò²ð¤·¤Þ¤¹¡£
¥«¥á¥é¤ÎÀ©¸æ¤Ë¤Ï Cinemachine ¤òÍøÍѤ·¤Æ¤¤¤Þ¤¹¡£

¡ã¼ÂÁõư²è­¡¡¡¥­¡¼ÆþÎϤǤΥ«¡¼¥½¥ë°Üư¡ä



¡ã¼ÂÁõư²è­¢¡¡º¸¥Þ¥¦¥¹¥¯¥ê¥Ã¥¯¤Ç¤Î¥«¡¼¥½¥ë°Üư¡ä




¡¡¥Þ¥Ã¥×¥Á¥Ã¥×²èÁü¤Ë¤Ï¡¢¤Í¤¯¤é¥Þ¥Ã¥×¥Á¥Ã¥× ÍͤòÍøÍѤµ¤»¤Æ¤¤¤¿¤À¤¤¤Æ¤ª¤ê¤Þ¤¹¡£

¤Í¤¯¤é¥Þ¥Ã¥×¥Á¥Ã¥× ÍÍ
https://nekuramap.wixsite.com/nekuramap


¡¡¥¢¥¤¥³¥ó²èÁü¤Ë¤Ï¡¢icon rainbow ÍͤòÍøÍѤµ¤»¤Æ¤¤¤¿¤À¤¤¤Æ¤ª¤ê¤Þ¤¹¡£


¾¦ÍѲĤÎ̵ÎÁ(¥Õ¥ê¡¼)¤Î¥¢¥¤¥³¥óÁǺà¤ò¥À¥¦¥ó¥í¡¼¥É¤Ç¤­¤ë¥µ¥¤¥È¡Øicon rainbow¡Ù ÍÍ
https://icon-rainbow.com/


¡¡¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£



£±¡¥¼ÂÁõÆâÍÆ¤Î¾Ò²ð


¡¡Ëܵ­»ö¤Ç¤Ï¡¢Unity¤ÎTilemap¤ò»ÈÍѤ·¤Æ¡¢¥°¥ê¥Ã¥É¾å¤ò°Üư¤¹¤ë¥«¡¼¥½¥ë¤ò¼ÂÁõ¤·¤Þ¤¹¡£
ÂоݤϽ鿴¼Ô¤Î¸þ¤±¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¤¬¡¢ºÇ¸å¤ÎÊý¤Ç¤ÏÃæµé¼Ô°Ê¹ß¤ÎÊý¤Ë¸þ¤±¤¿È¯Å¸Îã¤ò¾Ò²ð¤·¤Æ¤¤¤Þ¤¹¡£

¡¡µ»½ÑŪ¤ÊÆâÍÆ¤È¤·¤Æ¤Ï¡¢²¼µ­¤Î¤è¤¦¤ÊÆâÍÆ¤Ë¤Ê¤ê¤Þ¤¹¡£

¡¦Tilemap.CellToWorld() ¤ò»ÈÍѤ·¡¢¥¿¥¤¥ë¤ÎºÂɸ¤ò¥ï¡¼¥ë¥ÉºÂɸ¤ËÊÑ´¹
¡¦Vector3Int ¤òÍѤ¤¤¿¥Þ¥¹ÌÜñ°Ì¤Î°Üư½èÍý
¡¦Ìð°õ¥­¡¼¤Ë¤è¤ë¥«¡¼¥½¥ë°Üư
¡¦¥Þ¥¦¥¹¥¯¥ê¥Ã¥¯¤Ë¤è¤ë¥«¡¼¥½¥ë°Üư
¡¦R3(UniRx) ¤ò³èÍѤ·¤¿¥¹¥à¡¼¥º¤ÊÆþÎϽèÍý¡ÊȯŸÎã¡Ë



¡¡¤³¤Î¤Û¤«¤Ë¡¢Cinemachine ¤Îµ¡Ç½¤ò³èÍѤ·¤Æ¡¢¥«¡¼¥½¥ë¤ò¥«¥á¥é¤¬Äɽ¾¤¹¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡£
¤Þ¤¿¡¢¥¿¥¤¥ë¥Þ¥Ã¥×¤¬²èÌ̳°¤ò±Ç¤µ¤Ê¤¤¤è¤¦¤Ë¤·¤¿¤ê¡¢¥«¡¼¥½¥ë¤¬²èÌ̳°¤Ë½Ð¤Ê¤¤¤è¤¦¤Ë¤·¤¿¤ê¤¹¤ëµ¡Ç½¤â Cinemachine ¤Ç¼ÂÁõ²Äǽ¤Ç¤¹¤¬¡¢
¤É¤Á¤é¤â¤³¤Îµ­»ö¤Ç¤Ï³ä°¦¤·¤Æ¤¤¤Þ¤¹¡£

¡¡¤³¤ì¤é¥¿¥¤¥ë¥Þ¥Ã¥×¤Ø¤Î Cinemachine ¤Î³èÍÑ»öÎã¤Ë¤Ä¤¤¤Æ¤Ï¡¢²¼µ­¤Î¶µºà¤ò»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£

¡¡=>¡¡£²£Ä¥¿¥¤¥ë¥Þ¥Ã¥×£Ò£Ð£Ç¡¡¼ê½ç£¹


¡¡Cinemachine ¤Î¥«¥á¥é¤Ë¤Ï¡¢¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤òÄɽ¾¤¹¤ë Follow µ¡Ç½¤¬¤¢¤ê¤Þ¤¹¡£
¾åµ­¤Îµ­»ö¤Ï¡¢¥«¥á¥é = [°Üư¤¹¤ë¥×¥ì¥¤¥ä¡¼¤ÎÄɽ¾]¤ò¹Ô¤¦¤È¤¤¤¦·Á¤Ç¼ÂÁõ¤µ¤ì¤Æ¤¤¤ëµ­»ö¤Ç¤¹¤¬¡¢
Äɽ¾¤¹¤ëµ¡Ç½¤Ï¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ì¤Ð²¿¤Ç¤âÄɽ¾²Äǽ¤Ç¤¹¡£

¡¡¤è¤Ã¤Æ¤³¤ÎÉôʬ¤ò¥«¥á¥é = [°Üư¤¹¤ë¥«¡¼¥½¥ë¤ÎÄɽ¾]¤È¤¤¤¦·Á¤ËÃÖ¤­´¹¤¨¤Æ¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£


£²¡¥³èÍÑÊýË¡


¡¡¤³¤Á¤é¤Î¥«¡¼¥½¥ëµ¡Ç½¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ê¥²¡¼¥à¤Ç³èÍѤǤ­¤Þ¤¹¡£

¡¦¥¿¡¼¥óÀ©¥¹¥È¥é¥Æ¥¸¡¼¡Ê¥·¥ß¥å¥ì¡¼¥·¥ç¥óRPG, ¥¿¥¯¥Æ¥£¥¯¥¹¥²¡¼¥à¡Ë
¡¦¥Þ¥¹Ã±°Ì¤Ç¥­¥ã¥é¥¯¥¿¡¼¤ò°Üư¤¹¤ë¥Ñ¥º¥ë¥²¡¼¥à¡¢¥Ü¡¼¥É¥²¡¼¥à¡¢¤Ê¤É

¡¡¥Þ¥¦¥¹¥¯¥ê¥Ã¥¯¤ä¥­¡¼Áàºî¤Ë¤è¤ë¡¢¥°¥ê¥Ã¥Éñ°Ì¤Ç¤Î¥«¡¼¥½¥ë°Üư¤¬²Äǽ¤Ë¤Ê¤ë¤¿¤á¡¢¥×¥ì¥¤¥ä¡¼¤Ëľ´¶Åª¤ÊÁàºî´¶¤òÄ󶡤Ǥ­¤Þ¤¹¡£


£³¡¥À©ºîÊýË¡

£±¡¥¥¿¥¤¥ë¥Þ¥Ã¥×¤ÎÀ©ºî


¡¡¤Þ¤º¡¢¥¿¥¤¥ë¥Þ¥Ã¥×¤òºîÀ®¤·¡¢¥²¡¼¥à¥·¡¼¥ó¤ËÇÛÃÖ¤·¤Þ¤¹¡£

¡¡¤³¤³¤Ç¤Ï´Ê°×Ū¤Ê¼ê½ç¤Î¤ß¾Ò²ð¤·¤Þ¤¹¡£
¥¿¥¤¥ë¥Þ¥Ã¥×¤ÎºîÀ®¼ê½ç¤Ë¤Ä¤¤¤Æ¤Ï¡¢¤Û¤«¤Îµ­»ö¤â»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£

¡ã¥¿¥¤¥ë¥Þ¥Ã¥×¤ÎºîÀ®¡ä
¡¦Hierarchy¤Ç GameObject > 2D Object > Tilemap > Rectangular ¤òºîÀ®
¡¦Grid ¤Î»Ò¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æ Tilemap ¤¬À¸À®¤µ¤ì¤ë
¡¦Tile Palette ¤ò³«¤­¡¢»ÈÍѤ¹¤ë¥¿¥¤¥ë¤òºîÀ®¡¦ÇÛÃÖ

¡ãTilemap¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ÎÀßÄê¡ä
¡¦TilemapRenderer ¤ò³Îǧ¤·¡¢É½¼¨¤µ¤ì¤Æ¤¤¤ë¤³¤È¤ò¥Á¥§¥Ã¥¯
¡¦TilemapCollider2D¡ÊɬÍפ˱þ¤¸¤ÆÄɲáË


¡¡=>¡¡£²£Ä¥¿¥¤¥ë¥Þ¥Ã¥×£Ò£Ð£Ç¡¡¼ÂÁõ¼ê½ç¤ò¹Í¤¨¤ë
¡¡=>¡¡£²£Ä¥¿¥¤¥ë¥Þ¥Ã¥×£Ò£Ð£Ç¡¡¼ê½ç£³
¡¡=>¡¡£²£Ä¥¿¥¤¥ë¥Þ¥Ã¥×£Ò£Ð£Ç¡¡¼ê½ç£´


£²¡¥¥«¡¼¥½¥ëÍѤΥץì¥Ï¥ÖÀ©ºî


¡¡¼¡¤Ë¡¢¥«¡¼¥½¥ë¤È¤·¤Æ»ÈÍѤ¹¤ë¥×¥ì¥Ï¥Ö¤òºîÀ®¤·¤Þ¤¹¡£

¡¡¤³¤Á¤é¤â´Ê°×Ū¤Ê¾Ò²ð¤Ë¤È¤É¤á¤Æ¤¤¤Þ¤¹¡£

¡ã¥«¡¼¥½¥ëÍѤΥª¥Ö¥¸¥§¥¯¥È¤òºîÀ®¡ä
¡¦Create Empty ¤Ç¿·µ¬¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤òºîÀ®¤·¡¢Ì¾Á°¤ò Cursor ¤Ê¤É¤ËÊѹ¹
¡¦Transform ¤Î Position ¤Ï (0, 0, 0) ¤ËÀßÄê

¡¦¾åµ­¤Î Cursor ¤òÁªÂò¤·¤¿¾õÂ֤ǡ¢GameObject > 2D Object > Sprite ¤ò Cursor ¤Î»Ò¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤ÆºîÀ®
¡¦¥«¡¼¥½¥ëÍѤΥ¹¥×¥é¥¤¥È²èÁü ¤òÀßÄê¡ÊÎã¡§ÀÖ¤¤ÏȤβèÁü¡Ë
¡¦Transform ¤Î Position ¤Ï (0, 0, 0) ¤ËÀßÄê

¡¡¤³¤Î¤è¤¦¤Ë¿Æ»Ò´Ø·¸¤òÍøÍѤ·¤Æ¥«¡¼¥½¥ë¤òºîÀ®¤·¤Æ¤ª¤¯¤³¤È¤Ç¡¢¥«¡¼¥½¥ë¤Î½é´ü°ÌÃ֤䥵¥¤¥º¤ÎÄ´À°¤Ï»Ò¥ª¥Ö¥¸¥§¥¯¥È¦¤ÇÄ´À°²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£
ÆÃ¤Ë¥µ¥¤¥º(Scale)¤Ë¤Ä¤¤¤Æ¤Ï»Ò¥ª¥Ö¥¸¥§¥¯¥È¤ÇÄ´À°¤¹¤ë¤È¤è¤¤¤Ç¤·¤ç¤¦¡£

¡¡»²¹Í²èÁü¤Ç¤¹¡£









¡¡¥Õ¥ì¡¼¥à²èÁü¤Ë¤Ï¡¢²¼µ­¤Î¥µ¥¤¥È¤òÍøÍѤµ¤»¤Æ¤¤¤¿¤À¤¤¤Æ¤ª¤ê¤Þ¤¹¡£

̵ÎÁ¥¤¥é¥¹¥È ¤«¤ï¤¤¤¤¥Õ¥ê¡¼ÁǺླྀ ¥Õ¥ì¡¼¥à¤Ý¤±¤Ã¤È
https://www.illust-pocket.com/



¡ã¥×¥ì¥Ï¥Ö²½¡ä
¡¦ºîÀ®¤·¤¿¥«¡¼¥½¥ë¤òºîÀ®¤·¤Æ¤ª¤¤¤¿ Prefabs ¥Õ¥©¥ë¥À¤Ê¤É¤Ë¥É¥é¥Ã¥°¡õ¥É¥í¥Ã¥×¤·¤Æ¥×¥ì¥Ï¥Ö¤È¤·¤ÆÅÐÏ¿
¡¦¥Ò¥¨¥é¥ë¥­¡¼¤Ë¤¢¤ë Cursor ¥ª¥Ö¥¸¥§¥¯¥È¤òºï½ü

¡¡»²¹Í²èÁü¤Ç¤¹¡£




£³¡¥¥¯¥é¥¹(¥¹¥¯¥ê¥×¥È)À©ºî


¡¡¥«¡¼¥½¥ë¤Î°Üư½èÍý¤ò´ÉÍý¤¹¤ë CursorController ¥¯¥é¥¹¤òºîÀ®¤·¤Þ¤¹¡£
¤³¤Î¥¯¥é¥¹¤Ï¥«¡¼¥½¥ë¤Î¥×¥ì¥Ï¥Ö¤ËľÀÜ¥¢¥¿¥Ã¥Á¤Ï¤»¤º¡¢ÀìÍѤΥª¥Ö¥¸¥§¥¯¥È¤òºîÀ®¤·¤ÆÍøÍѤ·¤Þ¤¹¡£

using UnityEngine;
using UnityEngine.Tilemaps;

public class CursorController : MonoBehaviour
{
    [SerializeField] private Tilemap tilemap;             // ¥¿¥¤¥ë¥Þ¥Ã¥×(Ê£¿ô¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢ÍøÍѤ·¤¿¤¤ Tilemap ¤ò¥¢¥µ¥¤¥ó)
    [SerializeField] private GameObject cursorPrefab;     // ¥«¡¼¥½¥ë¤Î¥×¥ì¥Ï¥Ö

    private GameObject cursorInstance;                    // À¸À®¤·¤¿¥«¡¼¥½¥ë
    private Vector3Int currentPosition;                   // ¥«¡¼¥½¥ë¤Î¸½ºß°ÌÃÖ
    private Vector3Int initialPosition = Vector3Int.zero; // ¥«¡¼¥½¥ë¤ÎÀ¸À®½é´ü°ÌÃÖ¡ÊɬÍפ˱þ¤¸¤ÆÊѹ¹¡Ë


    private void Start() {

        // ½é´ü¥«¡¼¥½¥ë°ÌÃÖÀßÄê
        currentPosition = initialPosition;

        // ¥«¡¼¥½¥ë¤ÎÀ¸À®
        cursorInstance = Instantiate(cursorPrefab, tilemap.CellToWorld(currentPosition), Quaternion.identity);
    }
    
    private void Update() {

        if (Input.GetKeyDown(KeyCode.UpArrow)) {
            MoveCursor(Vector3Int.up);
        }

        if (Input.GetKeyDown(KeyCode.DownArrow)) {
            MoveCursor(Vector3Int.down);
        }

        if (Input.GetKeyDown(KeyCode.LeftArrow)) {
            MoveCursor(Vector3Int.left);
        }

        if (Input.GetKeyDown(KeyCode.RightArrow)) {
            MoveCursor(Vector3Int.right);
        }
    }

    private void MoveCursor(Vector3Int direction) {

        currentPosition += direction;

        // ¥¿¥¤¥ë¥Þ¥Ã¥×¤ÎÈÏ°ÏÆâ¤Ë¼ý¤á¤ë½èÍý(°ÜưÀè¤Ë¥¿¥¤¥ë¤¬Â¸ºß¤¹¤ë¤«³Îǧ¤·¡¢Â¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¤Î¤ß°Üư)
        if (IsPositionValid(currentPosition)) {

            // ¥«¡¼¥½¥ë¤Î°Üư
            cursorInstance.transform.position = tilemap.CellToWorld(currentPosition);
        }
    }

    /// <summary>
    /// ¥¿¥¤¥ë¥Þ¥Ã¥×¤ÎÈÏ°ÏÆâ¤«¤É¤¦¤«¤ò¥Á¥§¥Ã¥¯
    /// </summary>
    /// <param name="position"></param>
    /// <returns></returns>
    private bool IsPositionValid(Vector3Int position) {

        // ¥¿¥¤¥ë¤¬Â¸ºß¤¹¤ë¤«³Îǧ
        return tilemap.HasTile(position);
    }
}

¡¡Start ¥á¥½¥Ã¥É¤Ç¥«¡¼¥½¥ë¤Î½é´ü°ÌÃÖ¤òÀßÄꤷ¡¢¥«¡¼¥½¥ë¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤·¤Æ¤¤¤Þ¤¹¡£

¡¡Update ¥á¥½¥Ã¥É¤Ç¤Ï¡¢Ìð°õ¥­¡¼¤¬²¡¤µ¤ì¤¿¤È¤­¤Ë¥«¡¼¥½¥ë¤¬°Üư¤¹¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡£

¡¡MoveCursor ¥á¥½¥Ã¥É¤Ç¤Ï¡¢currentPosition ¤Ë direction ¤ò²Ã»»¤·¡¢Tilemap.CellToWorld() ¤ò»È¤Ã¤Æ¥«¡¼¥½¥ë¤Î¥ï¡¼¥ë¥ÉºÂɸ¤ò¹¹¿·¤·¤Æ¤¤¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢¥¿¥¤¥ë¥Þ¥Ã¥×¾å¤Î¥°¥ê¥Ã¥Éñ°Ì¤Ç¥«¡¼¥½¥ë¤¬Æ°¤¯¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

¡¡GetKeyDown ¤È GetKey ¤Î°ã¤¤¤Ë¤Ä¤¤¤Æ¤Ç¤¹¤¬¡¢Input.GetKeyDown(KeyCode.UpArrow) ¤Î¾ì¹ç¤Ë¤Ï¥­¡¼¤ò²¡¤·¤¿½Ö´Ö¤Ë1²ó¤À¤±½èÍý¤ò¼Â¹Ô¤·¤Þ¤¹¡£
Input.GetKey(KeyCode.UpArrow) ¤Ï¥­¡¼¤ò²¡¤·Â³¤±¤Æ¤¤¤ë´Ö¤º¤Ã¤È½èÍý¤ò¼Â¹Ô¤·¤Þ¤¹¡£

¡¡¤â¤· Input.GetKey(KeyCode.UpArrow) ¤ò»È¤¦¤È¡¢¥­¡¼¤ò²¡¤·¤Ã¤Ñ¤Ê¤·¤Ë¤·¤Æ¤¤¤ë´Ö¡¢Ëè¥Õ¥ì¡¼¥à MoveCursor(Vector3Int.up) ¤¬¸Æ¤Ð¤ì¡¢¥«¡¼¥½¥ë¤¬¹â®¤Ç°Üư¤·¤Æ¤·¤Þ¤¤¤Þ¤¹¡£
¤½¤Î¤¿¤á¡¢´ðËÜŪ¤Ë¤Ï GetKeyDown ¤ò»ÈÍѤ·¡¢¤â¤·¤â²¡¤·¤Ã¤Ñ¤Ê¤·¤Ç°Üư¤µ¤»¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢É¬Íפ˱þ¤¸¤Æ°Üư¤Î´Ö³Ö¤òÄ´À°¤·¤¿¤ê¡¢¥¤¥ó¥¿¡¼¥Ð¥ë¤ò¶´¤à½èÍý¤òÄɲ乤ë¤ÈÎɤ¤¤Ç¤·¤ç¤¦¡£

¡¡IsPositionValid ¥á¥½¥Ã¥É¤Ç¤Ï¡¢Tilemap.HasTile ¥á¥½¥Ã¥É¤òÍøÍѤ·¡¢»ØÄꤷ¤¿°ÌÃ֤˥¿¥¤¥ë¥Þ¥Ã¥×¤¬Â¸ºß¤¹¤ë¤«³Îǧ¤·¤Æ¤¤¤Þ¤¹¡£
¤³¤Î¥á¥½¥Ã¥É¤Ï¡¢¥¿¥¤¥ë¥Þ¥Ã¥×¤¬Â¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï true¡¢Â¸ºß¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï false ¤òÊÖ¤·¤Þ¤¹¤Î¤Ç¡¢¤½¤Î¾ðÊó¤ò MoveCursor ¥á¥½¥Ã¥ÉÆâ¤ÇÍøÍѤ·¡¢
¥¿¥¤¥ë¥Þ¥Ã¥×¤¬Â¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¤Î¤ß¡¢°Üư¤¹¤ë½èÍý¤ò¹Ô¤¦¤è¤¦¤ËÀ©¸æ¤·¤Æ¤¤¤Þ¤¹¡£¤½¤¦¤·¤Ê¤¤¤È¡¢¥«¡¼¥½¥ë¤¬²èÌ̳°¤Ë¤â°Üư¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¤¡¢ÉÔ¶ñ¹ç¤Î¸¶°ø¤È¤Ê¤ë¤¿¤á¤Ç¤¹¡£


£´¡¥¥¢¥¿¥Ã¥Á


¡¡Hierarchy ¤Ë¤Æ Create Empty ¤ò¹Ô¤¤¡¢CursorController ÍѤΥª¥Ö¥¸¥§¥¯¥È¤òºîÀ®¤·¤Þ¤¹¡£Ì¾Á°¤âƱ¤¸¤Ë¤·¤Æ¤ª¤¯¤È¤è¤¤¤Ç¤·¤ç¤¦¡£
¤³¤Á¤é¤Ë CursorController ¥¹¥¯¥ê¥×¥È¤ò¥¢¥¿¥Ã¥Á¤·¤Þ¤¹¡£

¡¡¤½¤Î¸å¡¢¥Ò¥¨¥é¥ë¥­¡¼¤Ë¤¢¤ë Tilemap¡¢¤ª¤è¤Ó Prefabs ¥Õ¥©¥ë¥ÀÆâ¤Ë¤¢¤ë Cursor ¥×¥ì¥Ï¥Ö¤Î»²¾È¤ò Inspector ¤Ë¥¢¥µ¥¤¥ó¤·¤ÆÀßÄꤷ¤Æ¤¯¤À¤µ¤¤¡£

¡¡»²¹Í²èÁü¤Ç¤¹¡£








£µ¡¥Æ°ºî³Îǧ¤Î¤¿¤á¤Î¼Â¹Ô¤È¥Ç¥Ð¥Ã¥°


¡¡Unity Editor ¤Î Play ¥Ü¥¿¥ó¤ò²¡¤·¤Æ¼Â¹Ô¤·¡¢Ìð°õ¥­¡¼¤ä¥Þ¥¦¥¹¥¯¥ê¥Ã¥¯¤Ç¥«¡¼¥½¥ë¤¬°Üư¤¹¤ë¤³¤È¤ò³Îǧ¤·¤Æ¤¯¤À¤µ¤¤¡£


¡ã¼ÂÁõư²è­¡¡¡Ìð°õ¥­¡¼¤ÎÆþÎϤǤΥ«¡¼¥½¥ë°Üư¡ä



¡ã¼ÂÁõư²è­¢¡¡º¸¥Þ¥¦¥¹¥¯¥ê¥Ã¥¯¤Ç¤Î¥«¡¼¥½¥ë°Üư¡ä




¡¡¥Ç¥Ð¥Ã¥°¤ÎÊýË¡¤È¤·¤Æ¤Ï¡¢Debug.Log(currentPosition); ¤ò MoveCursor Æâ¤Ëµ­ºÜ¤·¤Æ Console ¥Ó¥å¡¼¤Ë½ÐÎϤ·¡¢¥¿¥¤¥ë¥Þ¥Ã¥×¾å¤Î¥«¡¼¥½¥ë°ÌÃÖ¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£

¡¡Æ±¤¸ÍÍ¤Ë Debug.Log(tilemap.HasTile(currentPosition)); ¤ò MoveCursor Æâ¤Ëµ­ºÜ¤¹¤ë¤³¤È¤Ç¡¢°Üư²Äǽ¤Ê¥Þ¥¹¤«¤ò¥Á¥§¥Ã¥¯¤·¤Æ¤¤¤ëÉôʬ¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£

¡¡¤â¤·¤â¤¦¤Þ¤¯°Üư¤·¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤¦¤¤¤Ã¤¿ÊýË¡¤ò³èÍѤ·¤Æ¡¢¤É¤³¤ËÌäÂêÅÀ¤¬¤¢¤ë¤«¤òÀÚ¤êʬ¤±¤Æ¥Á¥§¥Ã¥¯¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£


£´. ȯŸÎã


¡¡Update ¤Ç¤Î¥­¡¼ÆþÎϤò R3(UniRx) ¤ò»È¤Ã¤¿¥ê¥¢¥¯¥Æ¥£¥Ö¥×¥í¥°¥é¥ß¥ó¥°¤Ç Start ¥á¥½¥Ã¥ÉÆâ¤Ë½ñ¤­Ä¾¤¹¤³¤È¤â²Äǽ¤Ç¤¹¡£

¡¡Î㤨¤Ð¡¢¾åÊý¸þ¤Î¥­¡¼ÆþÎϤò½ñ¤­Ä¾¤·¤Æ¤ß¤¿Îã¤Ç¤¹¡£ÄɲÃʬ¤Î¤ßµ­ºÜ¤·¤Æ¤¤¤Þ¤¹¡£

using R3;
using UniRx;   // ÍøÍѤ·¤Æ¤¤¤ëÊý¤òµ­ºÜ¤·¤Þ¤¹¡£

public class CursorController : MonoBehaviour
{
    [SerializeField] private float moveInterval = 0.2f; // °Üư¤Î´Ö³Ö(ÉÃ) ¤òÄɲÃ

    void Start() {
        this.UpdateAsObservable()
            .Where(_ => Input.GetKey(KeyCode.UpArrow))
            .ThrottleFirst(System.TimeSpan.FromSeconds(0.2f))
            .Subscribe(_ => MoveCursor(Vector3Int.up));
        }
    }


¡¡¾åÊý¸þ¥­¡¼¤ò²¡¤·¤Ã¤Ñ¤Ê¤·¤Ë¤·¤Æ0.2É䴤Ȥ˥«¡¼¥½¥ë¤ò°Üư¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

¡¡Æ±Íͤ˾¤Î¥­¡¼¤Ë¤Ä¤¤¤Æ¤â¡¢Start ¥á¥½¥Ã¥ÉÆâ¤ËÄɵ­¤¹¤ë¤³¤È¤ÇÃÖ¤­´¹¤¨¤¬²Äǽ¤Ç¤¹¡£
¤½¤Î¾ì¹ç¤Ë¤Ï Update ¥á¥½¥Ã¥ÉÆâ¤Î½èÍý¤ÏÉÔÍפˤʤê¤Þ¤¹¤Î¤Ç¡¢Update ¥á¥½¥Ã¥É¤´¤Èºï½ü¤·¤Æ¤¯¤À¤µ¤¤¡£



¡¡¥Þ¥¦¥¹¥¯¥ê¥Ã¥¯¤Ç¤Î°Üư¤Î¾ì¹ç¤Ï¡¢Start ¥á¥½¥Ã¥ÉÆâ¤Ë²¼µ­¤Î¤è¤¦¤Ê·Á¤Ç¼ÂÁõ¤Ç¤­¤Þ¤¹¡£

    void Start() {
        // ¥Þ¥¦¥¹¤Ë¤è¤ë¥¯¥ê¥Ã¥¯°Üư
        this.UpdateAsObservable()
            .Where(_ => Input.GetMouseButtonDown(0))
            .ThrottleFirst(System.TimeSpan.FromSeconds(moveInterval))
            .Subscribe(_ => MoveCursorToMouseClick());
    }

    /// <summary>
    /// ¥Þ¥¦¥¹¥¯¥ê¥Ã¥¯¤·¤¿ÃÏÅÀ¤Ë¥«¡¼¥½¥ë°Üư
    /// </summary>
    private void MoveCursorToMouseClick() {
        Vector3 worldPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        // ºÂɸ¤Î¥º¥ìʬ¤ÎÄ´À°ÃÍ
        Vector3 offset = new Vector3(0.5f, 0.5f, 0);
        Vector3Int cellPosition = tilemap.WorldToCell(worldPosition + offset);

        currentPosition = cellPosition;

        // ¥¿¥¤¥ë¥Þ¥Ã¥×¤ÎÈÏ°ÏÆâ¤Ë¼ý¤á¤ë½èÍý(°ÜưÀè¤Ë¥¿¥¤¥ë¤¬Â¸ºß¤¹¤ë¤«³Îǧ¤·¡¢Â¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¤Î¤ß°Üư)
        if (IsPositionValid(currentPosition)) {

            // ¥«¡¼¥½¥ë¤Î°Üư
            cursorInstance.transform.position = tilemap.CellToWorld(currentPosition);
        }
    }

¡¡¥²¡¼¥à²èÌ̤òº¸¥Þ¥¦¥¹¥¯¥ê¥Ã¥¯¤·¤¿ºÝ¡¢¤½¤³¤Ë¥¿¥¤¥ë¥Þ¥Ã¥×¤¬Â¸ºß¤¹¤ë¤Ê¤é¥«¡¼¥½¥ë¤ò½Ö»þ¤Ë°Üư¤µ¤»¤Þ¤¹(¥Æ¥ì¥Ý¡¼¥È°Üư)¡£
¥°¥ê¥Ã¥Éñ°Ì¤òÊÝ»ý¤·¤¿¤Þ¤Þ°Üư²Äǽ¤Ç¤¹¡£


£µ¡¥¤Þ¤È¤á


¡¡Ëܵ­»ö¤Ç¤Ï¡¢CursorController ¥¯¥é¥¹¤Ç´ðËÜŪ¤Ê¥«¡¼¥½¥ë°Üư½èÍý¤ò¼ÂÁõ¤·¡¢¤Þ¤¿¡¢R3(UniRx)¤ò»È¤Ã¤¿È¯Å¸Åª¤Ê¥¢¥×¥í¡¼¥Á¤ò¾Ò²ð¤·¤Þ¤·¤¿¡£

¡¡º£¸å¤Î¤µ¤é¤Ê¤ëȯŸÊýË¡¤È¤·¤Æ¤Ï¡¢¥²¡¼¥à´ÉÍý¥¯¥é¥¹¤òºîÀ®¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¤é¡¢Start ¥á¥½¥Ã¥É¤ÎÍøÍѤÏÇѻߤ·¤Æ¤ß¤Þ¤·¤ç¤¦¡£
Âå¤ï¤ê¤ËƱÍͤνèÍý¤ò»ý¤Ä½é´üÀßÄêÍѤΥ᥽¥Ã¥É(InitializeCursor ¥á¥½¥Ã¥É¡¢SetupCursor ¥á¥½¥Ã¥É¤Ê¤É)¤òºîÀ®¤·¤Æ¡¢¤½¤ì¤ò¥²¡¼¥à´ÉÍý¥¯¥é¥¹Â¦¤«¤é¼Â¹Ô¤¹¤ëÊý¼°¤Ç¤Î¼ÂÁõÊýË¡¤ËÀÚ¤êÂØ¤¨¤ë¤È¤è¤¤¤Ç¤·¤ç¤¦¡£

¡¡¥¿¥¯¥Æ¥£¥¯¥¹·Ï¤Î¥²¡¼¥à¤òºî¤ëºÝ¤Ë¤Ê¤É¤Ë³èÍѤ·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£

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


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

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

Menu


´ðÁÃ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

private



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

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