質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

3850閲覧

Unityのタイルマップ(GetTile)を使用したSRPGでのマス目移動について

DII

総合スコア11

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/09/14 08:39

編集2020/09/14 11:14

やりたいこと
クリックしたマス目を特定して
プレイキャラクターをマス目移動させたい
(自分の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); } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問