やりたいこと
クリックしたマス目を特定して
プレイキャラクターをマス目移動させたい
(自分のunity上では16.0fごとの移動)
(プレイキャラクターの可動範囲内にて移動する、青いマスのみ)
試したこと
UnityにてSRPGを開発しようとしているのですが
うまくマス目移動ができず困っています。
カメラにPhysics 2D Raycasterをアタッチして
タイルマップの一番上をプレイキャラクターの移動距離のマスを反映して
プレイキャラクターをクリックすると、移動できる距離を表示する部分まで作成できたのですが
この移動可能マス(青のマス)をクリックしてもプレイキャラクターが移動できず困っています。
(カメラにPhysics 2D Raycasterは追加済み)
以下のサイトを参考にして作成しました。
http://itsukinamito.hatenablog.com/entry/2019/03/25/170127
(このサイトのスクリプトはプレイキャラクターにアタッチしていてIPointerClickHandlerでクリック判定を行うのですが、
タイルマップが含まれないため移動できないかと思ったのですが、サイトでは異常はないようです)
初心者のため、伝わりづらいかもしれませんが、助けていただいたら幸いです。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; using UnityEngine.EventSystems; public class UnitMover : MonoBehaviour, IPointerClickHandler { [SerializeField] protected GameObject selectUnit;//クリックされたユニットを入れてあげる変数、移動できるか判定後、移動マス表示 //クリックされたユニットを呼ぶ //選択されたユニットが移動可能ならば、移動範囲のマスを青く光らせる(可動範囲のキャラパラメータを読み込む) //クリックした位置のマスを呼ぶ //クリックした位置が可動範囲内で、ユニットがいない、移動できるマスの場合、移動させる。 //移動アニメとか>? //移動後このターンの移動を終了する。 [SerializeField] Tilemap visualizerTilemap;//青い移動可能マスや赤の攻撃可能マスを表示するタイルマップ [SerializeField] TileBase passibleTile;//青い移動マスのタイルマップチップ [SerializeField] TileBase attackableTile;//攻撃可能マスのタイルマップチップ [SerializeField] TileBase clickedTile;//おそらくクリックされたタイルマップチップを格納する変数 //仮変数 [SerializeField] Vector3Int unitPosVector3Int;//ユニットのポジション [SerializeField] int maxStep_Unit;//ユニットの移動可能範囲のマス [SerializeField] bool selectUnitActive;//ユニットが移動可能かどうか(自作) private void Start() { } private void Update() { } // 到達可能な範囲を青く可視化させる void ShowPassibleTile(Vector3Int unitPos, int maxStep) { // 一マスごとに確認して青くする CheckPassible(unitPos, maxStep + 1); } // 到達できるか確認する void CheckPassible(Vector3Int pos, int remainStep) { //if (posの位置のタイルがOceanかつ敵対するユニットが配置されていない。) visualizerTilemap.SetTile(pos, passibleTile); --remainStep; if (remainStep == 0) return; // これ以上移動できない // まだ移動できるなら隣接するマスに到達可能か再帰的に確認していく CheckPassible(pos + Vector3Int.up, remainStep); CheckPassible(pos + Vector3Int.left, remainStep); CheckPassible(pos + Vector3Int.right, remainStep); CheckPassible(pos + Vector3Int.down, remainStep); } // プレイヤーがクリックしたときに実行する public void OnPointerClick(PointerEventData data) { Debug.Log("クリックしたよー!"); if (selectUnitActive) { Vector3Int vec = new Vector3Int((int)data.position.x, (int)data.position.y, 0); Vector3 objPos = Camera.main.ScreenToWorldPoint(vec); Vector3Int objPosInt = new Vector3Int((int)objPos.x, (int)objPos.y, 0); Debug.Log(objPos + "クリックした位置"); Debug.Log(objPosInt + "クリックした位置"); clickedTile = visualizerTilemap.GetTile(objPosInt); if (clickedTile == passibleTile) { //移動処理 Vector3.MoveTowards(transform.position, objPosInt, 0.5f * Time.deltaTime); selectUnitActive = false; } else if (clickedTile == attackableTile) { // 攻撃処理 } // VisualizerTilemapにあるタイルを全て取り除き選択しているユニットがいない状態にする。 }else if (selectUnitActive == false) { selectUnitActive = true; ShowPassibleTile(unitPosVector3Int, maxStep_Unit); } } }
あなたの回答
tips
プレビュー