首页 > 解决方案 > 静态变量在 Unity 中不显示

问题描述

好的,首先,原谅我的英语。好吧,我一直用 [Serializable()] 制作一个SAVEFILE,没有问题,问题是,当我尝试用用户名更改这个静态字符串时,我找不到对这个变量的引用另一个带有 de InputField 的脚本。没什么奇怪的,SAVEFILE脚本只是说:

和脚本保存:

 public static UIsettings uisettings;

    //Data to save.
    public string AirlineName = "Unknow";
    public string UserName = "Unknow";
    //Autoload.
    public bool StartupLoad;

    void Awake()
    {
        if(uisettings == null)
        {
            uisettings = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
        
    }
    void Start()
    {
        if (StartupLoad)
        {
            Load();
        }
    }
    //Guardar
    public void Save() //Start the SAVEGAME code

后来,我从 InputFields 中的其他两个脚本中更改了Airline NameUsername的值,这两个方法如下所示:

 public void SubmitName(string newAirlineName)
    {
        if(newAirlineName == "")
        {
            print("Write a valid name");
        }
        else
        {
            print(newAirlineName + " es valido.");
            profileData.AirlineName = newAirlineName;
            profileData.Save();
            Debug.Log(UIsettings.uisettings.AirlineName);
        }
    }

如果我这样称呼它,可以工作,但是因为当我改变场景时这些值再次变为默认值,所以我在如下值中使用静态

{
public static string AirlineName = "Unknow";
}

没有钥匙,很明显。但是,当我这样做时,第二个脚本的方法无法显示分配的变量,例如:错误 CS0176:无法使用实例引用访问成员“UIsettings.AirlineName”;改为使用类型名称来限定它...

我有几天试图自己解决这个问题,但我不知道该怎么做。

是要知道SAVEGAME脚本是一个 DontDestoyOnLoad 文件,就像可以在第一个脚本中看到的那样,但我认为这不是因为脚本在没有static的情况下工作正常。

标签: c#unity3dstaticstatic-variables

解决方案


当你有一个静态变量 ( public static string AirlineName) 时,你只能使用类名来引用它——而不是类的实例——因为只有一个AirlineName存在,而且它与你的类的任何实例都不相关。

这是您收到错误的原因的示例:

// This example shows why are you getting the error.  Skip to the second example
// to see the solution that you should use

public class UiSettings : MonoBehaviour
{
   public static string AirlineName = "Unknow";
}

// ...

public void SubmitName(string newAirlineName)
{
   // Just an example of getting the current instance of UiSettings
   UiSettings profileData = (UiSettings)GameObject.FindObjectOfType(typeof(UiSettings));

   // You can't do this because AirlineName is a static property, so you can't use an
   // instance variable (profileData) to access it because AirlineName doesn't belong
   // to an instance     
   profileData.AirlineName = newAirlineName;

   // You would have to access it like this
   UiSettings.AirlineName = newAirlineName;
}

但是由于您正在UiSettings使用 using 创建一个单例类DontDestroyOnLoad,因此您可以这样做

public class UiSettings : MonoBehaviour
{
   public static UIsettings uisettings;

   // Do not make these static
   public string AirlineName = "Unknow";
   public string UserName = "Unknow";

    void Awake()
    {
        if(uisettings == null)
        {
            uisettings = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }        
    }
}

// ...

public void SubmitName(string newAirlineName)
{
   // uisettings contains an instance of UiSettings, so you are allowed to say
   // UiSettings.uisettings.AirlineName = ...
   UiSettings.uisettings.AirlineName = newAirlineName;
}

我还建议将名称更改为uisettings清楚Instance地表明该属性引用了该类的单例实例。像这样:

public class UiSettings : MonoBehaviour
{
    // Instead of public static UiSettings uisettings
    public static UiSettings Instance { get; private set; }
}

推荐阅读