国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

unity強(qiáng)力配置插件-Luban使用(一)加載保存

這篇具有很好參考價(jià)值的文章主要介紹了unity強(qiáng)力配置插件-Luban使用(一)加載保存。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


前言

Luban是一種配置工具,生成c#等各種語(yǔ)言的代碼,支持導(dǎo)出成bytes或json等多種格式,且能檢查數(shù)據(jù)錯(cuò)誤。unity只是其中支持的一種引擎,可以想象其功能非常強(qiáng)大。
不但如此,在使用的時(shí)候非常簡(jiǎn)單、方便,支持類(lèi)型豐富,初學(xué)者也能迅速掌握。
插件地址
本系列版本為[classic版],注意選對(duì)版本進(jìn)行示例下載和文檔閱讀。
unity強(qiáng)力配置插件-Luban使用(一)加載保存


一、安裝

以下使用參照官方文檔步驟,非初學(xué)者可直接跳過(guò)看官方文檔即可,也可直接參考b站大佬的教學(xué)視頻。
1、下載如下示例,找到LubanLib示例文件復(fù)制到unity項(xiàng)目Assets里即可(不要求和示例一樣的Assets根目錄)
示例
unity強(qiáng)力配置插件-Luban使用(一)加載保存
2、在項(xiàng)目的根目錄新建,找到下載示例將如下三個(gè)文件移進(jìn)去,MiniTemplate改為Config(別的也行)
unity強(qiáng)力配置插件-Luban使用(一)加載保存
unity強(qiáng)力配置插件-Luban使用(一)加載保存
3、編輯移過(guò)來(lái)的.bat文件,至于命名自己決定,規(guī)則如下:

dotnet %Luban.ClientServer.dll%
-j cfg ^
-- ^
--define_file <__root__.xml 定義文件的路徑> ^
--input_data_dir <配置數(shù)據(jù)根目錄(Datas)的路徑> ^
--output_code_dir <生成的代碼文件的路徑> ^
--output_data_dir <導(dǎo)出的數(shù)據(jù)文件的路徑> ^
--service all ^
--gen_types "code_cs_unity_json,data_json"

示例(本人項(xiàng)目基礎(chǔ)類(lèi)目錄Assets/Scripts/Game/Base):

set WORKSPACE=..
 
set GEN_CLIENT=%WORKSPACE%\Luban\Tools\Luban.ClientServer\Luban.ClientServer.exe
set CONF_ROOT=%WORKSPACE%\Luban\Config
 
%GEN_CLIENT% -j cfg --^
 -d %CONF_ROOT%\Defines\__root__.xml ^
 --input_data_dir %CONF_ROOT%\Datas ^
 --output_code_dir %WORKSPACE%/Assets/Scripts/Game/Base ^
 --output_data_dir ..\Assets\StreamingAssets ^
 --gen_types code_cs_unity_json,data_json ^
 -s all 
 
pause

二、使用

1、運(yùn)行.bat文件(如有jenkins就配置該文件即可)

using SimpleJSON;
using System.IO;
...
void xx(){
    //加載配置表
    var tables = new cfg.Tables(file => JSON.Parse(File.ReadAllText(Application.streamingAssetsPath + "/" + file + ".json")));
    //使用配置表
    cfg.item.Item itemInfo = tables.TbItem.Get(10000);
    Debug.Log(itemInfo.ToString());
   	// 支持 operator []用法
	Debug.Log(tables.TbBaseObject[10000].Id);

}

2、刪除并修改unity項(xiàng)目的Luban/Config/Datas文件夾里的表格為自己項(xiàng)目的表格,即可快速食用
unity強(qiáng)力配置插件-Luban使用(一)加載保存

三、單表加載

