#現状
今までは思い通りに動いていたスクリプトが急に異常な動きをしていて困っております。
あるオブジェクトが生成されたら以下の2つの処理を実装していたのですが突然うまくいかなくなったため解決お願いいたします。
①Z軸方向に移動していく
②体力がなくなったらアイテムをランダム生成して消える
上記の①②通りに言っていた処理が以下のようになってしまいました。
①移動しない
②体力がなくなってもいないのにその場でアイテムをランダムに生成し続ける(∞個)
#スクリプト
一応スクリプト全体を下記に載せておきますが独自に検証してみた結果Start内で指定しているcurrentHpの値が常に0となってしまっているようです。
currentHp=200;と直接代入する形をとっても0になり続けているようでUpdate内の死んだ時の処理が永遠に呼び出され続けているようです。
ただ納得いかないのがコルーチンで呼び出されてアイテム生成はし続けるものの、その下にあるDestroyは実行されないこと、update内のWalking関数が実行されないことです。
public class BlueManager : MonoBehaviour
{
public float speed;
private Animator animator;
public float MaxHp;
public GameObject ball;
PlayerAttack script;
private GameObject player;
ExpManager expScript;
private bool walk;
float currentHp;
[SerializeField] GameObject DamageFire;
//アイテム
public GameObject heal;
public GameObject powerUp;
public GameObject coin;
public GameObject fiveCoin;
public GameObject bullian;
Bank bankScript;
public GameObject bomb;
Bomb bombScript;
// Start is called before the first frame update void Start() { animator = GetComponent<Animator>(); script = player.GetComponent<PlayerAttack>(); player = GameObject.Find ("PlayerBack"); expScript = player.GetComponent<ExpManager>(); bankScript = player.GetComponent<Bank>(); MaxHp = 200; currentHp = MaxHp; walk = true; bombScript = bomb.GetComponent<Bomb>(); } // Update is called once per frame void Update() { Debug.Log (currentHp); if(walk == true) { Walking(); } //死んだ時 if (currentHp <= 0) { animator.SetBool( "IsDie", true); StartCoroutine("Death"); walk = false; } } public void Walking() { transform.position += new Vector3( 0, 0, -speed * Time.deltaTime); animator.SetBool( "IsWalk", true); } private void OnTriggerEnter(Collider other) { if (other.gameObject.tag == "Player") { bankScript.LossCoin(); Destroy (this.gameObject); } //ダメージ時 if (other.gameObject.tag == "Ball") { float damage = script.Attack; float lateHp = currentHp - damage; currentHp = lateHp; //Debug.Log(currentHp); Vector3 DamagePos = this.transform.position; Instantiate ( DamageFire, DamagePos, Quaternion.identity); } if (other.gameObject.tag == "Bomb") { int bombDamage = 30; currentHp = currentHp - bombDamage; Vector3 DamagePos = this.transform.position; Instantiate ( DamageFire, DamagePos, Quaternion.identity); Destroy (other.gameObject); } } IEnumerator Death() { yield return new WaitForSeconds(1); int drop = Random.Range ( 1, 101); if (drop <= 5) { Vector3 itemPos = new Vector3 ( this.transform.position.x, this.transform.position.y + 1, this.transform.position.z); Instantiate ( heal, itemPos, Quaternion.identity); } if (drop >= 6 && drop <= 10) { Vector3 itemPos = new Vector3 ( this.transform.position.x, this.transform.position.y + 1, this.transform.position.z); Instantiate ( powerUp, itemPos, Quaternion.identity); } //コインドロップ if (drop >= 11 && drop <= 100) { int dropC = Random.Range ( 1, 101); if (dropC >= 1 && dropC <= 45) { Vector3 itemPos = new Vector3 ( this.transform.position.x, this.transform.position.y + 1, this.transform.position.z); Instantiate ( coin, itemPos, Quaternion.identity); } if (dropC >= 46 && dropC <= 80) { Vector3 itemPos = new Vector3 ( this.transform.position.x, this.transform.position.y + 1, this.transform.position.z); Instantiate ( fiveCoin, itemPos, Quaternion.identity); } if (dropC >= 81 && dropC <= 100) { Vector3 itemPos = new Vector3 ( this.transform.position.x, this.transform.position.y + 1, this.transform.position.z); Instantiate ( bullian, itemPos, Quaternion.identity); } } expScript.BlueExp(); Destroy(this.gameObject); }
}
#解決したいこと
①walking関数を発動させたい
②currentHpが常に0になる問題を解決したい
③コルーチンで呼び出されたDeath関数の最後にあるDestroyが発動するようにしたい
上記の3つが解決策だと思うのですがなぜ今まで普通にできた処理が急に不可能になったのかが一番意味不明です。
解決策あれば何卒よろしくお願いいたします。
#エラーメッセージ
最初に一度出てくるエラー
NullReferenceException: Object reference not set to an instance of an object
BlueManager.Start () (at Assets/Script/Enemy/BlueManager.cs:31)
フレーム毎に出てくるエラー
NullReferenceException: Object reference not set to an instance of an object
BlueManager+<Death>d__22.MoveNext () (at Assets/Script/Enemy/BlueManager.cs:122)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/Coroutines.cs:17)
一応エラーについても調べましたがそれらしいものは見当たりませんでした
回答1件
あなたの回答
tips
プレビュー