0

我想知道为什么这个错误发生在下面的代码中。

我在检查器中分配了对应的 GO(游戏对象)。

PhotonNetwork.ConnectUsingSettings、OnConnectedToMaster、OnJoinedLobby 工作正常

该方法On_PlayerNameInput_changed()已分配给层次结构中的PlayerName InputField(并且PlayerName InputField作为PlayerNameScreen的子级)。

GO 附加到 MenuManager GO 插槽

现在,我有这个代码

public class MenuManager : MonoBehaviourPunCallbacks
    {
    [SerializeField] private GameObject connectScreen, playerNameScreen, playerNameButton; 

    [SerializeField] private InputField createRoomInput, joinRoomInput, playerNameInput; 

    public void OnClick_PlayerNameButton() 
    {
        PhotonNetwork.NickName = playerNameInput.text; 
    }

    public void On_PlayerNameInput_changed() 
    {
        if (playerNameInput.text.Length > 2 && playerNameInput.text.Length < 11)
            playerNameButton.SetActive(true);

        else
            playerNameButton.SetActive(false);
     }

并且没有显示警告,但如果我执行下一个:

public void On_PlayerNameInput_changed() 
    {
        if (playerNameInput != null)
        {
            if (playerNameInput.text.Length > 2 && playerNameInput.text.Length < 11)
                playerNameButton.SetActive(true);

            else
                playerNameButton.SetActive(false);
        }
        else
            Debug.Log("PlayerNameInput is null");
    }

立即出现下一条警告信息:

Assets\Scripts\MenuManager.cs(11,57):警告 CS0649:字段“MenuManager.playerNameButton”从未分配给,并且始终具有其默认值 null

Assets\Scripts\MenuManager.cs(14,56):警告 CS0649:字段 'MenuManager.playerNameInput' 从未分配给,并且始终具有其默认值 null

Assets\Scripts\MenuManager.cs(11,39):警告 CS0649:字段 'MenuManager.playerNameScreen' 从未分配给,并且始终具有其默认值 null

如图所示,GO 已经被拖放到 MenuManager 插槽中。

谢谢你的帮助。

4

2 回答 2

1

Visual Studio 不知道SerializeField成员是由 Unity 编辑器设置的。如果您使用 初始化它们default,则会删除警告。

[SerializeField] private GameObject connectScreen, playerNameScreen, playerNameButton = default;

[SerializeField] private InputField createRoomInput, joinRoomInput, playerNameInput = default;

描述了如何为整个项目快速做到这一点。

于 2021-12-19T06:57:24.563 回答
0

正如它所说,您创建了始终为空的符号。这里没有任何东西可以将对象的实例分配给警告中提到的符号。

在尝试使用它们之前,您需要构造对象并将它们分配给这些符号,或者您可以公开这些字段并从外部分配一个构造对象。事实上,编译器正确地假定,当您尝试对其进行操作时,从未分配给构造对象的已声明私有符号将在运行时引发空引用异常。

如果您还不了解 C# 中的引用和实例的概念,那么这就是要阅读的概念。符号始终为“null”,除非某些东西创建并分配对象的运行时实例。

于 2020-09-16T22:32:01.957 回答