「C#」カテゴリーアーカイブ

シーン遷移の基本

シーン遷移の基本を学びます.

ここでは,トップ画面>ゲーム画面>エンド画面の3つのシーンを移動しまたトップ画面へ戻ります.

 

ワークフロー

  • シーンを作成
  • ボタンを作成
  • スクリプトを作成
  • ボタンにスクリプトをアサイン
  • ビルド設定をする
  • 実行する

 

トップシーンを作成する

  1. トップ画面用シーンを作成する
  2. トップ画面用シーンに適宜UI>Textを入れて遷移時にどの画面にいるか分かるようにする
  3. トップ画面にGameObject>UI>Buttonでボタンを作成する
  4. 位置調整をする(参考画像)

 

スクリプト作成

  1. scnChangeというファイル名でスクリプトを作成する(※ファイル名とclass名は同一にすること)
  2. 全て以下に入れ替え保存する(※このスクリプトは他でも使い回しできます)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using UnityEngine.SceneManagement;//これを必ず追加しないと使えない


public class scnChange : MonoBehaviour {

    public string scnName;//変数scnNameをInspectorからセットできるようにする
	
	
    public void goScene(){
        SceneManager.LoadScene(scnName);//変数scnNameのシーンにシーン遷移する
    }

}

 

スクリプトをボタンにアサインする

  1. GameObject>CreateEmpty で空のオブジェクトに上で作成したスクリプトをコンポーネントに追加する
  2. Scn Nameの欄にジャンプ先のシーン名を入力する(※これがInspectorに表示されるのは10行目の変数宣言をpublicにしているから)
  3. ボタンを選択し,OnClickの+ボタンでリストを追加する
  4. 追加したリストに作成した空のオブジェクト(1でスクリプトがついているもの)をアサインする
  5. NoFunctionのプルダウンからscnChange>goSceneを選択する(13行目のpublic void goScene を実行するという意味,publicがついているとボタンから押せる)

ビルド設定をおこなう

  1. File>Build Settings…でビルド設定を開き,ドラッグ&ドロップで,ここで作成した最初のシーンと,これまで作成しらゲームのシーンを追加する
  2. 保存し,トップ画面用シーンを再生し,ボタンを押してシーン遷移するか確認する
  3. シーン遷移後,ゲーム画面の明るさが少し暗いようでしたら,そのシーンのWindow>Lightingを選び,AutoGenerateのチェックを外し,Generateを一度押しておきます

 

実習

  • エンドシーンを作成する
  • ゲームシーンからエンドシーンエンドシーンからトップシーンへとジャンプさせ3つのシーンを1周できるようにすること

Ultimate Joystick cam

ultimate joystick用スクリプト

// BEGIN MIT LICENSE BLOCK //
//
// Copyright (c) 2016 dskjal
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
//
// END MIT LICENSE BLOCK   //
using UnityEngine;

[RequireComponent(typeof(Camera))]
public class followCam3 : MonoBehaviour
{
    public Transform Target;
    public float DistanceToPlayerM = 2f;    // カメラとプレイヤーとの距離[m]
    public float SlideDistanceM = 0f;       // カメラを横にスライドさせる;プラスの時右へ,マイナスの時左へ[m]
    public float HeightM = 1.2f;            // 注視点の高さ[m]
    public float RotationSensitivity = 100f;// 感度
    public float limitMax = 0.4f;
    public float limitMin = -0.4f;

    void Start()
    {
        if (Target == null)
        {
            Debug.LogError("ターゲットが設定されていない");
            Application.Quit();
        }
    }