細(xì)心的朋友可能發(fā)現(xiàn)了,上文中的默認(rèn)加載方式是將表統(tǒng)一加載進(jìn)游戲。如果有特殊需求想要將表分開(kāi)加載就得自行修改,本來(lái)想改動(dòng)一下,結(jié)果發(fā)現(xiàn)有大佬(明天不吃魚(yú))已經(jīng)寫(xiě)了相關(guān)文章就直接貼這里了。
如果想改加載方式,直接修改DataManager中的ReadData和GetVOData方法改成自己的就行。
下面是我改的腳本,僅供參考:

  readonly Dictionary<string, object> tables = new Dictionary<string, object>();

        public T GetVOData<T>(string fileName,string language = "cn") where T : IVOFun, new()
        {
            var path = Application.streamingAssetsPath +"/" + language + "/" + fileName + ".json";
            if (tables.ContainsKey(fileName))
            {
                return (T)tables[fileName];
            }
            else
            {
                var data = new T();

                if (File.Exists(path)) {
                    //創(chuàng)建一個(gè)StreamReader,用來(lái)讀取流
                    using StreamReader sr = new StreamReader(path);
                    //將讀取到的流賦值給jsonStr
                    string text = sr.ReadToEnd();
                    data._LoadData(text);
                    tables.Add(fileName, data);
                }
                else
                {
                    Debug.LogError("存檔文件不存在");
                }
                return data;
            }
        }

四、單表保存

比細(xì)心的朋友更細(xì)的朋友可能發(fā)現(xiàn)了,只有加載功能,要是項(xiàng)目需要保存數(shù)據(jù)還得自己寫(xiě)嗎?事實(shí)上,這類(lèi)打表工具一般是給策劃使用記錄游戲數(shù)據(jù)、關(guān)卡數(shù)據(jù),方便程序使用和熱更。現(xiàn)在不少游戲需要隨機(jī)生成地形、npc等自己存儲(chǔ)下來(lái)的需求,儲(chǔ)存下來(lái)后可能就代表了一個(gè)存檔,如果還要自己寫(xiě)就太不美了。
如果是網(wǎng)絡(luò)項(xiàng)目或者定制項(xiàng)目請(qǐng)使用帶orm的數(shù)據(jù)庫(kù),輕量級(jí)的就像SQLite這種就ok。
我們想到可以自行添加修改保存json的方法,奈何自己對(duì)scriban模板引擎不太熟悉,使用示例來(lái)偷懶下。
1、示例工程Unity_Editor_json
找到目錄下的EditorText移動(dòng)到工程
unity強(qiáng)力配置插件-Luban使用(一)加載保存
2、替換文件
unity強(qiáng)力配置插件-Luban使用(一)加載保存
3、給tables添加接口,并修改IVOFun添加保存方法

public interface IVOFun
{
    void _LoadData(string data);
    void _SaveData(string file);
}
public interface EditorBeanBase
{
    public void LoadJson(JSONObject json);
    public void SaveJson(JSONObject json);
}

4、修改bean文件的命名空間、保存方法

using Bright.Serialization;
using System.Collections.Generic;
using SimpleJSON;

{{
    name = x.name
    parent_def_type = x.parent_def_type
    parent = x.parent
    hierarchy_fields = x.hierarchy_fields
    fields = x.fields
    export_fields = x.export_fields
    hierarchy_export_fields = x.hierarchy_export_fields
}}

{{cs_start_name_space_grace x.namespace_with_top_module}} 

