unity可脚本对象在bulid中不工作。

问题描述 投票:0回答:1

嗨,我是一个新的unity和C#,我正在做我的第一个游戏。在游戏中,我有一个名为 "sss "的可脚本对象,它包含的值,如硬币,速度,跳跃力。它在编辑器中工作得很好,但在我建立它之后,它就不工作了。我说它不工作的意思是,当玩家在游戏中死亡后,根据他们的寿命,他们会得到一定数量的硬币,当他们去商店时,他们会看到这些硬币显示为一个UI,他们可以把它们花在诸如速度和跳跃增强的事情上。这里是我在脚本对象中的代码。

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();

    }
}
}
c# unity3d scriptable-object
1个回答
0
投票

当改变 ScriptableObject 在UnityEditor中,它们是持久性的,它们是 不持久 在...中 构建!

当你使用编辑器时,你可以将数据保存到 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();
    }

注:在智能手机上打字,但我希望这个想法是清楚的。

© www.soinside.com 2019 - 2024. All rights reserved.