    void FixedUpdate()
    {


       // var rotX = Input.GetAxis("Mouse X") * Time.deltaTime * RotationSensitivity;
       // var rotY = Input.GetAxis("Mouse Y") * Time.deltaTime * RotationSensitivity;

        float rotX = UltimateJoystick.GetHorizontalAxis("camStick")* Time.deltaTime * RotationSensitivity;
        float rotY = UltimateJoystick.GetVerticalAxis("camStick")* Time.deltaTime * RotationSensitivity;

        var lookAt = Target.position + Vector3.up * HeightM;

        // 回転
        transform.RotateAround(lookAt, Vector3.up, rotX);
        // カメラがプレイヤーの真上や真下にあるときにそれ以上回転させないようにする
        if (transform.forward.y > limitMax && rotY < 0)//default 0.9
        {
            rotY = 0;
        }
        if (transform.forward.y < limitMin && rotY > 0)
        {
            rotY = 0;
        }
        transform.RotateAround(lookAt, transform.right, rotY);

        // カメラとプレイヤーとの間の距離を調整
        transform.position = lookAt - transform.forward * DistanceToPlayerM;

        // 注視点の設定
        transform.LookAt(lookAt);

        // カメラを横にずらして中央を開ける
        transform.position = transform.position + transform.right * SlideDistanceM;
    }
}

 

参考サイト

https://dskjal.com/unity/tps-camera.html

コインドーザーの作成3

つづきです

 

次にボタンを押すとコインが落ちる仕組みを作成する

まず,

  1. GameObject>UI>Button でボタンを作成する
  2. ゲーム画面にボタンが表示される
  3. ヒエラルキーで作成されたボタンを選択する
  4. ボタンの位置調整をする.まず,右上を基準モードにする(画像1,2の順に選択)
  5. 次にゲーム画面を見ながら位置を調整し,画面の右端に移動させる(値は各自で自由に設定すること)
  6. GameObject>Create Emptyで空のオブジェクト(位置情報のみのオブジェクトになる)を作成する.後でこの位置からコインを生成させるための準備
  7. 名前はに変更しておくこと
  8. 参考の位置
  9. Asset内で右クリック>Create>C# Scriptを作成し,名前をcoin_genにする
  10. coin_genを開きスクリプトエディタ(Visual Studio等)を開き中身を以下に入れ替える

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine; 

public class coin_gen : MonoBehaviour { 
public Transform spawnpos;//インスペクタに位置情報用のドロップボックスを表示 
public GameObject coninPrefab;//プレファブをアサインするドロップボックスを表示 

void Start () { }
 
// Update is called once per frame 
void Update () { } 


//public化することでボタンからクリックで実行きるようになる 
public void genBtn(){
 Vector3 pos = spawnpos.transform.position;//spawnposの位置をvector3形式にし,posに入れる 
Instantiate(coninPrefab, pos, Quaternion.identity);//coninPrefabを生成させる
 } 
}

 


  1. 再度空のオブジェクトを作成し,名前をscriptに変更する
  2. 作成したcoin_genをscriptにアサインする
  3. インスペクタに表示されたspawnposにspawnPointをアサインする
  4. (下図を確認)
  5. HierarchyにあるcoinをAssetsにドロップする. coinがPrefab化(青い色に変わる)する.Hierarchyのcoinはこの段階で取り除く
  6. ヒエラルキーにscriptを選択し,coinPreをCoinPrefabをにアサインする
  7. ゲームを再生し,ボタンを押しコインが落ちてくるのを確認する

 

時間があればさらに改造してみましょう.

 

追記(2018/10/12)

落ちてきたコインを消すスクリプト.コライダにアタッチする.ファイル名はdestroy.csとする.

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class destroy : MonoBehaviour { 

public void OnTriggerEnter(Collider other){ Destroy(other.gameObject); } 

}

 

追記(2019/12/03)

move-blockがコインで弾かれる方は以下の設定をする

(A)move-block>RigidBody>Constrain のFreeze PositionをZ以外に全てチェックを入れる

(B)Coin(Prefab)のRigidBodyのMassをなるべく軽くする(0.05 kg)など

 


 

 

 

 

コインドーザーの作成2