{{~if x.comment != '' ~}}
/// <summary>
/// {{x.escape_comment}}
/// </summary>
{{~end~}}
public {{x.cs_class_modifier}} partial class {{name}} : {{if parent_def_type}} {{parent}} {{else}} EditorBeanBase {{end}}
{
    public {{name}}()
    {
        {{~ for field in fields ~}}
        {{~if (cs_editor_need_init field.ctype) && !field.ctype.is_nullable ~}}
            {{field.convention_name}} = {{cs_editor_init_value field.ctype}};
        {{~end~}}
        {{~end~}}
    }

    {{~if !x.is_abstract_type~}}
    public {{if parent_def_type}}override{{end}} void LoadJson(JSONObject _json)
    {
        {{~ for field in hierarchy_fields ~}}
        { 
            var _fieldJson = _json["{{field.name}}"];
            if (_fieldJson != null)
            {
                {{cs_unity_editor_json_load '_fieldJson' field.convention_name field.ctype}}
            }
        }
        
        {{~end~}}
    }

    public {{if parent_def_type}}override{{end}} void SaveJson(JSONObject _json)
    {
        {{~if parent~}}
        _json["{{x.json_type_name_key}}"] = "{{x.full_name}}";
        {{~end~}}
        {{~ for field in hierarchy_fields ~}}
            {{~if field.ctype.is_nullable}}
        if ({{field.convention_name}} != null)
        {
            {{cs_unity_editor_json_save '_json' field.name field.convention_name field.ctype}}
        }
            {{~else~}}
        {
                {{~if (cs_is_editor_raw_nullable field.ctype)}}
            if ({{field.convention_name}} == null) { throw new System.ArgumentNullException(); }
                {{~end~}}
            {{cs_unity_editor_json_save '_json' field.name field.convention_name field.ctype}}
        }
            {{~end~}}
        {{~end~}}
    }
    {{~else~}}
     public abstract void LoadJson(JSONObject _json);
     public abstract void SaveJson(JSONObject _json);
    {{~end~}}

    public static {{name}} LoadJson{{name}}(JSONNode _json)
    {
    {{~if x.is_abstract_type~}}
        string type = _json["{{x.json_type_name_key}}"];
        {{name}} obj;
        switch (type)
        {
        {{~for child in x.hierarchy_not_abstract_children~}}
            {{~if child.namespace == x.namespace && x.namespace != '' ~}}
            case "{{child.full_name}}":   
            {{~end~}}
            case "{{cs_impl_data_type child x}}":obj = new {{child.full_name}}(); break;
        {{~end~}}
            default: throw new SerializationException();
        }
    {{~else~}}
        {{name}} obj = new {{x.full_name}}();
    {{~end~}}
        obj.LoadJson((JSONObject)_json);
        return obj;
    }
        
    public static void SaveJson{{name}}({{name}} _obj, JSONNode _json)
    {
    {{~if x.is_abstract_type~}}
        _json["{{x.json_type_name_key}}"] = _obj.GetType().Name;
    {{~end~}}
        _obj.SaveJson((JSONObject)_json);
    }

    {{~ for field in fields ~}}
{{~if field.comment != '' ~}}
    /// <summary>
    /// {{field.escape_comment}}
    /// </summary>
{{~end~}}
    public {{cs_editor_define_type field.ctype}} {{field.convention_name}} { get; set; }

    {{~end~}}


    public {{x.cs_method_modifier}} void Resolve(Dictionary<string, object> _tables)
    {
        {{~if parent_def_type~}}
        base.Resolve(_tables);
        {{~end~}}
        {{~ for field in export_fields ~}}
        {{~if field.gen_ref~}}
        {{cs_ref_validator_resolve field}}
        {{~else if field.has_recursive_ref~}}
        {{cs_recursive_resolve field '_tables'}}
        {{~end~}}
        {{~end~}}
        PostResolve();
    }

    public {{x.cs_method_modifier}} void TranslateText(System.Func<string, string, string> translator)
    {
        {{~if parent_def_type~}}
        base.TranslateText(translator);
        {{~end~}}
        {{~ for field in export_fields ~}}

        {{~end~}}
    }


    public override string ToString()
    {
        return "{{full_name}}{ "
    {{~ for field in hierarchy_export_fields ~}}
        + "{{field.convention_name}}:" + {{cs_to_string field.convention_name field.ctype}} + ","
    {{~end~}}
        + "}";
    }
    
    partial void PostInit();
    partial void PostResolve();
}

{{cs_end_name_space_grace x.namespace_with_editor_top_module}}

4、使用以下代碼保存,把現(xiàn)有的表格進(jìn)行單獨(dú)保存,如果要實(shí)現(xiàn)存檔功能把表格存在同一個(gè)文件下即可

TbBaseObject tables = new TbBaseObject();
string fileA2 = Application.streamingAssetsPath + "/a2.json";
tables._SaveData(fileA2);

注意:這里使用Editor參考修改自己的模板后,文件屬性的生成格式進(jìn)行了改變,部分屬性(long?)格式?jīng)]法用了。我這里項(xiàng)目不需要特殊的屬性倒是沒(méi)啥影響,有能力的就別替換editor模板直接進(jìn)行修改吧。
還有模板的TranslateText不能使用了,進(jìn)行了屏蔽,大家可以把三個(gè)模板里面的TranslateText方法全刪掉。當(dāng)然本地化方面有了加載單表的方法,需要切換語(yǔ)言的時(shí)候進(jìn)行切換json即可。

下面是修改過(guò)后的三個(gè)模板:
bean.tql

using Bright.Serialization;
using System.Collections.Generic;
using SimpleJSON;

