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

Posted

技术标签:

【中文标题】Unity 3D 警告 CS0414:字段 <field> 已分配,但从未使用其值【英文标题】:Unity 3D warning CS0414: The field <field> is assigned but its value is never used 【发布时间】:2020-05-09 06:28:58 【问题描述】:

我想知道为什么下面的代码会出现这个错误。

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

PhotonNetwork.ConnectUsingSettings、OnConnectedToMaster、OnJoinedLobby 工作正常

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

GO's attached to MenuManager GO slots

现在,我有这个代码

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 插槽中。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

以上是关于Unity 3D 警告 CS0414:字段 <field> 已分配,但从未使用其值的主要内容,如果未能解决你的问题,请参考以下文章

Unity 3D CS0246 问题 [关闭]

为啥我的编译器警告只有一个被禁止?

Unity3D日常开发Unity3D中屏蔽不想显示的黄色警告消息

Unity3D日常开发Unity3D中屏蔽不想显示的黄色警告消息

UNITY3D添加了刚体后,移动不成问题,也能实现CS效果,但是跳这个就出问题了,只能立定跳,不能边走边跳

Unity3d对象池