栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

Unity 关于Fungus 存储加载 Save Variable Save Point 的细节 如何存储加载所有Fungus变量

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity 关于Fungus 存储加载 Save Variable Save Point 的细节 如何存储加载所有Fungus变量

Fungus 本身是有自己的Save System 的,关于这个怎么用网上资料有很多
当然Fungus官方的documentation和视频讲得最清楚 不赘述 请看他们github和油管

虽然讲得很清楚 但是有一说一 很难用
所以我选择自己创造saveObject来处理
今后对话系统更复杂就转战Dialogue System
Anyway

尽管如此 Fungus自带的Save Variable Load Variable 看上去还是蛮好用的
比起

这一串看上去好用得多 至少不用自己明确表示其数据类型

但其实打开Save Variable Load Variable源码会发现

        [Tooltip("Variable to read the value from. Only Boolean, Integer, Float and String are supported.")]
        [VariableProperty(typeof(BooleanVariable),
                          typeof(IntegerVariable), 
                          typeof(FloatVariable), 
                          typeof(StringVariable))]
        [SerializeField] protected Variable variable;

        #region Public members

        public override void OnEnter()
        {
            if (key == "" ||
                variable == null)
            {
                Continue();
                return;
            }
            
            var flowchart = GetFlowchart();
            
            // Prepend the current save profile (if any)
            string prefsKey = SetSaveProfile.SaveProfile + "_" + flowchart.SubstituteVariables(key);
            
            System.Type variableType = variable.GetType();

            if (variableType == typeof(BooleanVariable))
            {
                BooleanVariable booleanVariable = variable as BooleanVariable;
                if (booleanVariable != null)
                {
                    // PlayerPrefs does not have bool accessors, so just use int
                    PlayerPrefs.SetInt(prefsKey, booleanVariable.Value ? 1 : 0);
                }
            }
            else if (variableType == typeof(IntegerVariable))
            {
                IntegerVariable integerVariable = variable as IntegerVariable;
                if (integerVariable != null)
                {
                    PlayerPrefs.SetInt(prefsKey, integerVariable.Value);
                }
            }
            else if (variableType == typeof(FloatVariable))
            {
                FloatVariable floatVariable = variable as FloatVariable;
                if (floatVariable != null)
                {
                    PlayerPrefs.SetFloat(prefsKey, floatVariable.Value);
                }
            }
            else if (variableType == typeof(StringVariable))
            {
                StringVariable stringVariable = variable as StringVariable;
                if (stringVariable != null)
                {
                    PlayerPrefs.SetString(prefsKey, stringVariable.Value);
                }
            }
            
            Continue();
        }


幻想破灭。

那么如果我们只想存储所有变量怎么做?

第一种方法



这个方法的加持下,把所有变量转换为
variable name :variable toString
的格式存储,也就是类似Fungus用的方法

第二种方法

也是我所用的方法
每次存储/加载时execute一个特殊block

call这两个方法之一

public class myLoader : MonoBehaviour
{
    public void saveName(string name){
        var saveManager = FungusManager.Instance.SaveManager;
        if (saveManager.SaveDataExists(name))
        {
            SaveManager.Delete(name);
        }
        saveManager.Save(name);
        Debug.Log("save ok");
    }
    public void loadName(string name){
        var saveManager = FungusManager.Instance.SaveManager;
        if (saveManager.SaveDataExists(name))
        {
            saveManager.Load(name);
            Debug.Log("laod ok");
        }
    }
}

这样我们虚拟了一个save point 不会显示一边说过的对话之类了
哦对了要先设定好saveData

其实savePoint 最大的问题在于不能每次Load都load到 想要的savePoint
因为Fungus会存出

这样一个格式(位置在Application.persistentDataPath)

要想每次存取都确定是某个 就得更改saveDataKey
不知道是怎么设计的 亦有可能是我理解有问题

总之我还是用自己改过的方式来用吧。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/905750.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号