{{
    name = x.name
    parent_def_type = x.parent_def_type
    parent = x.parent
    hierarchy_fields = x.hierarchy_fields
    fields = x.fields
    export_fields = x.export_fields
    hierarchy_export_fields = x.hierarchy_export_fields
}}

{{cs_start_name_space_grace x.namespace_with_top_module}} 

{{~if x.comment != '' ~}}
/// <summary>
/// {{x.escape_comment}}
/// </summary>
{{~end~}}
public {{x.cs_class_modifier}} partial class {{name}} : {{if parent_def_type}} {{parent}} {{else}} EditorBeanBase {{end}}
{
    public {{name}}()
    {
        {{~ for field in fields ~}}
        {{~if (cs_editor_need_init field.ctype) && !field.ctype.is_nullable ~}}
            {{field.convention_name}} = {{cs_editor_init_value field.ctype}};
        {{~end~}}
        {{~end~}}
    }

    {{~if !x.is_abstract_type || parent_def_type ~}}
    public void LoadJson(JSONObject _json)
    {
        {{~ for field in hierarchy_fields ~}}
        { 
            var _fieldJson = _json["{{field.name}}"];
            if (_fieldJson != null)
            {
                {{cs_unity_editor_json_load '_fieldJson' field.convention_name field.ctype}}
            }
        }
        
        {{~end~}}
    }

    public void SaveJson(JSONObject _json)
    {
        {{~if parent~}}
        _json["{{x.json_type_name_key}}"] = "{{x.full_name}}";
        {{~end~}}
        {{~ for field in hierarchy_fields ~}}
            {{~if field.ctype.is_nullable}}
        if ({{field.convention_name}} != null)
        {
            {{cs_unity_editor_json_save '_json' field.name field.convention_name field.ctype}}
        }
            {{~else~}}
        {
                {{~if (cs_is_editor_raw_nullable field.ctype)}}
            if ({{field.convention_name}} == null) { throw new System.ArgumentNullException(); }
                {{~end~}}
            {{cs_unity_editor_json_save '_json' field.name field.convention_name field.ctype}}
        }
            {{~end~}}
        {{~end~}}
    }
    {{~end~}}

    public static {{name}} LoadJson{{name}}(JSONNode _json)
    {
    {{~if x.is_abstract_type~}}
        string type = _json["{{x.json_type_name_key}}"];
        {{name}} obj;
        switch (type)
        {
        {{~for child in x.hierarchy_not_abstract_children~}}
            {{~if child.namespace == x.namespace && x.namespace != '' ~}}
            case "{{child.full_name}}":   
            {{~end~}}
            case "{{cs_impl_data_type child x}}":obj = new {{child.full_name}}(); break;
        {{~end~}}
            default: throw new SerializationException();
        }
    {{~else~}}
        {{name}} obj = new {{x.full_name}}();
    {{~end~}}
        obj.LoadJson((JSONObject)_json);
        return obj;
    }
        
    public static void SaveJson{{name}}({{name}} _obj, JSONNode _json)
    {
    {{~if x.is_abstract_type~}}
        _json["{{x.json_type_name_key}}"] = _obj.GetType().Name;
    {{~end~}}
        _obj.SaveJson((JSONObject)_json);
    }

    {{~ for field in fields ~}}
{{~if field.comment != '' ~}}
    /// <summary>
    /// {{field.escape_comment}}
    /// </summary>
{{~end~}}
    public {{cs_editor_define_type field.ctype}} {{field.convention_name}} { get; set; }

    {{~end~}}


    public {{x.cs_method_modifier}} void Resolve(Dictionary<string, object> _tables)
    {
        {{~if parent_def_type~}}
        base.Resolve(_tables);
        {{~end~}}
        {{~ for field in export_fields ~}}
        {{~if field.gen_ref~}}
        {{cs_ref_validator_resolve field}}
        {{~else if field.has_recursive_ref~}}
        {{cs_recursive_resolve field '_tables'}}
        {{~end~}}
        {{~end~}}
        PostResolve();
    }

    public override string ToString()
    {
        return "{{full_name}}{ "
    {{~ for field in hierarchy_export_fields ~}}
        + "{{field.convention_name}}:" + {{cs_to_string field.convention_name field.ctype}} + ","
    {{~end~}}
        + "}";
    }
    
    partial void PostInit();
    partial void PostResolve();
}

