【问题标题】:NullReferenceException & using methods without direct referenceNullReferenceException & 使用没有直接引用的方法
【发布时间】: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(运行时)的原因

问题:

  • 如何在不通过 Enemy1bluespawn Object 直接引用的情况下访问 Enemy 预制脚本/方法?

  • 删除NullreferenceException 的解决方案。当敌人不在屏幕上并且我正在调用与之相关的方法时。

我希望你们能理解它。任何一点帮助都会很棒。谢谢! :) :)

【问题讨论】:

标签: c# unity3d


【解决方案1】:

您引用了Enemy1Spawner 脚本,但从未引用Enemyblue1shooting。据我了解,您的目标是使用Enemy1Spawner 脚本生成 敌人,而那些生成的敌人是具有Enemyblue1shooting 组件的对象(实际上会射击)。

如果我是对的,你必须得到生成的敌人的GameObject,然后使用GetComponent 方法。似乎正在发生的是NullPointerException,因为生成器没有Enemyblue1shooting 组件;拥有它的对象是它的孩子。

尝试在Enemy1bluespawner 脚本中创建一个返回手头敌人的方法,然后才使用GetComponent&lt;Enemyblue1shooting&gt;() 获取正确的组件。这样就可以了。

示例:

public GameObject GetEnemy(int n)
{
    return enemies.get(n); // Gets the n enemy in your array
}

...

Enemy1bluespawner.GetComponent<Enemy1Spawner>().startEnemy1blueSpawner(); // Enemy blue spawner

GameObject enemy = Enemy1bluespawner.GetComponent<Enemy1Spawner>().GetEnemy(0);
enemy.GetComponent<Enemyblue1shooting>().startEBulleteFire();

别忘了做一些空值验证。完美的场景是返回脚本本身,而不是 GameObject,但这样可能更容易查看。

这也可能是您关于调用预制件方法的问题。您不调用预制件的方法;您调用实例化预制件(生成的敌人)的方法。

【讨论】:

    【解决方案2】:

    最简单但不是最好的是

    if(Enemy1bluespawner.GetComponent<Enemyblue1shooting>()!=null)
    Enemy1bluespawner.GetComponent<Enemyblue1shooting>().startEBulleteFire();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      • 2012-05-01
      • 2014-08-31
      相关资源
      最近更新 更多