つづき

  1. 各オブジェクトに名前をつける(画像を参考に)
  2. ここからはコインを押すプッシャーを作成する
  3. move_blockを選択し,Component>Physics>Rigidbodyを選択する
  4. 追加されたRigid BodyコンポーネントのUse Gravityオフにする(重力に影響されなくなる)
  5. (更新)2018バージョンに合わせて動画手順を掲載します
  6. (動画の解説)まずmove_blockを選択し,InspectorからAddComponentを選択しAnimatorを追加する
  7. (動画の解説)Animationウィンドウ(またはAnimationタブ)のCreateボタンを押す
  8. (動画の解説)Animationの名前をblockにする
  9. (動画の解説)次に表示されたタイムラインのSamplesを30にする
  10. (動画の解説)左にあるAdd Propertyをクリックする
  11. (動画の解説)表示された中からTransfomのPositionの右にある+ボタンをクリック
  12. (動画の解説)ここから2秒前身,2秒後退するアニメーションを作成する
  13. (動画の解説)まず1秒付近にあるキーフレームを選択し,2秒に移動させる
  14. (動画の解説)次に再生バーも2秒に移動
  15. (動画の解説)次にPosition.zのキーフレームを選択する
  16. (動画の解説)Position.zの値を2にする
  17. (動画の解説)Animationの再生(ゲームの再生ではなく)し確認する
  18. (動画の解説)4秒付近に再生バーを移動し,キーフレームを追加する
  19. (動画の解説)さきほどと同様にposition.zの値を変化させる.今回は元の位置に戻すため4を入力する
  20. (動画の解説)再生し確認する
  21. Asset内のblock(アニメーションファイル)を探し,InspectorのLoop Timeにチェックを入れる(デフォルトでチェックが入っているかと思います)
  22. コインを落として確認してみる

     

次へ

コインドーザーの作成1

コインドーザーの作成

コインドーザー(コインプッシャー)を作成してみましょう.この内容は

  • Physics(物理演算)の復習と応用
  • 簡単なスクリプトによる制御

を演習します.

作成手順

  1. 新規シーンを作成
  2. Planを作成する.位置は(0,0,0)
  3. Planeの上にCubeを作成し図のように変更する
  4. このCubeを複製し,図のような位置に移動させる
  5. Cylinderを作成し,ScaleのYを0.1にする
  6. Cylinderを選択したまま,Component>Physics>Rigidbody を選択しRigidibodyコンポーネントを追加する
  7. このまま再生するとコインの動きにはならない
  8. それはCylinderにCapsule Colliderコンポーネントがついているためである
  9. そこでCapsule Colliderを取り除く.Capsule Colliderコンポーネントの右にある歯車アイコンからRemove Componentを選択する
  10. 次にMesh Colliderをアサインする.Component>Mesh Colliderを選択する
  11. 衝突を正確に計算するためにConvexにチェックを入れる
  12. 再生し確認してみること
  13. ここで一旦保存すること

つぎへ)

簡単なゲームにしてみる(2)

効果音をアサインする

  1. 音再生の準備をする
  2. scriptを選択Component>Audio>Audio Source を選択する
  3. scriptAudio Sourceが追加されます
  4. Audio Sourceは音再生装置と考えてください

myFishを少し改造する

  1. myFishを選択し,Component>Physics>sphereColider(当たり判定用球)を追加する
  2. edukitの中のhitObjSendermyFIshにアサインする
  3. このスクリプトはプレーヤー(myFish)に,当たったColliderが何なのかを,scriptに送るプログラムである
  4. 追加したコライダのisTriggerにチェックを入れる
  5. edukit内にあるArrow2PrefabをmyFishにアサインする
  6. ゲームを再生し,エサが自動向かい,音が出るか,時間表示は適切かなどを確認する
  7. Arrow2の矢印表示スクリプトは以下のサイトのスクリプトを参考にしています
    http://beatdjam.hatenablog.com/entry/2014/10/22/032751

シーン遷移の準備

  1. File>Build Settings… を選択
  2. Add open sceneをクリックし,ビルドするシーンの一覧に現在のシーンを追加する
    buidset1
  3. edukit内のopとendも追加し,edu/opのシーンが最上段にくるようにドラッグして移動させる
    build2
  4. BuildeSettingsのウインドウを閉じたあと,シーンを保存しておく