{{cs_end_name_space_grace x.namespace_with_editor_top_module}}

table.tql

using Bright.Serialization;
using System.Collections.Generic;
using SimpleJSON;

{{ 
    name = x.name
    key_type = x.key_ttype
    key_type1 =  x.key_ttype1
    key_type2 =  x.key_ttype2
    value_type =  x.value_ttype
}}

{{cs_start_name_space_grace x.namespace_with_top_module}} 

{{~if x.comment != '' ~}}
/// <summary>
/// {{x.escape_comment}}
/// </summary>
{{~end~}}
public sealed partial class {{name}} : IVOFun
{
    {{~if x.is_map_table ~}}
    private readonly Dictionary<{{cs_define_type key_type}}, {{cs_define_type value_type}}> _dataMap;
    private readonly List<{{cs_define_type value_type}}> _dataList;
    
    public {{name}}()
    {
        _dataMap = new Dictionary<{{cs_define_type key_type}}, {{cs_define_type value_type}}>();
        _dataList = new List<{{cs_define_type value_type}}>();
    }

    public Dictionary<{{cs_define_type key_type}}, {{cs_define_type value_type}}> DataMap => _dataMap;
    public List<{{cs_define_type value_type}}> DataList => _dataList;

{{~if value_type.is_dynamic~}}
    public T GetOrDefaultAs<T>({{cs_define_type key_type}} key) where T : {{cs_define_type value_type}} => _dataMap.TryGetValue(key, out var v) ? (T)v : null;
    public T GetAs<T>({{cs_define_type key_type}} key) where T : {{cs_define_type value_type}} => (T)_dataMap[key];
{{~end~}}
    public {{cs_define_type value_type}} GetOrDefault({{cs_define_type key_type}} key) => _dataMap.TryGetValue(key, out var v) ? v : null;
    public {{cs_define_type value_type}} Get({{cs_define_type key_type}} key) => _dataMap[key];
    public {{cs_define_type value_type}} this[{{cs_define_type key_type}} key] => _dataMap[key];

    public void Resolve(Dictionary<string, object> _tables)
    {
        foreach(var v in _dataList)
        {
            v.Resolve(_tables);
        }
        PostResolve();
    }
        {{~else if x.is_list_table ~}}
    private readonly List<{{cs_define_type value_type}}> _dataList;
    
    {{~if x.is_union_index~}}
    private {{cs_table_union_map_type_name x}} _dataMapUnion;
    {{~else if !x.index_list.empty?~}}
    {{~for idx in x.index_list~}}
    private Dictionary<{{cs_define_type idx.type}}, {{cs_define_type value_type}}> _dataMap_{{idx.index_field.name}};
    {{~end~}}
    {{~end~}}

    public {{name}}(JSONNode _json)
    {
        _dataList = new List<{{cs_define_type value_type}}>();
        
        foreach(JSONNode _row in _json.Children)
        {
            var _v = {{cs_define_type value_type}}.Deserialize{{value_type.bean.name}}(_row);
            _dataList.Add(_v);
        }
    {{~if x.is_union_index~}}
        _dataMapUnion = new {{cs_table_union_map_type_name x}}();
        foreach(var _v in _dataList)
        {
            _dataMapUnion.Add(({{cs_table_key_list x "_v"}}), _v);
        }
    {{~else if !x.index_list.empty?~}}
    {{~for idx in x.index_list~}}
        _dataMap_{{idx.index_field.name}} = new Dictionary<{{cs_define_type idx.type}}, {{cs_define_type value_type}}>();
    {{~end~}}
    foreach(var _v in _dataList)
    {
    {{~for idx in x.index_list~}}
        _dataMap_{{idx.index_field.name}}.Add(_v.{{idx.index_field.convention_name}}, _v);
    {{~end~}}
    }
    {{~end~}}
        PostInit();
    }

    public List<{{cs_define_type value_type}}> DataList => _dataList;

    {{~if x.is_union_index~}}
    public {{cs_define_type value_type}} Get({{cs_table_get_param_def_list x}}) => _dataMapUnion.TryGetValue(({{cs_table_get_param_name_list x}}), out {{cs_define_type value_type}} __v) ? __v : null;
    {{~else if !x.index_list.empty? ~}}
        {{~for idx in x.index_list~}}
    public {{cs_define_type value_type}} GetBy{{idx.index_field.convention_name}}({{cs_define_type idx.type}} key) => _dataMap_{{idx.index_field.name}}.TryGetValue(key, out {{cs_define_type value_type}} __v) ? __v : null;
        {{~end~}}
    {{~end~}}

