1

嗨,我是 Unity 和 C# 的新手,我正在制作我的第一款游戏。在其中我有一个名为“sss”的脚本对象。它包含硬币、速度、跳跃力等值。它在编辑器中工作正常,但在我构建它之后它就不起作用了。我的意思是它不起作用是玩家在游戏中死后取决于他们的寿命,他们去商店时会得到一定数量的硬币他们会看到这些硬币显示为 UI,他们可以将它们用于速度和跳跃提升等方面。这在编辑器中有效,但在构建中无效。有人知道这是为什么吗?这是我的 Scriptable 对象中的代码

using UnityEngine;

[CreateAssetMenu(fileName = "data",menuName = "sss",order = 1)]
public class sss : ScriptableObject
{
   public float coins = 0f;
   public float speed = 10f;
   public float jump = -9.81f;
   public bool set = true;
   public int face = 1;

}

这是我用来显示硬币浮动的代码

coinstext.text = sss.coins.ToString();

这是用于购买东西的整个商店经理脚本

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Net.Security;
using UnityEngine;
using UnityEngine.UI;

public class storemanager : MonoBehaviour
{
    public sss sss;
    public Text coinstext;
    public Slider sliders;
    public Slider sliderj;
    public int maxcap = 30;
    public int maxcapj = 500;
    public void Start()
    {


    coinstext.text = sss.coins.ToString();

    }

public void speedbuy()
{


    if (sss.coins >= 5 && sss.speed < maxcap)
    {
        sss.speed += 1;
        sss.buyspeed = true;
        sss.coins -= 5;
        sliders.value += 1;
        coinstext.text = sss.coins.ToString();
    }
}

public void jumpbuy()
{


    if (sss.coins >= 7 && sss.jump < maxcapj)
    {
        sss.jump += 10;
        sss.buyjump = true;
        sss.coins -= 7;
        sliderj.value += 10;
        coinstext.text = sss.coins.ToString();

    }
}
}
4

1 回答 1

3

虽然ScriptableObjectUnityEditor 中的更改是持久的,但它们在构建中不是持久的!

当您使用编辑器时,您可以ScriptableObjects在编辑和运行时保存数据,因为ScriptableObjects使用了编辑器命名空间和编辑器脚本。但是,在已部署的构建中,您不能使用它ScriptableObjects来保存数据,但可以使用ScriptableObject您在开发期间设置的资产中保存的数据。

因此,在构建之后,资产中的数据有点烘焙,您可以在运行时更改它,但是在重新启动应用程序时,您将始终重新加载构建的数据。


您需要将数据存储在存储在设备本身上的本地文件中,例如使用 Json 之类的

using UnityEngine;
using System.IO;
...

public class sss : ScriptableObject
{
    public float coins = 0f;
    public float speed = 10f;
    public float jump = -9.81f;
    public bool set = true;
    public int face = 1;

    private const string FILENAME = "sss.dat";

    public void SaveToFile()
    {
        var filePath = Path.Combine(Application.persistentDataPath, FILENAME);

        if(!File.Exists(filePath))
        {
            File.Create(filePath);
        }
       
        var json = JsonUtility.ToJson(this);
        File.WriteAllText(filePath, json);
    }
        

    public void LoadDataFromFile()
    {
        var filePath = Path.Combine(Application.persistentDataPath, FILENAME);

        if(!File.Exists(filePath))
        {
            Debug.LogWarning($"File \"{filePath}\" not found!", this);
            return;
        }

        var json = File.ReadAllText(filePath);
        JsonUtility.FromJsonOverwrite(json, this);
    }
}

然后在您的管理器脚本中调用加载和保存方法,例如

public class storemanager : MonoBehaviour
{
    public sss sss;

    public Text coinstext;
    public Slider sliders;
    public Slider sliderj;
    public int maxcap = 30;
    public int maxcapj = 500;

    public void Start()
    {
        sss.LoadFromFile();

        coinstext.text = sss.coins.ToString();
    }

    // Called when the application is going to quit
    private void OnApplicationQuit()
    {
        sss.SaveToFile();
    }

注意:在智能手机上输入,但我希望这个想法很清楚

于 2020-05-23T11:58:16.580 回答