シーン遷移情報の設定

  1. edukit内opを開く
  2. opScriptを選択し,メインシーン名にゲームのメインシーン名を入力する(各自異なるので注意.画像例は02)
    opscne
  3. 保存し,ゲームを再生してみる
  4. ゲームスタートボタンが押せない場合、Canvas展開しsetsumeiPanelオフにするか(説明文が書けない),setsumeiPanelとその子のsetumeiのRaycast Targetをオフにする(パネルを残してマウスクリックを無視する設定)

レベル調整

  1. 何度かテストプレイし遊びやすく調整する
  2. また,プレイしたことのない人に遊んでもらい,難易度を調整すること
  3. オープニング→ゲーム→エンディング と1周する状態になりバグも出ないようであればビルドを実行する
  4. File>Build SettingsでBuild Settingsの画面を開き,Buildをクリックする
  5. 保存先を設定すればビルドが開始される
  6. ビルドが成功したら,早速アプリを実行してバグがないか確認すること
  7. 時間が0秒以下になってもゲームできてしまうバグを修正できる場合は修正してみること(ヒント
  8. Mulitipurposeカメラのpivotの位置などを修正しプレイしやすくする

提出について

  1. ビルド後,Mac版は1つのファイルが作成されるが,Windows版はアプリとそれが使用するファイルの入ったフォルダが作成される
  2. 提出時の際Windows版はアプリとそれが使うフォルダの3つを提出する必要があるので注意(Windows ではアプリケーションのすべてのリソースを含む Data フォルダーと共に実行可能なファイル (.exe) とdllファイルが生成されます)
    公式サイトにはまだ掲載されておりませんのでご注意ください

どのようなゲームにしますか?

  • 楽しい空間にすることはもちろんのこと
  • オリジナルのエサをMayaでモデリングする(テクスチャも)
  • エサとなる小魚をモデリングし,泳がせておいかける
  • 照明や地形や空気感にこだわる
  • オンライン対戦仕様に変更する
  • 魚以外のキャラクタも登場する
  • etc,,,,

簡単なゲームにしてみる(1)

概略

  • 複数シーンをまたぐゲーム化をおこなう
  • 今回は作成手順を理解するため,スクリプトは提供されたものを使用する
  • 画像等は古いものを使っている場合がある
  • 今回は指定個数のエサを何秒間でとることができるかを競うゲームとします

準備・パッケージの読み込み

  1. スクリプトなどが入ったedukit3.unitypackageをダウンロードする(ダウンロードはここから)
  2. Assets>ImportPackage>Custom Package… でダウンロードしたパッケージを読み込む
  3. Asset内にedukit3というフォルダが作成される

タグの準備

  1. Hierarchy内にある適当なオブジェクトを選択する
  2. InspectorのTagをプルダウンし,AddTagを選択する
  3. pointObjをというタグ追加する
    addtag2

スクリプトを空のオブジェクトに配置する

  1. Gameobject>Create Empty で空のオブジェクトを作成し名前をscriptにする

  2. Asset内にある(さきほど読み込んだ)Edukit>myQuest をscriptにアサインする
  3. baitPrefabbaitObjにアサインする(魚の下の矢印画像は後で表示できます)
  4. edukit3の中にあるSEフォルダを展開し,効果音をアサインする(画像参照)
  5. その他の数字も設定する
  6. ※時間がマイナス秒になっても動作するのは仕様です(追記)

解説

  1. GameObjectにどんなコンポーネントをアサインするかでそのオブジェクトの性質が変わる.カメラコンポーネントをアサインすればカメラに,Meshfilterをアサインすれば3Dオブジェクトに,今回はスクリプトだけをアサインしている
  2. この「空のオブジェクト」は便利な入れ物と考えてよい.CGソフトではNullや,ロケーターと呼ばれている

UIprefabを配置する

  1. Asset内にある(さきほど読み込んだ)Edukitの中のUIprefabをヒエラルキーにドロップする
  2. UIprefabを展開し,timeTextとnokorisuをmyQuestの該当の箇所にドロップする
  3. エンディングシーン名も指定する
  4. なおUIについてはこちらも参考に

つぎへ

 

 

Tapで泳ぐプログラムを追加する

概要

  • 移動できる範囲を決めるNavMeshを設定
  • 魚にNavigationAgentを設定する
  • Tap移動のプログラムを魚にアサインする

設定など

  1. 地面代わりのPlaneなどを置く.そのPlaneにNavMeshの設定こちらを参考に)をする
  2. HierarchymyFishを選択し,InspectorAdd Componentを押しnavで検索すると出てくるNav Mesh Agentを選択して追加する
  3. 追加したNav Mesh AgentのBase Offsetを0.5にする
  4. TapMove用UnityPackageをここからダウンロードする
  5. ダウンロードしたUnityPackageファイルをAssets>Import Package>Custom Packageで読み込む
  6. Assets内にTapMoveフォルダができる.この中のtapMoveスクリプトをステージ上のmyFishにアサインする
  7. 次にInspectorのtapMovecirclePrefabをアサインし,RayLengthを15くらいにする
  8. Multipurpose CameraRigを設定する(忘れた場合はこちら).ターゲットはmyFishとする.魚とカメラの距離はPivotで調整する.MainCameraを削除するのを忘れないこと
  9. 一旦保存し,ゲームを再生,Planeの上をクリックしてみる
  10. 魚が泳いでいきます.クリックはタップにも対応しているので,スマートホン用にビルドした場合はタップで魚が泳ぎます
  11. タップで誤動作がおきる場合は,myFishのレイヤーをDefautl以外にする.タップを検知するレイヤーはDefaultレイヤーのみになっているため
  12. 以下参考動画

