首页 > 解决方案 > 尝试将值存储在不从 MonoBehaviour 继承的脚本中

问题描述

我正在尝试做到这一点,以便一旦您在 UI 按钮上单击“接受”,它将把任务中的所有值存储到以下脚本中:

[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;
    }
}

以及场景中的脚本,这样当按下按钮(Tab)时,它会弹出一个 UI,显示当前任务是什么,它应该存储在第一个“DataHolder”脚本中:

public class QuestChecker : MonoBehaviour
{
    DataHolder data;
    
    public GameObject questWindow;
    public Text titleText;
    public Text descriptionText;
    public Text goldText;
    
    
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Tab))
        {
            CheckQuest();
        }
    }
    
    public void CheckQuest()
    {
        questWindow.SetActive(true);
        
            titleText.text = data.title;
            descriptionText.text = data.description;
            goldText.text = data.goldReward.ToString();
        
        
    }
    
    public void CloseQuestWindow()
    {
        questWindow.SetActive(false);
    }

}

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

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

任何帮助,将不胜感激。我对编程很陌生,如果这对我想要它做的事情不起作用并且需要以另一种方式做,或者如果你需要更多信息,请告诉我。谢谢

标签: c#unity3d

解决方案


如果您只想在场景之间存储一些数据,您可以简单地这样做:

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 只是表明该项目可以被序列化。但是,这将在场景之间存储数据。

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


推荐阅读