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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

Unity

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

Q&A

解決済

2回答

13618閲覧

Unityで床の端から一歩踏み出すとエラーが出てプレイヤーがぶっ飛んでしまいます。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2017/04/27 20:05

###前提・実現したいこと
UnityでC#を使ってプレイヤーがZ方向に走ってジャンプして、床の穴を避けるゲームを作りたい。
適当な範囲の床を作ってプレイヤーを走らせている。

###発生している問題・エラーメッセージ
床の端から落ちた時に動作エラーが起こってしまう。

Assertion failed on expression: 'CompareApproximately(det, 1.0F, .005f)' UnityEngine.Quaternion:LookRotation(Vector3) UnityChanControl:Update() (at Assets/UnityChanControl.cs:49)
Assertion failed on expression: 'fRoot >= Vector3f::epsilon' UnityEngine.Quaternion:LookRotation(Vector3) UnityChanControl:Update() (at Assets/UnityChanControl.cs:49)

###該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class UnityChanControl : MonoBehaviour { 6 CharacterController controller; 7 Animator animator; 8 Vector3 moveDirection = Vector3.zero; 9 10 public float gravity; 11 public float speedZ; 12 public float speedJump; 13 public float rotateSpeed; 14 15 // Use this for initialization 16 void Start () { 17 //必要なコンポーネントを自動取得. 18 controller = GetComponent<CharacterController>(); 19 animator = GetComponent<Animator> (); 20 } 21 22 // Update is called once per frame 23 void Update () { 24 //地上にいる場合のみ操作を行う. 25 if (CheckISGrounded ()) { //接地しているかの判定. 26 moveDirection.z = Input.GetAxis ("Horizontal"); 27 28 //方向転換. 29 //transform.Rotate (0, Input.GetAxis ("Horizontal") * 3,0); 30 31 //ジャンプ. 32 if (Input.GetButtonDown ("Jump")) { 33 moveDirection.y = speedJump; 34 animator.SetTrigger ("Jump"); 35 } 36 } 37 38 //重力分の力を毎フレーム追加. 39 moveDirection.y -= gravity * Time.deltaTime; 40 moveDirection.z *= speedZ; 41 //移動実行 42 controller.Move (moveDirection * Time.deltaTime); 43 Vector3 direction = new Vector3 (0.0f, 0.0f, moveDirection.z); 44 45 46 if (direction.magnitude > 0.01f) { 47 Debug.Log ("正常動作"); 48 float angle = rotateSpeed * Time.deltaTime; 49 Quaternion myQ = Quaternion.LookRotation (direction); 50 this.transform.rotation = Quaternion.Lerp (transform.rotation, myQ, angle); 51 } 52 53 //移動後接地してたらY方向の速度はリセットする. 54 if (CheckISGrounded ()) { 55 moveDirection.y = 0; 56 } 57 animator.SetBool("Run",moveDirection.z != 0.0f); //IdleとRunアニメーションの設定. 58 } 59 60 bool CheckISGrounded(){ 61 if (controller.isGrounded) { 62 return true; //接地. 63 } 64 //MASK 自機以外判定. 65 int layerMask = 1 << LayerMask.NameToLayer("Player"); 66 layerMask = ~layerMask; 67 //Raycastして距離を測定(5メートルいないで判定). 68 RaycastHit hit; 69 float tolerance = 1.0f; 70 if (Physics.Raycast (controller.transform.position + Vector3.up * 0.1f, Vector3.down, out hit, 5f, layerMask)) { 71 if (hit.distance > tolerance) { //tolerance以内の距離なら接地. 72 return false; 73 } else { 74 return true; 75 } 76 } 77 return false; 78 } 79} 80

###試したこと
Google先生に聞きまくったのですが、わかりませんでした...。

###補足情報(言語/FW/ツール等のバージョンなど)
Unity5

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

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

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

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

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

guest

回答2

0

ベストアンサー

おそらくですが、49行目の Quaternion 生成で問題があるのではないかと。

Quaternion myQ = Quaternion.LookRotation (direction);

ここですが、 direction のx,y,zがすべて 0 のタイミングがないですか?
LookRotation するにしても、値が全部ゼロだと生成できずにエラーになっているのではないかと。

投稿2017/04/28 01:20

edo_m18

総合スコア2283

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

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

退会済みユーザー

退会済みユーザー

2017/04/28 08:41

if (direction.magnitude > 0.01f)で分岐をしているので全て0のタイミングでLookRotationはしていないと思うんです...。足場が無い状態でz方向に動くとエラーが起きるみたいで、x,y方向は関係無いみたいです。他に何か気になる点はございませんか?
edo_m18

2017/04/28 08:53

以下のコードを試したところ、同じエラーが出ました。 ``` Vector3 v = new Vector3(0f, 0f, float.MinValue); if (v.magnitude > 0.01f) { Debug.Log(v.magnitude); Quaternion test = Quaternion.LookRotation(v); } ``` おそらく、計算された値が小さすぎるがゆえに、結果が `Infinity` になってしまい、 分岐をすり抜けているのではないかなと思います。 (無限は当然、0.01より大きいですから) そのあたりを厳密にチェックしてみたら動かないですか?
退会済みユーザー

退会済みユーザー

2017/04/28 09:39

if(v.magnitude > 0.01f && v.magnitude < 10000.0f)という条件文にしたところエラーは出なくなりました!ありがとうございます! プレイヤーがぶっ飛ぶのもInfinityのベクトルにcontroller.Moveしていたためのようで controller.Moveにも同じような条件文をつけたところぶっ飛ぶことも無くなりました! ありがとうございました!
guest

0

間違った回答をしたため、回答の内容を消しました。

エラーの解決方法については存じませんが、
検索したところ、下記のような記事を発見しました。
こちらを参考にすることで解決するかもしれないです。
http://baba-s.hatenablog.com/entry/2017/01/26/221300

失礼致しました。

投稿2017/04/27 22:58

編集2017/04/28 00:34
animeing

総合スコア136

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

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

退会済みユーザー

退会済みユーザー

2017/04/28 08:35

回答ありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問