(Unityへの読み込みはここまで)

配置確認

配置確認(未完成)2017/10/25 AM11時変更

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

using System.Collections.Generic;//必ず必要

public class dicPractice : MonoBehaviour {

	public GameObject ballPre;//ボールプレファブ用
	public InputField numInput;//インプットフィールド用
	public InputField scnNumInput;//インプットフィールド用

	public Button subBtn;//シーン戻るボタン
	public Button addBtn;//シーン次ボタン


	Dictionary<int, List<string>> timeList1;//多重化Dictionary
	List<string> tempList ;//テンポラリ用のList

	List<GameObject> goList;//生成したゲームオブジェクトの全リスト
	int scenceNum;//現在のシーン番号用変数

	void Start () {
		//Dictionary,Listの追加
		timeList1 = new Dictionary<int, List<string>> ();
		tempList = new List<string>();

		goList = new List<GameObject> ();

		//※※シーン番号ゼロはシーンが空の意味に変更
		scenceNum = 0;//現在のシーン番号初期化//保存データ読み込み時にはシーン番号を1以上にする
	
		//シーン数がいくつかあるかチェックする空なら0を,
		int scnDicCount = timeList1.Count;
		if(scnDicCount < 1){
		scnNumInput.text = scnDicCount .ToString ();//シーン番号の数字を文字に変換
		}else{
			scnNumInput.text = scenceNum.ToString ();//Dictionaryが空でなかったらシーン番号を表示させる(保存機能追加後に機能する)
		}

		//シーン番号0以下なら次シーンボタンオフに
		if (scenceNum <= 1) {
			subBtn.interactable = false;
		}

		//シーン番号がゼロで戻るボタンオフに
			addBtn.interactable = false;


		//json用オブジェクトを作成
		myData jdata = new myData();

		//キャラ10体作成
		for (int i = 0; i < 10; i++) {
			GameObject go = Instantiate (ballPre, new Vector3 (i * 2.0f, 0, 0), Quaternion.identity) as GameObject;
			string myAIname =  "AI" + i.ToString ();
			go.name = myAIname;

			//goListに 生成したgoをgoListに追加
			goList.Add(go);

		}

	}
		

