【发布时间】:2015-09-26 05:38:01
【问题描述】:
using UnityEngine;
using System.Collections;
public class Gamemanager : MonoBehaviour {
public GameObject AttackButton; //reference to attack button game object
public GameObject RocketGO; // reference to rocket game object
public GameObject EnemySpawner;//reference to meteorite spawner gameobject
public GameObject navbuttons;
public GameObject Power1SpawnerGO; // reference to power1 spawner
public GameObject Enemy1bluespawner;
// Use this for initialization
public enum GamemanagerState
{
Opening ,
Gameplay ,
Gameover,
}
GamemanagerState GMState;
void Start ()
{
GMState = GamemanagerState.Opening;
}
void UpdateGameManagerState()
{
switch(GMState)
{
case GamemanagerState.Opening:
//set attack button to true
AttackButton.SetActive(true);
//hide game over
//set navigational buttons to false
navbuttons.SetActive(false);
break;
case GamemanagerState.Gameplay:
//set attack button false
AttackButton.SetActive(false);
//set navbuttons to true
navbuttons.SetActive(true);
//set playership to active
RocketGO.GetComponent<Rocketdamage>().Init();
//Start EnemySpawner
EnemySpawner.GetComponent<meteoritespawner>().startEnemySpawner();
Enemy1bluespawner.GetComponent<Enemy1Spawner>().startEnemy1blueSpawner(); // Enemy blue spawner
//Active Rocket bullete fire
RocketGO.GetComponent<Rocketshooting>().startBulleteFire();
//Activate Enemyblue1 bulletefire
Enemy1bluespawner.GetComponent<Enemyblue1shooting>().startEBulleteFire();
//Active power1 spawner
Power1SpawnerGO.GetComponent<PowerSpawner>().startPower1Spawner();
break;
case GamemanagerState.Gameover:
//stop enemy spawner
EnemySpawner.GetComponent<meteoritespawner>().StopEnemySpawning();
Enemy1bluespawner.GetComponent<Enemy1Spawner>().StopEnemy1blueSpawning();
//DeActive Rocket bullete fire
RocketGO.GetComponent<Rocketshooting>().StopBulleteFire();
//Stop power1 spawning
Power1SpawnerGO.GetComponent<PowerSpawner>().StopPower1Spawning();
//Deactive Enemyblue1 Bullete fire
Enemy1bluespawner.GetComponent<Enemyblue1shooting>().StopEBulleteFire();
//display gameover
//set game state to opening state after 8 sec
Invoke("changeToOpeningState" , 8f);
break;
}
}
public void setGameManagerState(GamemanagerState state)
{
GMState = state;
UpdateGameManagerState ();
}
//call this function when player call attack button
public void Startpaly()
{
GMState = GamemanagerState.Gameplay;
UpdateGameManagerState ();
}
public void changeToOpeningState()
{
setGameManagerState (GamemanagerState.Opening);
}
}
这是我的脚本......一切运行良好!但是第 67 行和第 89 行,即
//第 67 行
Enemy1bluespawner.GetComponent<Enemyblue1shooting>().startEBulleteFire();
和:
//第 89 行
Enemy1bluespawner.GetComponent<Enemyblue1shooting>().StopEBulleteFire();
在 UpdateGameManagerState() 函数下。
给我NullreferenceException。
经过这么多思考,我想出了这个可能已经发生的问题!
这里
Enemy1bluespawner是生成敌人的对象(附有生成脚本)....而Enemyprefab附加到Enemy1bluespawner...但是,我可以调用所有Enemy PREFAB 的脚本/方法(没有直接引用 Enemy 预制件 - 我不知道为什么?)。一切正常,但第 67 行和第 89 行给了我
NullreferenceException。
场景 - 我有一个空对象 - Enemy1bluespawner 附有 Enemyspawning 脚本 - 在特定时间间隔产生敌人......
所以,当我调用这个函数时:
Enemy1bluespawner.GetComponent<Enemyblue1shooting>().startEBulleteFire();
开始对敌人进行子弹射击,但现在敌人不在屏幕上,它会在 5 秒后出现
5 秒后敌人不在屏幕上 - 所以可能这就是 Unity 抛出 NullreferenceException(运行时)的原因
问题:
如何在不通过
Enemy1bluespawnObject 直接引用的情况下访问 Enemy 预制脚本/方法?删除
NullreferenceException的解决方案。当敌人不在屏幕上并且我正在调用与之相关的方法时。
我希望你们能理解它。任何一点帮助都会很棒。谢谢! :) :)
【问题讨论】: