C# 尝试将值存储在不从MonoBehavior继承的脚本中

C# 尝试将值存储在不从MonoBehavior继承的脚本中,c#,unity3d,C#,Unity3d,我正试图使它在用户界面按钮上单击“接受”后,将任务中的所有值存储到以下脚本中: [System.Serializable] public class DataHolder { //Active Quest public bool isActive; public string title; public string description; public int goldReward; public QuestGoal goal; }

我正试图使它在用户界面按钮上单击“接受”后,将任务中的所有值存储到以下脚本中:

[System.Serializable]
public class DataHolder
{
    //Active Quest
    public bool isActive;
    public string title;
    public string description;
    public int goldReward;
    public QuestGoal goal;
    
}
存储它的脚本位于此处:

public class QuestGiver : MonoBehaviour
{
    public Quest quest;
    
    public DataHolder data;
        
    public GameObject questWindow;
    public Text titleText;
    public Text descriptionText;
    public Text goldText;
    
    public void OpenQuestWindow()
    {
        Debug.Log("Quest Window Opened");
        questWindow.SetActive(true);
        titleText.text = quest.title;
        descriptionText.text = quest.description;
        goldText.text = quest.goldReward.ToString();
    }
    
    public void AcceptQuest()
    {
        questWindow.SetActive(false);
        data.isActive = true;
        data.title = quest.title;
        data.description = quest.description;
        data.goldReward = quest.goldReward;
    }
}
以及场景中的脚本,这样当按下按钮(选项卡)时,它会弹出一个UI,显示当前任务是什么,它应该存储在第一个“数据持有者”脚本中:

我希望它存储在“DataHolder”中的原因是我希望它存储在场景之间。我认为我的主要问题是不知道如何正确引用“DataHolder”脚本,因为Unity给了我警告:

Assets\Scripts\QuestChecker.cs(8,13):警告CS0649:字段'QuestChecker.data'从未分配给,并且其默认值始终为null


任何帮助都将不胜感激。我是一个编程新手,请让我知道,如果这对我想做的事情不起作用,需要用另一种方式来做,或者如果你需要更多的信息。谢谢

您从未真正创建过DataHolder的实例


在尝试设置其任何属性之前,您需要一个
新数据保持器()
,该数据保持器分配给
数据。

如果您只想在场景之间存储一些数据,您可以简单地执行以下操作:

public static class DataHolder
{
    //Active Quest
    public static bool isActive;
    public static string title;
    public static string description;
    public static int goldReward;
    public static QuestGoal goal;    
}
然后将其引用为
DataHolder.isActive
等。请注意,您实际上并不是在任何地方“保存”数据(序列化)。SerializableAttribute仅指示可以序列化项。但是,这将在场景之间存储数据


这是最好的方法吗?如果只是一些简单的数据需要在场景之间存储,那么这样做没有什么错。而且它可能会很好地符合您已经编程的内容。

您需要在
QuestGiver
QuestChecker

例如

现在将您的
QuestGiver
游戏对象拖到inspector中的
QuestChecker.giver
字段上。然后您可以访问保存的数据

public void CheckQuest()
{
    titleText.text = saver.data.title;
}

非常感谢,这完全满足了我的需要<代码>数据持有者数据=新数据持有者()?此外,这也回答了你的问题:
public class QuestChecker : MonoBehaviour
{
    public QuestGiver giver;
}
public void CheckQuest()
{
    titleText.text = saver.data.title;
}