動画のような動きを実現します
2017/11/02更新,次々タップしてゴールをどんどん変更できるようにした
ここからダウンロードできます
using UnityEngine; using System.Collections; using System; public class tapMove : MonoBehaviour { //AIの変数用 UnityEngine.AI.NavMeshAgent agent; //hit情報(タップ先)情報の格納用 RaycastHit hit; //タップ用レイの準備 Ray ray; [SerializeField, HeaderAttribute ("circlePrefabをここにアサイン")] public GameObject circlePre; //レイヤーマスクでタップを無視するレイヤー設定用 LayerMask mylayerMask; //アニメーターの変数用 Animator animator; //初期化 void Start () { agent = GetComponent<UnityEngine.AI.NavMeshAgent>();//AIをこのスクリプトがあるゲームオブジェクトから探す animator = GetComponent<Animator> ();//このゲームオブジェクトからアニメーターを探す int layerMask = LayerMask.GetMask(new string[] {"Default"});//レイヤーマスクの設定 mylayerMask = layerMask;//これ何だっけ? } //毎回処理します void Update () { // 左クリックしたときに、 if (Input.GetMouseButtonDown (0)) { // マウスの位置からRayを発射して、 ray = Camera.main.ScreenPointToRay (Input.mousePosition); // 物体にあたったら、 if (Physics.Raycast (ray, out hit, 30f, mylayerMask)) { // その場所に、Nav Mesh Agentをアタッチしたオブジェクトを移動させる agent.SetDestination (hit.point); // "Run"アニメーションに遷移 // animator.SetBool ("Wak", true); spawnPrefab (); } } // 目的地とプレイヤーとの距離が1以下になったら、 if (Vector3.Distance(hit.point, transform.position) < 1.0f) { } } //ターゲットマーカーを表示 void spawnPrefab(){ string delPreviusGO = circlePre.name;//Prefabの名前を取得する try{ GameObject deathObj = GameObject.Find (delPreviusGO);//Prefab名のゲームオブジェクトがあったら Destroy(deathObj);//それを消す=つまり目的地に到着前にタップして行き先を変更した時用 }catch(NullReferenceException e) {//見つからなかった時の処理(特に何もしていない) Debug.Log ("noGO"); } Vector3 mypos ;//行き先の座標設定用 float myPosy = hit.point.y + 0.1f;//若干高い位置にマーカー表示させる mypos = new Vector3 (hit.point.x, myPosy, hit.point.z);//Yだけ少し高くした座標作成 GameObject circleGO = Instantiate(circlePre, mypos, circlePre.transform.rotation) as GameObject;//Prefabを生成する circleGO.name = circlePre.name;//Prefabでなくゲームオブジェクトにして名前を設定する(上で名前で検索して消すために設定いている) } }
元ネタはこちらのスクリプトを参考にしています
また,Prefab側にはこのスクリプトをあてて,IsTriggerをONにしています
using System.Collections; using System.Collections.Generic; using UnityEngine; public class triggerDestroy : MonoBehaviour { Animation anim; bool animCheck; // Use this for initialization void Start () { anim = gameObject.GetComponent<Animation> (); animCheck = false;//noPlayning } // Update is called once per frame void Update () { if (animCheck) { if (!anim.isPlaying) { print ("end"); animCheck = false;//noanimPlay Destroy(this.gameObject); } } } void OnTriggerEnter(Collider other) { //Debug.Log ("ON"); if (!anim.isPlaying) { anim.Play (); animCheck = true;//Playing } } }
ターゲットの赤い輪はPhotoshopで作成し,Planeにテクスチャで貼付
パッケージのダウンロード(ここ)