###前提・実現したいこと
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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/04/28 08:41
2017/04/28 08:53
退会済みユーザー
2017/04/28 09:39