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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

2回答

3879閲覧

プレイヤーがクリックしたところまで移動したら待機状態になる

yuukuriuttto

総合スコア24

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

1クリップ

投稿2018/06/28 08:08

編集2018/07/01 09:10

前提・実現したいこと

プレイヤーがクリックしたところまで移動したら待機状態になるというものを実装

したいです

発生している問題・エラーメッセージ

処理は合っているが、今の構文だと待機するアニメーションのif文まで行かないと感じました。 どこを変えればいいでしょうか?

該当のソースコード

c#

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine.AI; 5using UnityEngine.UI; 6using UnityEngine; 7 8public class Move: MonoBehaviour { 9 public Transform targetPosition; //移動する位置 10 public GameObject DestroyButton; 11 public GameObject GatheringButton; 12 public GameObject StopProcessingButton; 13 public string Terraintag = "Terrain"; 14 private NavMeshAgent agent; 15 private RaycastHit hit; 16 private Ray ray; 17 private Animator animator; 18 19 20 // 到着フラグ 21 private bool arrived; 22 static Canvas _canvas; 23 private const string Trigger_isWait = "is_Wait"; 24 25 // Use this for initialization 26 void Start () 27 { 28 // Canvasコンポーネントを保持 29 _canvas = GetComponent<Canvas>(); 30 DestroyButton.SetActive(false); 31 GatheringButton.SetActive(false); 32 agent = GetComponent<NavMeshAgent>(); 33 animator = GetComponent<Animator>(); 34 arrived = false; 35 } 36 37 // Update is called once per frame 38 void Update () 39 { 40 if(Input.GetMouseButton(0)) 41 { 42 Debug.Log("move"); 43 ray = Camera.main.ScreenPointToRay(Input.mousePosition); 44 if(!arrived) 45 { 46 if(Physics.Raycast(ray ,out hit ,100)) 47 { 48 Debug.Log(hit.point);//デバッグログにクリックした場所を出す 49 if(hit.collider.gameObject) 50 { 51 agent.SetDestination(hit.point); 52 53 const float NearDistance = 0.4f; 54 if(Vector3.Distance(targetPosition.position ,hit.point) < NearDistance) 55 { 56 targetPosition.position = hit.point; 57 arrived = true; 58 Debug.Log("arrived"); 59 this.animator.SetTrigger(Trigger_isWait); 60 } 61 } 62 } 63 } 64 } 65 } 66} 67

試したこと

クリックしたところとプレイヤーが同じ位置になると待機アニメーションになる

のような処理を書いたが、Rayで飛ばしたところにプレイヤーが移動する処理は

実際移動した時に若干のズレがあることが判明しました。どのような処理をすれば

待機アニメーションに遷移するでしょうか?

補足情報(FW/ツールのバージョンなど)

Unity 2017.3.1f1

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

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

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

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

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

guest

回答2

0

ベストアンサー

のですが、Vector3.Distanceを使用したコードに変更したがUnassignedReferenceExceptionエラーが出て進まず

これは、inspector上でフィールドのどれかを設定していないから出ています。ご確認を

また、少しずれるのは、

csharp

1if (Vector3.Distance(targetPosition.position, hit.point) < 0.5f)

の0.5fが大きすぎる可能性があるので、この値を十分小さくし、それでもわずかにずれるので、

csharp

1 // 定数はconstにしておいた方が良いです。 2 const float NearDistance = 0.1f; // 値は適当です。実際にいろいろ試して位置がワープしないように調整してください。 3 if (Vector3.Distance(targetPosition.position, hit.point) < NearDistance) 4 { 5 // 位置を強制的に移動 6 targetPosition.position = hit.point; 7 Debug.Log("arrived"); 8 arrived = true; 9 this.animator.SetTrigger(Trigger_isWait); 10 }

と位置を強制的にその場所に変えればOKです。

投稿2018/06/29 04:07

takezoux2

総合スコア3

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

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

yuukuriuttto

2018/06/29 05:33

public GameObjectで指定したオブジェクトがヒエラルキーで指定されていないということでよろしいでしょうか? エラーの所をダブルクリックすると if (Vector3.Distance(・・・の所に飛ぶのですがなぜでしょう・・
takezoux2

2018/06/29 07:00 編集

それですと、inspector上(UnityのUI上)でMoveをつけたGameObjectのtargetPositionのところを見てみてください。MissingとかNoneになっていませんか?
yuukuriuttto

2018/06/29 08:05

定義の部分でtargetPositionがprivateになっていたのでpublicに変えるとエラーはなくなりました!
yuukuriuttto

2018/07/01 12:11 編集

すいません。回答者さまのやり方で実装しているのですが中々if(Vector3.Distance・・・ の中に入ってくれません。何が原因なのでしょうか?
takezoux2

2018/07/02 05:14

その判定を書いている位置が悪いです。そのifの評価がいつ行われるかを考えてみてください。
guest

0

浮動小数点同士を==で比較してもTrueになることはほぼありません。
この場合は、現在地と目的地の距離が十分小さくなったら、と判定すればいいかと思います。

投稿2018/06/28 10:54

tatamyiwathy

総合スコア1039

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

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

yuukuriuttto

2018/06/28 19:17

なるほど!vector3.distanceを使えばいけるのかな
tatamyiwathy

2018/06/29 04:10

それでいいと思います。ただ十分小さい距離というのがプレイヤーの移動速度によって変わってきますので少々コントロールが難しいところがあります。 自分なら、(x,y,z)に向かってtフレーム移動する、というような実装にしますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問