前提・実現したいこと
Unityで3Dアクション系のゲームを作っています。
多段ジャンプする際、右足元に薄い板が出てくる(ワールドトリガーという漫画のグラスホッパー的なやつ)ような機能を実装中に以下のエラーメッセージが出ました。
参考 https://www.gamer.ne.jp/news/201508240002/image/13/ (これだと両足ですね^^;)
発生している問題・エラーメッセージ
NullReferenceException: Object reference not set to an instance of an object UnityChan.UnityChanControlScriptWithRgidBody.FixedUpdate () (at Assets/unity-chan!/Unity-chan! Model/Scripts/UnityChanControlScriptWithRgidBody.cs:164)
該当のソースコード
C# UnityChanControlScriptWithRigidBody.cs ジャンプ中の処理の部分以外変えていないと思います。
public class UnityChanControlScriptWithRgidBody : MonoBehaviour { public float animSpeed = 1.5f; // アニメーション再生速度設定 public float lookSmoother = 3.0f; // a smoothing setting for camera motion public bool useCurves = true; // Mecanimでカーブ調整を使うか設定する // このスイッチが入っていないとカーブは使われない public float useCurvesHeight = 0.5f; // カーブ補正の有効高さ(地面をすり抜けやすい時には大きくする) // 以下キャラクターコントローラ用パラメタ // 前進速度 public float forwardSpeed = 7.0f; // 後退速度 public float backwardSpeed = 2.0f; // 旋回速度 public float rotateSpeed = 2.0f; // ジャンプ威力 public float jumpPower = 3.0f; // キャラクターコントローラ(カプセルコライダ)の参照 private CapsuleCollider col; private Rigidbody rb; // キャラクターコントローラ(カプセルコライダ)の移動量 private Vector3 velocity; // CapsuleColliderで設定されているコライダのHeiht、Centerの初期値を収める変数 private float orgColHight; private Vector3 orgVectColCenter; private Animator anim; // キャラにアタッチされるアニメーターへの参照 private AnimatorStateInfo currentBaseState; // base layerで使われる、アニメーターの現在の状態の参照 private GameObject cameraObject; // メインカメラへの参照 // アニメーター各ステートへの参照 static int idleState = Animator.StringToHash ("Base Layer.Idle"); static int locoState = Animator.StringToHash ("Base Layer.Locomotion"); static int jumpState = Animator.StringToHash ("Base Layer.Jump"); static int restState = Animator.StringToHash ("Base Layer.Rest"); //自分で加えたやつ Grasshopper grassHopper; /**************************中略***********************/ // JUMP中の処理 else if (currentBaseState.nameHash == jumpState) { //cameraObject.SendMessage ("setCameraPositionJumpView"); // ジャンプ中のカメラに変更 if (!anim.IsInTransition (0)) { // 以下、カーブ調整をする場合の処理 if (useCurves) { // 以下JUMP00アニメーションについているカーブJumpHeightとGravityControl // JumpHeight:JUMP00でのジャンプの高さ(0〜1) // GravityControl:1⇒ジャンプ中(重力無効)、0⇒重力有効 float jumpHeight = anim.GetFloat ("JumpHeight"); float gravityControl = anim.GetFloat ("GravityControl"); if (gravityControl > 0) rb.useGravity = false; // レイキャストをキャラクターのセンターから落とす Ray ray = new Ray (transform.position + Vector3.up, -Vector3.up); RaycastHit hitInfo = new RaycastHit (); if (Physics.Raycast (ray, out hitInfo)) { if (hitInfo.distance > useCurvesHeight) { col.height = orgColHight - jumpHeight; float adjCenterY = orgVectColCenter.y + jumpHeight; col.center = new Vector3 (0, adjCenterY, 0); } else { // 閾値よりも低い時には初期値に戻す(念のため) resetCollider (); } } } anim.SetBool ("Jump", false); //自分で追加しました if (Input.GetButtonDown("Jump") && !anim.IsInTransition(0)) { anim.Play("Jump", 0,0); rb.AddForce(Vector3.up * jumpPower, ForceMode.VelocityChange); grassHopper.apper(true); //該当部分です } } }
Grasshopper.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Grasshopper : MonoBehaviour { GameObject GHCube; void Start() { GHCube = (GameObject)Resources.Load("GHCube"); } public void apper(bool enable) { if (enable) { Instantiate(GHCube, new Vector3(0.0f, 0.0f, 0.0f), Quaternion.identity); } } }
GHCubeのパス
Assets/Resources/GHCube.prefab
試したこと
前にプレハブを使ってCubeを出現させるということをしていて、その時のプロジェクトで if(Input.GetKeyDown(KeyCode.Space)) と付け足して押したら出てくるというようにしたらでき、またファイルの名前などチェックしてあっていました。
unity公式のAPIリファレンスや、プレハブを用意して出現させるやり方を書いている サイト https://www.sejuku.net/blog/55260 で構文ややり方を確認しましたが、ほぼ間違いないです。
またエラー文からなにかがセットされてないのはわかったのですが、なにがセットされていないのかわかりません。ファイル間でのデータのやりとりがうまくいっていないのでしょうか?
補足情報(FW/ツールのバージョンなど)
前やっていたプロジェクトは 2019.2.11f1 Personal
今のは 2019.3.0f6 Personal
Visual Studio 2019 の最新版です
よろしければ足元に出現させる方法や出現させたものの消し方などわかりやすいサイトがありましたら、教えていただけると幸いです。
回答1件
あなたの回答
tips
プレビュー