C# 变量从未分配给,并且始终具有默认值null

C# 变量从未分配给,并且始终具有默认值null,c#,unity3d,C#,Unity3d,我试图通过使用可序列化字段生成私有变量,然后在下面使用{get{return}}来访问Unity中的元素。我是C#and Unity的初学者,所以我希望能有一个简单的解释。这些可序列化字段中的每一个都有相同的错误,并且不会出现在我的Unity inspector中 public struct UIElements { [SerializeField] RectTransform answerContentArea; public RectTrans

我试图通过使用可序列化字段生成私有变量,然后在下面使用{get{return}}来访问Unity中的元素。我是C#and Unity的初学者,所以我希望能有一个简单的解释。这些可序列化字段中的每一个都有相同的错误,并且不会出现在我的Unity inspector中

    public struct UIElements
    {
        [SerializeField] RectTransform answerContentArea;
        public RectTransform AnswerContentArea { get { return answerContentArea; } }

        [SerializeField] TextMeshProUGUI questionInfoTextObject;
        public TextMeshProUGUI QuestionInfoTextObject { get { return questionInfoTextObject; } }

        [SerializeField] TextMeshProUGUI scoreText;
        public TextMeshProUGUI ScoreText { get { return scoreText; } }

        [Space]

        [SerializeField] Image resolutionBG;
        public Image ResolutionBG { get { return resolutionBG; } }

        [SerializeField] TextMeshProUGUI resolutionStateInfoText;
        public TextMeshProUGUI ResolutionStateInfoText { get { return resolutionStateInfoText; } }

        [SerializeField] TextMeshProUGUI resolutionScoreText;
        public TextMeshProUGUI ResolutionScoreText { get { return resolutionScoreText; } }

        [Space]

        [SerializeField] TextMeshProUGUI highScoreText;
        public TextMeshProUGUI HighScoreText { get { return highScoreText; } }

        [SerializeField] CanvasGroup mainCanvasGroup;
        public CanvasGroup MainCanvasGroup { get { return mainCanvasGroup; } }

        [SerializeField] RectTransform finishUIElements;
        public RectTransform FinishUIElements { get { return finishUIElements; } }
    }

您需要将结构标记为可序列化,以便在Unity Inspector中显示它,如下所示:

[Serializable]
public struct UIElements
{
// ...
}
至于警告,这是正常的,因此您可以忽略它。
只需确保在inspector中设置相应的值。

Unity提供了MonoBehavior的字段,您可以使用这些字段在编辑器中设置字段链接,然后从代码中使用它

    public struct UIElements
    {
        [SerializeField] RectTransform answerContentArea;
        public RectTransform AnswerContentArea { get { return answerContentArea; } }

        [SerializeField] TextMeshProUGUI questionInfoTextObject;
        public TextMeshProUGUI QuestionInfoTextObject { get { return questionInfoTextObject; } }

        [SerializeField] TextMeshProUGUI scoreText;
        public TextMeshProUGUI ScoreText { get { return scoreText; } }

        [Space]

        [SerializeField] Image resolutionBG;
        public Image ResolutionBG { get { return resolutionBG; } }

        [SerializeField] TextMeshProUGUI resolutionStateInfoText;
        public TextMeshProUGUI ResolutionStateInfoText { get { return resolutionStateInfoText; } }

        [SerializeField] TextMeshProUGUI resolutionScoreText;
        public TextMeshProUGUI ResolutionScoreText { get { return resolutionScoreText; } }

        [Space]

        [SerializeField] TextMeshProUGUI highScoreText;
        public TextMeshProUGUI HighScoreText { get { return highScoreText; } }

        [SerializeField] CanvasGroup mainCanvasGroup;
        public CanvasGroup MainCanvasGroup { get { return mainCanvasGroup; } }

        [SerializeField] RectTransform finishUIElements;
        public RectTransform FinishUIElements { get { return finishUIElements; } }
    }

在您的情况下,您需要将
UIElements
作为继承自
MonoBehavior
的类,将其附加到场景中的某些游戏对象并设置所需的链接-在此之后,您可以使用场景中对象的链接。

您的所有字段似乎都定义为。如果我错了,有人会纠正我,但为了在inspector中显示属性,您必须“创建”自己的inspector,因为Unity无法安全地序列化/反序列化属性,因为getter和setter可以根据它们封装的代码产生不同的效果

我希望这能给你更多的启示

编辑
也可能有用

这是正常的。您可以将它们设置为null,它将关闭,或为空值。@BugFinder我尝试将它们设置为null,但出现了一个错误“UIElements”在structs.ah中不能有实例属性或字段初始值设定项,因为它是一个结构而不是一个类。。如果这是一门课,你会…@BugFinder啊,别担心,伙计,我只是把它修好了。我必须将[Serializable()]放在结构之前,以便Unity能够识别我正在使用它。无论如何,感谢您的帮助:数据这里有一些属性可以访问Inspector中显示的私有字段。如果您在答案中的链接中包含信息,以防帖子被编辑/删除或线程丢失,则可以改进您的答案。所有显示的属性都使用序列化字段备份字段。。。因此,检查员没有任何问题。