U4S1L15——通过Json数据加载配置文件
本章代码关键字
1 2
   | InputActionAsset.FromJson()          playerInput.actions.Enable()        
   | 
 
在 PlayerInput 的定义文件内,我们可以发现 actions 参数使用的是 InputActionAsset 这个类型
1 2
   |  public InputActionAsset actions
 
  | 
 
进一步探索 InputActionAsset 的定义,我们可以发现一个读取Json字符串并解析返回 InputActionAsset 的静态方法
1 2 3 4 5 6 7 8 9 10
   |  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 文件的一些参数,来达成改变键位的目的
在使用 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;             }         }     }; }
   |