繁体   English   中英

Unity 3D 警告 CS0414:该字段<field>已分配但从未使用其值

[英]Unity 3D warning CS0414: The field <field> is assigned but its value is never used

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

我在检查员中分配了通讯员 GO(游戏对象)。

PhotonNetwork.ConnectUsingSettings, OnConnectedToMaster, OnJoinedLobby 工作正常

该方法On_PlayerNameInput_changed()已经分配给PlayerName InputField在层次结构(和PlayerName InputFieldPlayerNameScreen的孩子)。

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”从未分配给,并且其默认值始终为空

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

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

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

谢谢你的帮助。

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

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

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

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

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

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

描述了如何为整个项目快速执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM