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

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

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

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

Unity

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

Q&A

解決済

2回答

1378閲覧

プレイヤーのアニメーションの実装

yuukuriuttto

総合スコア24

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2018/06/25 10:20

編集2018/06/25 11:31

前提・実現したいこと

キャラクターは2D、フィールドは3Dのゲームを作っています
プレイヤーの押した位置に対応したアニメーションの実装

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

プレイヤーより右をクリックしたら右のアニメーション、プレイヤーより左をクリックしたら左のアニメーション のような処理を書いているのですがプレイヤーから左上、左下、右上、右下 を押したときに左のアニメーションと上のアニメーションが被ってしまいます。 奥なら奥、右なら右、下なら下、手前なら手前のアニメーションを行いたいのですがどのようにすればいいでしょうか?

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine.AI; 4using UnityEngine; 5 6 7public class PlayerAnimMove : MonoBehaviour 8{ 9 private Vector3 targetPosition; //移動する位置 10 private NavMeshAgent agent; 11 private Animator animator; 12 private RaycastHit hit; 13 private Ray ray; 14 public float count; 15 16 private const string Trigger_isRight = "is_Right"; 17 private const string Trigger_isLeft = "is_Left"; 18 private const string Trigger_isWait = "is_Wait"; 19 private const string Trigger_isBefor = "is_Befor"; 20 private const string Trigger_isAfter = "is_After"; 21 22 23 void Start() 24 { 25 agent = GetComponent<NavMeshAgent>(); 26 animator = GetComponent<Animator>();//後から変更 27 this.animator.SetTrigger(Trigger_isWait); 28 } 29 30 void Update() 31 { 32 if (Input.GetMouseButton(0)) 33 { 34 //count += Time.deltaTime; 35 36 Debug.Log("anim"); 37 ray = Camera.main.ScreenPointToRay(Input.mousePosition); 38 if (Physics.Raycast(ray, out hit, 100)) 39 { 40 targetPosition = hit.point; 41 //agent.SetDestination(targetPosition); //移動させる処理 42 43 if (transform.position.x > targetPosition.x) //プレイヤーの位置よりもクリック位置が左のときに実行 44 { 45 animator.SetFloat("speed", agent.velocity.magnitude); 46 this.animator.SetTrigger(Trigger_isLeft); 47 Debug.Log("hidari"); 48 } 49 50 if (transform.position.x < targetPosition.x) //プレイヤーの位置よりもクリック位置が右のときに実行 51 { 52 animator.SetFloat("speed", agent.velocity.magnitude); 53 this.animator.SetTrigger(Trigger_isRight); 54 Debug.Log("migi"); 55 } 56 57 if (transform.position.z > targetPosition.z) //プレイヤーの位置よりもクリック位置が奥のときに実行 58 { 59 animator.SetFloat("speed", agent.velocity.magnitude); 60 this.animator.SetTrigger(Trigger_isAfter); 61 Debug.Log("oku"); 62 } 63 64 if (transform.position.z < targetPosition.z) //プレイヤーの位置よりもクリック位置が手前のときに実行 65 { 66 animator.SetFloat("speed", agent.velocity.magnitude); 67 this.animator.SetTrigger(Trigger_isBefor); 68 Debug.Log("temae"); 69 } 70 71 } 72 73 if (transform.position == targetPosition) //押した位置と今いる位置が同じなら実行 74 { 75 this.animator.SetTrigger(Trigger_isWait); 76 } 77 else 78 { 79 //agent.SetDestination(targetPosition); //移動させる処理 80 } 81 } 82 } 83}

試したこと

プレイヤーから見て右、左、上、下のトリガーでそれぞれのアニメーションになっている所まではできました

調べた所、角度で求めると実装出来ると思い atan2 というものを使うと出来る事が分かったが使い方がよく分からず

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

Unity 2017.3.1f1

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

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

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

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

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

guest

回答2

0

ベストアンサー

Atan2で求めた角度からどの方角に進もうとしているかを判定する、というのもよさそうに思いますが、他には左右方向・前後方向のどちらが優位かで振り分ける条件分岐を追加するという手もありそうです。

C#

1// 省略 2 3 targetPosition = hit.point; 4 //agent.SetDestination(targetPosition); //移動させる処理 5 6 // プレイヤーから見た相対的なtargetPositionの位置を求める 7 var relativePosition = targetPosition - transform.position; 8 9 // 位置の差分の絶対値が、X方向とZ方向のどちらがより大きいか調べる 10 if (Mathf.Abs(relativePosition.x) > Mathf.Abs(relativePosition.z)) 11 { 12 // X方向の方が大きい...左右方向優位 13 14 if (relativePosition.x > 0.0f) 15 { 16 //プレイヤーの位置よりもクリック位置が左のときに実行 17 animator.SetFloat("speed", agent.velocity.magnitude); 18 this.animator.SetTrigger(Trigger_isLeft); 19 Debug.Log("hidari"); 20 } 21 else 22 { 23 //プレイヤーの位置よりもクリック位置が右のときに実行 24 animator.SetFloat("speed", agent.velocity.magnitude); 25 this.animator.SetTrigger(Trigger_isRight); 26 Debug.Log("migi"); 27 } 28 } 29 else 30 { 31 // Z方向の方が大きい...前後方向優位 32 33 if (relativePosition.z > 0.0f) 34 { 35 //プレイヤーの位置よりもクリック位置が奥のときに実行 36 animator.SetFloat("speed", agent.velocity.magnitude); 37 this.animator.SetTrigger(Trigger_isAfter); 38 Debug.Log("oku"); 39 } 40 else 41 { 42 //プレイヤーの位置よりもクリック位置が手前のときに実行 43 animator.SetFloat("speed", agent.velocity.magnitude); 44 this.animator.SetTrigger(Trigger_isBefor); 45 Debug.Log("temae"); 46 } 47 } 48 49// 省略

投稿2018/06/25 21:49

Bongo

総合スコア10807

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

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

0

this code have issue , string take animator state such as isrun,walk which you create in animator
let i have a player which walk or idle

animator.setTrigger("walk");

or your animator may be return null

投稿2018/06/25 11:57

AliHassan

総合スコア351

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問