動画のような動きを実現します
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にテクスチャで貼付
パッケージのダウンロード(ここ)