【问题标题】:Variable has been assigned, but the value is null变量已赋值,但值为 null
【发布时间】:2016-04-03 18:26:12
【问题描述】:

Picture of Error我从菜单场景转到游戏场景之后。

Picture of Script

我试图在从菜单转换到游戏场景时加载玩家的位置,但我收到一个错误消息,提示我的变量 player 为空。我在 start 和 update 函数中打印了我的变量 player 的值,他们都说 player 有一个值,但是当我尝试从 Game 场景的 loadPosition 函数中访问它时,它给了我一个错误,说那个 player一片空白。经过几个小时的思考,我觉得变量 player 为空的原因是因为我是从 Menu 场景而不是 Game 场景调用 toWorld() 。在我之前有没有办法从不同的场景调用 start 函数过渡到游戏场景。这个错误一直让我发疯!为了便于阅读,我删除了代码中不相关的部分。顺便说一下,Demo是我的游戏场景。提前谢谢!

GameObject player;


    void Update(){

    if (Application.loadedLevelName == "Demo") {
    savePosition ();
    print(player);
    }
}

void Start () {
    if (Application.loadedLevelName == "Demo"){
        player = GameObject.FindWithTag ("Player");
        print (player);
    }

}

public void loadPosition(){

    float playerX = PlayerPrefs.GetFloat ("PlayerX");
    float playerY = PlayerPrefs.GetFloat ("PlayerY");
    float playerZ = PlayerPrefs.GetFloat ("PlayerZ");
    player.transform.position = new Vector3 (playerX, playerY, playerZ);

}


public void savePosition(){


    PlayerPrefs.SetFloat ("PlayerX", player.transform.position.x);
    PlayerPrefs.SetFloat ("PlayerY", player.transform.position.y);
    PlayerPrefs.SetFloat ("PlayerZ", player.transform.position.z);
    float playerX = PlayerPrefs.GetFloat ("PlayerX");
    float playerY = PlayerPrefs.GetFloat ("PlayerY");
    float playerZ = PlayerPrefs.GetFloat ("PlayerZ");
    print (new Vector3 (playerX, playerY, playerZ));
}

【问题讨论】:

  • 我认为包含一个 OnLevelWasLoaded 函数来查找播放器应该可以工作。
  • @GunnarB。我尝试在 OnLevelWasLoaded 函数中使用 GameObject.FindWithTag("Player") ,但 Unity 仍然给我错误。 ://
  • 为了调试,将播放器设为公众并在运行时查看检查器。
  • @GunnarB。 player 变量是在运行时分配的。该函数由于某种原因无法访问它。

标签: c# function debugging variables unity3d


【解决方案1】:

playernull 因为

player = GameObject.FindWithTag ("Player");

可能会失败。确保您的游戏对象的标签是“玩家”。如果标签不是“玩家”,那么FindWithTag 将失败。如果这种情况持续发生,请在编辑器中将该游戏对象重命名为“Player”。

然后试试这个:

player = GameObject.Find("Player");

这应该可以解决 null 问题。

编辑:

toWorld() 函数中删除loadPosition() 并将其放在OnLevelWasLoaded() 函数中的GameObject.Find("Ethan") 之后和print(player) 之前

【讨论】:

  • 我的标签是“玩家”。我猜那 player = GameObject.FindWithTag ("Player");失败了。
  • 即使我使用了 GameObject.Find("Player"),错误仍然存​​在。
  • 是的,重命名它然后使用 GameObject.Find()。这是本月 FindWithTag 遇到此问题的第二个问题。 FindWithTag 可能存在错误。
  • 用您的游戏对象层次结构的屏幕截图更新您的问题。
  • 从您的图片中,您没有将游戏对象重命名为“玩家”。我没有看到任何名为 player 的游戏对象。这样做...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多