    public void Resolve(Dictionary<string, object> _tables)
    {
        foreach(var v in _dataList)
        {
            v.Resolve(_tables);
        }
        PostResolve();
    }

    {{~else~}}

     private readonly {{cs_define_type value_type}} _data;

    public {{name}}(JSONNode _json)
    {
        if(!_json.IsArray)
        {
            throw new SerializationException();
        }
        if (_json.Count != 1) throw new SerializationException("table mode=one, but size != 1");
        _data = {{cs_define_type value_type}}.Deserialize{{value_type.bean.name}}(_json[0]);
        PostInit();
    }

    {{~ for field in value_type.bean.hierarchy_export_fields ~}}
{{~if field.comment != '' ~}}
    /// <summary>
    /// {{field.escape_comment}}
    /// </summary>
{{~end~}}
     public {{cs_define_type field.ctype}} {{field.convention_name}} => _data.{{field.convention_name}};
    {{~end~}}

    public void Resolve(Dictionary<string, object> _tables)
    {
        _data.Resolve(_tables);
        PostResolve();
    }
    {{~end~}}
    
    public void _LoadData(string data)
    {
        JSONNode _json = JSON.Parse(data);
        foreach(JSONNode _row in _json.Children)
        {
            var _v = {{cs_define_type value_type}}.LoadJson{{value_type.bean.name}}(_row);
            _dataList.Add(_v);
            _dataMap.Add(_v.{{x.index_field.convention_name}}, _v);
        }
        PostInit();
    }

     public void _SaveData(string file)
    {            
        JSONArray jsons = new JSONArray();
        foreach (var v in _dataList) {
            JSONObject json = new JSONObject();
            v.SaveJson(json);
            jsons.Add(json);
        }
        System.IO.File.WriteAllText(file, jsons.ToString(), System.Text.Encoding.UTF8);
    }

    partial void PostInit();
    partial void PostResolve();
}

{{cs_end_name_space_grace x.namespace_with_top_module}}

tables.tql

using Bright.Serialization;
using SimpleJSON;
{{
    name = x.name
    namespace = x.namespace
    tables = x.tables
}}

{{cs_start_name_space_grace x.namespace}} 

//所有V0對(duì)象必須繼承該接口
//在數(shù)據(jù)加載時(shí)調(diào)用 LoadData(外部讀取的源數(shù)據(jù))
public interface IVOFun
{
    void _LoadData(string data);
    void _SaveData(string file);
}


public interface EditorBeanBase
{
    public void LoadJson(JSONObject json);
    public void SaveJson(JSONObject json);
}

public sealed partial class {{name}}
{
    {{~for table in tables ~}}
{{~if table.comment != '' ~}}
    /// <summary>
    /// {{table.escape_comment}}
    /// </summary>
{{~end~}}
    public {{table.full_name}} {{table.name}} {get; }
    {{~end~}}

    public {{name}}(System.Func<string, JSONNode> loader){ }
    
    partial void PostInit();
    partial void PostResolve();
}

{{cs_end_name_space_grace x.namespace}}

五、思路(額外擴(kuò)展)

順便說(shuō)下個(gè)人的項(xiàng)目思路,僅供參考。這里比較麻煩的就是考慮了多語(yǔ)言切換,第一個(gè)最簡(jiǎn)單的辦法就是限制只能游戲開(kāi)始界面切換語(yǔ)言,切換的時(shí)候只要刷新界面語(yǔ)言或者重新加載界面即可;第二個(gè)就是在游戲中切換語(yǔ)言的時(shí)候,將基礎(chǔ)數(shù)據(jù)表格重新加載,游戲中各種對(duì)應(yīng)文本也進(jìn)行切換。
很明顯我做的是pc端游戲,而且考慮到現(xiàn)在切換語(yǔ)言這種東西已經(jīng)默認(rèn)在開(kāi)始界面設(shè)置了,畢竟隨時(shí)切換的那種費(fèi)時(shí)費(fèi)力還不討好。

