在上一节,我们动态生成了音量的配置文件,但是它是直接通过LitJson.JsonMapper
生成的,由于我们传入的是一个List,所以最后生成的也是一个数组(用中括号括起来的)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| [ { "Name": "Game_BG", "Volume": 0.5 }, { "Name": "player_0", "Volume": 0.5 }, { "Name": "player_1", "Volume": 0.5 }, { "Name": "player_2", "Volume": 0.5 }, { "Name": "UI_ClickButton", "Volume": 0.5 }, { "Name": "UI_Loading", "Volume": 0.5 }, { "Name": "UI_StartGame", "Volume": 0.5 } ]
|
我们需要IReader
提供一个获取数组对象Count的方法。
IReader
添加Count
方法
1 2 3 4 5 6 7
| using System.Collections.Generic;
public interface IReader { void Count(System.Action<int> callback); }
|
我们想要将获取json数组数量的方法Count
传进KeyQueue
中,在读取Key的时候如果发现当前的Key是个Action,就说明调用了Count方法,此时返回当前tempdata所代表的json数组的数量即可。
JsonReader
修改JsonReader
的实现,让它支持Count
方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| public class JsonReader : IReader { public void Count(Action<int> callback) { bool success = SetKey<Action>(() => { callback?.Invoke(GetCount()); }); if (!success) callback?.Invoke(GetCount()); else { _keyQueues.Enqueue(_keys); _keys = null; } } private int GetCount() { return _tempData.IsArray ? _tempData.Count : 0; } private void ExecuteKeyQueues() { if(_data == null) return;
IReader reader = null; foreach (KeyQueue keyQueue in _keyQueues) { foreach (object key in keyQueue) { if (key is string m) reader = this[m]; else if (key is int n) reader = this[n]; else if (key is Action o) o.Invoke(); else Debug.LogError("当前键值类型还不支持"); } keyQueue.Complete(_tempData); } } }
|