ºÇ½ª¹¹¿·¡§
orika_ex_miyako 2025ǯ04·î22Æü(²Ð) 09:33:51ÍúÎò
ÆÃ¤Ë¡¢¥·¥ß¥å¥ì¡¼¥·¥ç¥ó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 ¥á¥½¥Ã¥É¤Ê¤É)¤òºîÀ®¤·¤Æ¡¢¤½¤ì¤ò¥²¡¼¥à´ÉÍý¥¯¥é¥¹Â¦¤«¤é¼Â¹Ô¤¹¤ëÊý¼°¤Ç¤Î¼ÂÁõÊýË¡¤ËÀÚ¤êÂØ¤¨¤ë¤È¤è¤¤¤Ç¤·¤ç¤¦¡£
¡¡¥¿¥¯¥Æ¥£¥¯¥¹·Ï¤Î¥²¡¼¥à¤òºî¤ëºÝ¤Ë¤Ê¤É¤Ë³èÍѤ·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
- ¥«¥Æ¥´¥ê¡§
- ¿Ê³Ø/¥¹¥¯¡¼¥ë
- ¥×¥í¥°¥é¥ß¥ó¥°
¥³¥á¥ó¥È¤ò¤«¤¯