void LoadData(string language) {
   if ("第一次加載")
   {
       //加載表格
       var terrain = DataManager.Instance.GetVOData<TbBaseTerrain>("xxx", language);
       var character = DataManager.Instance.GetVOData<TbBaseCharacter>("xxx", language);
       var story = DataManager.Instance.GetVOData<TbBaseStory>("xxx", language);
       //通過(guò)基礎(chǔ)數(shù)據(jù)進(jìn)行世界生成
       //...
       //保存存檔到TbWorld、tbCharacter等表;
       //表格內(nèi)存的基本上都是基本類(lèi)型的Id,比如人物存的是 人物類(lèi)型Id、人物名稱(chēng)、人物經(jīng)歷Id的集合、人物的關(guān)系Id的集合
       //...
   }
   else {
       //加載表格
       var v = DataManager.Instance.GetVOData<TbBaseTerrain>("xxx", language);
       var character = DataManager.Instance.GetVOData<TbBasecharacter>("xxx", language);
       var story = DataManager.Instance.GetVOData<TbBaseStory>("xxx", language);
       //加載TbWorld、tbCharacter等表
       //...
       //將真正的(某種語(yǔ)言)游戲數(shù)據(jù)整合
       //...
   }
}

總結(jié)

老項(xiàng)目一般都用py寫(xiě)的打表工具,有諸多限制(一般只能是普通的數(shù)據(jù)類(lèi)型,支持list、數(shù)值,如果有復(fù)雜的結(jié)構(gòu)得靠多個(gè)表格堆)。Luban很好的解決了不少潛在的問(wèn)題,使用中也比較穩(wěn)定,歡迎大家一起使用。
吐槽下csdn保存文章,之前寫(xiě)的有點(diǎn)不全面——于是我進(jìn)行了小修改,但是登錄過(guò)期了導(dǎo)致重新登錄后沒(méi)保存上,又重新整了一遍。
2023.5.5:修復(fù)bean.tpl多態(tài)bean的加載保存問(wèn)題。原因:使用繼承后,父類(lèi)為抽象類(lèi)因?yàn)閕s_abstract_type的判斷會(huì)丟失LoadJson文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-444874.html

