源码2:StandaloneInputModule
在上文EventSystem中,EventSystem调用了BaseInputModule的process函数,将输入的部分交给了输入模块去处理。根据处理流程的不一样,开发者可以实现不同的BaseInputModule子类,并重写process函数。Unity则是提供了默认的StandaloneInputModule类。这一篇文章先来了解BaseInputModule的继承结构,随后以process函数为入口,继续了解事件系统。
BaseInputModule 的继承结构
BaseInputModule抽象类
PointerInputModule抽象类 继承BaseInputModule
StandaloneInputModule类继承PointerInputModule
TouchInputModule类 继承PointerInputModule(已废弃 功能完全整合到了StandaloneInputModule)
上篇EventSytem 有说到 其主要是更新输入模块BaseInputModule 的process 函数 所以这个为输入响应入口
BaseInputModule
// 用来缓存射线投射后的取得的结果
[NonSerialized]
protected List<RaycastResult> m_RaycastResultCache = new List<RaycastResult>();
//轴向相关的数据
private AxisEventData m_AxisEventData;
private EventSystem m_EventSystem;
private BaseEventData m_BaseEventData;
AxisEventData 的定义也比较简单 一个原始的输入方向 移动朝向的美剧
其他
/// <summary>
/// Event Data associated with Axis Events (Controller / Keyboard).
/// </summary>
public class AxisEventData : BaseEventData
{
/// <summary>
/// Raw input vector associated with this event.
/// </summary>
public Vector2 moveVector { get; set; }
/// <summary>
/// MoveDirection for this event.
/// </summary>
public MoveDirection moveDir { get; set; }
public AxisEventData(EventSystem eventSystem)
: base(eventSystem)
{
moveVector = Vector2.zero;
moveDir = MoveDirection.None;
通过输入参数确定轴向数据 (移动朝向 和方向枚举)
/// <param name="deadZone">Dead zone.</param>
protected virtual AxisEventData GetAxisEventData(float x, float y, float moveDeadZone)
{
if (m_AxisEventData == null)
m_AxisEventData = new AxisEventData(eventSystem);
m_AxisEventData.Reset();
m_AxisEventData.moveVector = new Vector2(x, y);
m_AxisEventData.moveDir = DetermineMoveDirection(x, y, moveDeadZone);
return m_AxisEventData;
}
实际上在输入模块启用的时候 是添加了一个BaseInput 脚本 ,这个脚本实际上是对以前常用的InputSystem的封装 。所有的输入触摸都是通过这里做检测。
/// <summary>
/// The current BaseInput being used by the input module.
/// </summary
public BaseInput input
{
get
{
if (m_InputOverride != null)
return m_InputOverride;
if (m_DefaultInput == null)
{
var inputs = GetComponents<BaseInput>();
foreach (var baseInput in inputs)
{
// We dont want to use any classes that derrive from BaseInput for default.
if (baseInput != null && baseInput.GetType() == typeof(BaseInpu

本文深入解析Unity的StandaloneInputModule,它是EventSystem中处理标准输入如鼠标和触摸的关键组件。BaseInputModule作为基类,PointerInputModule处理指向设备输入,而StandaloneInputModule在此基础上管理鼠标和触摸输入。通过Process方法,它处理输入事件,包括Update、Move和Submit等,确保输入事件正确地传递给UI元素。此外,文章还介绍了触摸事件的处理流程,如Press、Move和Drag事件的处理。
最低0.47元/天 解锁文章
1901

被折叠的 条评论
为什么被折叠?



