在上一节,我们动态生成了音量的配置文件,但是它是直接通过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)//说明data已经读取完毕
callback?.Invoke(GetCount());
else//一定要重置KeyQueue,否则读取不出来
{
_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);
}
}
//...
}