到了這里,關(guān)于unity強(qiáng)力配置插件-Luban使用(一)加載保存的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • UEditor富文本編輯器上傳圖片打不開(kāi),提示“后端配置項(xiàng)沒(méi)有正常加載,上傳插件不能正常使用”

    UEditor富文本編輯器上傳圖片打不開(kāi),提示“后端配置項(xiàng)沒(méi)有正常加載,上傳插件不能正常使用”

    1、安裝 npm install?vue-ueditor-wrap 2、下載所需資源 這一步在解決報(bào)錯(cuò)的時(shí)候會(huì)用到 ?????????? UEditor資源下載鏈接 上面的打不開(kāi)請(qǐng)從下面鏈接下載項(xiàng)目 ueditor-download: vue項(xiàng)目中集成ueditor的UE資源 3、下載完成后將文件夾放到public文件夾下 4、 配置ueditor.config.js,并且在main.j

    2024年02月13日
    瀏覽(97)
  • 【Unity】 Unity PackageManager通過(guò)git url 加載插件失敗問(wèn)題

    【Unity】 Unity PackageManager通過(guò)git url 加載插件失敗問(wèn)題

    我在測(cè)試dolby 的unity demo 的時(shí)候,遇到加載package 失敗的問(wèn)題。 [Package Manager Window] Cannot perform upm operation: Unable to add package [https://github.com/focus-creative-games/hybridclr_unity.git]: 網(wǎng)上查解決辦法, 使用下面的改變系統(tǒng)環(huán)境變量還是沒(méi)有效果。 Unity 通過(guò)url 下載插件失敗 最后嘗試自己

    2024年04月15日
    瀏覽(24)
  • 【Unity】基于GLTFUtility插件加載gltf格式數(shù)據(jù)

    【Unity】基于GLTFUtility插件加載gltf格式數(shù)據(jù)

    https://github.com/Siccity/GLTFUtility gltf格式數(shù)據(jù)插件直接拖放至asset下即可 將UI組件掛載到腳本參數(shù)。 參考上文第二節(jié),補(bǔ)充相關(guān)代碼。 測(cè)試數(shù)據(jù):食人花動(dòng)畫(huà)模型 注意,這個(gè)插件不支持EXT_texture_webp拓展。 如果glb格式數(shù)據(jù)加載出現(xiàn)報(bào)錯(cuò) JsonReaderException: Unexpected character encountered

    2024年02月15日
    瀏覽(18)
  • Qt中的配置文件:實(shí)現(xiàn)個(gè)性化應(yīng)用程序配置與保存加載

    在現(xiàn)代軟件開(kāi)發(fā)中,用戶(hù)對(duì)于應(yīng)用程序的個(gè)性化配置和設(shè)置變得越來(lái)越重要。為了滿(mǎn)足用戶(hù)需求并提供更好的用戶(hù)體驗(yàn),開(kāi)發(fā)人員常常需要實(shí)現(xiàn)一種機(jī)制,以便在每次啟動(dòng)應(yīng)用程序時(shí)能夠記住用戶(hù)上次的配置。這樣用戶(hù)就可以方便地恢復(fù)到他們熟悉的環(huán)境,無(wú)需重新進(jìn)行所有

    2024年02月11日
    瀏覽(31)
  • 邁德威視MindVision相機(jī)配置文件的保存與加載/相機(jī)參數(shù)移植

    邁德威視MindVision相機(jī)配置文件的保存與加載/相機(jī)參數(shù)移植

    我們會(huì)遇到這樣的情況,在一臺(tái)電腦上(如我們自己的筆記本)安裝了MindVision相機(jī)的驅(qū)動(dòng)軟件,想要使用MindVision相機(jī)成像。在我們搭建的成像環(huán)境下,假設(shè)想要對(duì)螺栓進(jìn)行成像,我們可能調(diào)試出了一套合適的相機(jī)參數(shù),包括曝光、增益等,然后在此基礎(chǔ)上采集圖像、進(jìn)行后續(xù)

    2024年02月15日
    瀏覽(83)
  • unity開(kāi)放世界解決方案-World Streamer 2加載插件(一)

    unity開(kāi)放世界解決方案-World Streamer 2加載插件(一)

    我原來(lái)想做開(kāi)放世界獨(dú)立游戲,是不是很大膽?整個(gè)游戲完全是開(kāi)放世界,就這個(gè)游戲,就完全是這個(gè)獨(dú)立游戲(團(tuán)隊(duì)就我一個(gè)人)。 我最早和朋友說(shuō)的時(shí)候,就是做獨(dú)立游戲,做開(kāi)放世界獨(dú)立游戲,所有朋友啊都很興奮,宮崎英高、小島秀夫、默神啊他們啊都很興奮,一直

    2024年02月11日
    瀏覽(22)
  • 使用Python保存和加載 字典 變量

    使用Python保存和加載 字典 變量node_message

    2024年02月14日
    瀏覽(24)
  • (十)人工智能應(yīng)用--深度學(xué)習(xí)原理與實(shí)戰(zhàn)--模型的保存與加載使用

    (十)人工智能應(yīng)用--深度學(xué)習(xí)原理與實(shí)戰(zhàn)--模型的保存與加載使用

    目的:將訓(xùn)練好的模型保存為文件,下次使用時(shí)直接加載即可,不必重復(fù)建模訓(xùn)練。 神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練好之后,可以保存為文件以持久存儲(chǔ),這樣下次使用時(shí)就不重新建模訓(xùn)練,直接加載就可以。TensorfLow提供了靈活的模型保存方案,既可以同時(shí)保存網(wǎng)絡(luò)結(jié)構(gòu)和權(quán)重(即保存全模

    2024年02月13日
    瀏覽(38)
  • unity3d:asset store上C#代碼熱重載插件,不需要重運(yùn)行,重新加載更新后函數(shù)

    unity3d:asset store上C#代碼熱重載插件,不需要重運(yùn)行,重新加載更新后函數(shù)

    https://assetstore.unity.com/packages/tools/utilities/hot-reload-edit-code-without-compiling-250972?clickref=1011lwHg8abvutm_source=partnerizeutm_medium=affiliateutm_campaign=unity_affiliate#description ●方法1:通過(guò)導(dǎo)航到Unity菜單欄中的“窗口”打開(kāi)熱重裝窗口,然后選擇“熱重裝”。 ●方法2:使用快捷鍵組合“Alt+Shift

    2024年02月02日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包