前提・実現したいこと
Unity2Dで同じスクリプトを持つオブジェクトが複数あるとき、クリックされたオブジェクトのみ移動処理を施したい。
発生している問題・エラーメッセージ
クリックでキャラを操作できるスクリプトを用意したのですが、同じキャラを複数体作ったときに特定のキャラをクリックすると、全てのキャラが反応して移動してしまいます。なんとかキャラを識別させたいです。
該当のソースコード
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SoldierMove : MonoBehaviour { private float speed; public enum State { Idle, Ready, Move }; public State state = State.Idle; GameObject clickedGameObject; Vector2 vec // Start is called before the first frame update void Start() { speed = 0.35f; } // Update is called once per frame void Update() { //Stateを3つに分けてます。 //Idleでキャラをクリックしてキャラのゲームオブジェクトを取得 //Readyで移動先をクリック //Moveは移動処理および移動中に再びキャラをクリックするとReadyに遷移できるように switch (state) { case State.Idle: if (Input.GetMouseButtonUp(0)) { clickedGameObject = null; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit2D hit2d = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction); if (hit2d) { clickedGameObject = hit2d.transform.gameObject; state = State.Ready; } else { state = State.Idle; } }break; case State.Ready: if (Input.GetMouseButtonUp(0)) { vec = Camera.main.ScreenToWorldPoint(Input.mousePosition); var pos = Camera.main.WorldToScreenPoint(transform.localPosition); var rotation = Quaternion.LookRotation(Vector3.forward, Input.mousePosition - pos); transform.localRotation = rotation; state = State.Move; }break; case State.Move: transform.position = Vector2.MoveTowards(transform.position, new Vector2(vec.x, vec.y), this.speed * Time.deltaTime); Vector2 t1 = new Vector2(vec.x, vec.y); Vector2 t2 = transform.position; Vector2 dir1 = t1 - t2; float d1 = dir1.magnitude; if (d1 == 0) { state = State.Idle; } //移動中にクリックすると再びReadyと同じ状態になる。State.Idleと同じ処理です。 if (Input.GetMouseButtonUp(0)) { clickedGameObject = null; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit2D hit2d = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction); if (hit2d) { clickedGameObject = hit2d.transform.gameObject; state = State.Ready; } }break; } } }
試したこと
補足情報(FW/ツールのバージョンなど)
c#初心者かつ初投稿ゆえわかりづらい書き方をしているかもしれません。申し訳ありません。
回答1件
あなたの回答
tips
プレビュー