U4S1L15——通过Json数据加载配置文件

本章代码关键字

1
2
InputActionAsset.FromJson()         //将Json字符串转换为InputActionAsset
playerInput.actions.Enable() //激活PlayerInput使用的InputActionAsset

分析PlayerInput文件中的输入配置文件

PlayerInput​的定义文件内,我们可以发现actions​参数使用的是InputActionAsset​这个类型

1
2
//PlayerInput类内的定义
public InputActionAsset actions

进一步探索InputActionAsset​的定义,我们可以发现一个读取Json字符串并解析返回InputActionAsset​的静态方法

1
2
3
4
5
6
7
8
9
10
//InputActionAsset类内的定义
public static InputActionAsset FromJson(string json)
{
if (string.IsNullOrEmpty(json))
throw new ArgumentNullException(nameof(json));

var asset = CreateInstance<InputActionAsset>();
asset.LoadFromJson(json);
return asset;
}

已知输入配置文件本质就是Json文件,通过这个方法,我们就可以通过Json来手动加载输入配置文件

通过Json手动加载输入配置文件

将读取到的Json文件传入InputActionAsset.FromJson()​方法内,将其转换为InputActionAsset​类型,再将其作为PlayerInput​使用的配置文件

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
public PlayerInput input;

void Start()
{
string json = Resources.Load<TextAsset>("PlayerInputTest").text;
InputActionAsset asset = InputActionAsset.FromJson(json);

input.actions = asset;

input.onActionTriggered += (context) =>
{
if (context.phase == InputActionPhase.Performed)
{
switch (context.action.name)
{
case "Move":
print("移动");
break;
case "Look":
print("看向");
break;
case "Fire":
print("开火");
break;
}
}
};
}

使用Json文件,我们可以手动改变这个json文件的一些参数,来达成改变键位的目的

激活PlayerInput上的Actions

在使用json文件转换为InputActionAsset​类型,并将其作为PlayerInput​使用的配置文件后
可能会出现InputActionAsset对象未激活导致没有输入的情况,这时我们需要手动激活PlayerInput的Actions

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
private PlayerInput input;

void Start()
{
input = GetComponent<PlayerInput>();
input.actions = DataManager.Instance.GetActionAsset();
input.actions.Enable();
input.onActionTriggered += (context) =>
{
if (context.phase == InputActionPhase.Performed )
{
switch (context.action.name)
{
case "Fire":
print("开火");
break;
case "Jump":
print("跳跃");
break;
case "Move":
print("移动:" + context.ReadValue<Vector2>());
break;
}
}
};
}