相关文档

InputManager

数据存储中心,本身不带有复杂逻辑

创建一个Prefab然后把脚本挂上去,运行时生成一个使用,全局唯一

Player

输入控制的中心,你可能会有很多按键布局,比如战斗按键布局,UI按键布局,每种布局可以当做是一个Controller,而一个玩家可以拥有任意数量的Controller,并按照一定的规则启用

image-20240206000244408

如图,一个玩家拥有一个Controller,Controller内包含了很多控制元素,只是最基本的按键信息,比如A

同时,玩家还有一个ControllerMap,也就是一个Controller对应的功能映射,每个映射成为一个Action,比如按键A对应开火

通过这几个组件,就成功把Player、按键A、Fire,三者关联起来

创建Player

Player是InputManager运行时自动创建的,所以Player信息必须提前配置好

image-20240206001000301

如图,你可以配置每一个Player对应的Map有哪些

获取也很简单:

var player = ReInput.players.GetPlayer(playerId);

获取输入

如果要获取对应的输入,有很多方式

  1. 通过GetXXX

    var value = player.GetAxis("Move Horizontal")
    
  2. 注册事件

     player.AddInputEventDelegate(OnMoveHorizontal, UpdateLoopType.Update, InputActionEventType.AxisActiveOrJustInactive, "Move Horizontal");
    
  3. 内部方法,不推荐

    for(int i = 0; i < player.joystickCount; i++) { ... }
    

Player与Controller Map

Rewired是以Player为核心的,所以CtrlMap存在Player中,而非Controller中,Ctrl只定义按键元素,至于按键对应的具体Action,则由玩家决定

Actions

一个Action对应一个事件,比如开火

你可以直接通过事件处理输入,比如:

 var flag = player.GetButtonDown("Fire");

Action需要通过Editor面板创建,这个Categroy只是显示用的,没有实际意义

image

Input Behaviour

定义操作的详细设置,比如按键的灵敏度,不多解释

Controllers

一个Controller代表一个输入设备,虚拟的或者物理的都行,比如键盘就是一个Ctrl,然后一个Ctrl内包含了很多的按键元素

这部分内容其实不是非常关心

Controller Maps

核心,决定了Action怎么映射Controller

Map + Layout

Map是一级分类,Layout是二级分类,根据分类不同可以对应不同的Ctrl

区别在于,所有Ctrl共享Map类型,而每一个Ctrl都拥有自己的Layout

举例来说

Map对应于:战斗按键,UI按键,载具按键等等

Layout对应于:传统布局,现代布局,推荐布局等等

Map Enabler

决定启用哪些Map

首先需要定义一些RuleSet,也就是规则

image

之后有几种方式进行控制,这里介绍个人喜好的一种

// 我们定义的规则
private ControllerMapEnabler.RuleSet m_DisableAll;
private ControllerMapEnabler.RuleSet m_Normal;

// 初始化
m_DisableAll = ReInput.mapping.GetControllerMapEnablerRuleSetInstance(RewiredConsts.MapEnablerRuleSet.DisableAll);
m_Normal = ReInput.mapping.GetControllerMapEnablerRuleSetInstance(RewiredConsts.MapEnablerRuleSet.Normal);

// 添加
m_Player.controllers.maps.mapEnabler.ruleSets.Add(m_DisableAll);
m_Player.controllers.maps.mapEnabler.ruleSets.Add(m_Normal);

// 之后我们可以进行控制了
m_DisableAll.enabled = false;
m_Normal.enabled = true;
m_Player.controllers.maps.mapEnabler.Apply();