C# 变量已赋值,但值为空

C# 变量已赋值,但值为空,c#,function,debugging,variables,unity3d,C#,Function,Debugging,Variables,Unity3d,在我从菜单场景转到游戏场景之后 我试图在从菜单转换到游戏场景时加载玩家的位置,但是我得到一个错误,说我的变量player为null。我已经在start和update函数中打印了变量player的值,它们都说player有一个值,但是当我试图从游戏场景中的loadPosition函数中访问它时,它给了我一个错误,说player为null。经过几个小时的思考,我觉得变量player为null的原因是因为我是从菜单场景而不是游戏场景调用toWorld()。在我转换到游戏场景之前,有没有办法从其他场景

在我从菜单场景转到游戏场景之后

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

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));
}

player
null
是因为

player=GameObject.FindWithTag(“玩家”)

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

然后试试这个:

player = GameObject.Find("Player");
这应该可以解决空值问题

编辑:


toWorld()
函数中删除
loadPosition()
,并将其放在
GameObject之后。在
onlevelwasload()
函数和
print(player)

之前,在
onlevelwasload()中查找(“Ethan”)
,我认为包含一个
onlevelwasload
函数来查找玩家应该可以。@GunnarB。我尝试在onlevelwasload函数中使用GameObject.FindWithTag(“Player”),但Unity仍然给我错误提示:/为了调试,将播放器设为公共播放器,并在运行时查看检查器。@GunnarB。在运行时分配player变量。由于某种原因,函数无法访问它。我的标签是“Player”。我猜player=GameObject.FindWithTag(“player”);失败。即使在我使用GameObject.Find(“Player”)之后,错误仍然存在。是的,请重命名它,然后使用GameObject.Find()。这是FindWithTag在本月遇到的第二个问题。FindWithTag可能存在错误。请使用游戏对象层次结构的屏幕截图更新您的问题。在图片中,您没有将游戏对象重命名为“玩家”。我没有看到任何名为玩家的游戏对象。那样做。。。