	//番号で呼び出す用
	public void numDel(){
		int objNum = int.Parse (numInput.text);//インプットフィールドで受け取った番号をintに変換
		int scnNum = int.Parse (scnNumInput.text);//インプットフィールドで受け取った番号をintに変換
		scnNum--;//Dictionaryには0から収納されているので1引く
		List<string> temp2List = new List<string> ();//一時的なList作成

		Debug.Log ("呼び出し番号_" + objNum);
		Debug.Log ("シーン番号_" + scnNum);
		temp2List = timeList1 [scnNum];//シーン番号scnNumのJSONをLISTに読み込む
		var myObject = JsonUtility.FromJson<myData>(temp2List [objNum]);//シーンゼロのobjNum番のJSONのみをオブジェクトに変換
		Debug.Log ("X=" + myObject.posx);//デバッグ用
		Debug.Log ("Z=" + myObject.posz);
		Debug.Log ("name=" + myObject.name);
		//Debug.Log ("time=" + myObject.time);

	}


	// シーン追加用
	public void dicAdd(){

	//	int dicCount = timeList1.Count;//シーン番号の最大値確認用
	//	scnNumInput.text = dicCount.ToString ();//シーン番号の数字を文字に変換

		//記録する準備
		myData jdata = new myData ();
		int i = 0;
		//goListの中身をJSONにするforeach
		foreach (var n in goList) {

		jdata.id = i;
			jdata.name = n.name;
			jdata.posx = n.transform.position.x;
	jdata.posy = n.transform.position.y;
	jdata.posz = n.transform.position.z;
	jdata.time = i * 10;//dummy data

		string json = JsonUtility.ToJson (jdata);//オブジェクトをJSON文字列に変更
		//	Debug.Log(n.name);
			tempList.Add (json);//LISTにJSONを追加
			i++;
		}


		//timeList1に書き換えなのか追加なのかチェック

		if (timeList1.ContainsKey(scenceNum ) )//現在のシーン番号がtimeList1に含まれているとき
		{
			timeList1[ scenceNum ] = tempList;//timeList1のscenceNumのリストを入れ替え
		}
		else
		{ //現在のシーン番号がtimeList1に含まれていないとき
			timeList1.Add( scenceNum , tempList );//timeList1に新規追加
			//シーンが増えたので現在のシーンも追加
			scenceNum++;
		}


		//ボタン関連処理
		//現在のシーン番号が0より大きければ<ボタン表示
		if (scenceNum > 1) {
			subBtn.interactable = true;
		}

		//現在のシーン番号がtimeList1と同じなら>ボタン隠す
		if (scenceNum == timeList1.Count) {
			addBtn.interactable = false;
		}

		//現在のシーン番号がtimeList1より小さいなら>ボタン表示
		if (scenceNum < timeList1.Count) {
			addBtn.interactable = true;
		}
			
		scnNumInput.text = scenceNum.ToString ();//シーン番号の数字を文字に変換し表示
	}



	//シーン番号次へボタン
	public void  scnNumAdd(){
		//現在のシーン番号を1足す
		scenceNum++;

		//シーン番号をInputFileldに表示書き換え
		scnNumInput.text = scenceNum.ToString ();

		//現在のシーン番号が0より大きければ<ボタン表示
		if (scenceNum > 1) {
			subBtn.interactable = true;
		}

		//現在のシーン番号がtimeList1より大きければ>ボタン隠す
		if (scenceNum >= timeList1.Count) {
			addBtn.interactable = false;
		}
	}
		

	//シーン番号戻るボタン
	public void scnNumSub(){
		//現在のシーン番号を1減らす
		scenceNum--;

		//シーン番号をInputFileldに表示書き換え
		scnNumInput.text = scenceNum.ToString ();

		//現在のシーン番号が0以下であれば<ボタン隠す
		if (scenceNum <= 1) {
			subBtn.interactable = false;
		}

		//現在のシーン番号がtimeList1より小さければ>ボタン表示
		if (scenceNum < timeList1.Count) {
			addBtn.interactable = true;
		}

	}

}

 

 

[System.Serializable]
public class myData {
	public int id;
	public string name;
	public int time;
	public float posx;
	public float posy;
	public float posz;

}

 

タップした位置に移動

動画のような動きを実現します

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にテクスチャで貼付

パッケージのダウンロード(ここ