源码1:EventSystem
private List<BaseInputModule> m_SystemInputModules = new List<BaseInputModule>();
private BaseInputModule m_CurrentInputModule;
private static List<EventSystem> m_EventSystems = new List<EventSystem>();
EventSystem主要是管理输入组件
protected override void OnEnable()
{
base.OnEnable();
m_EventSystem = GetComponent<EventSystem>();
m_EventSystem.UpdateModules();
}
public void UpdateModules()
{
GetComponents(m_SystemInputModules);
var systemInputModulesCount = m_SystemInputModules.Count;
for (int i = systemInputModulesCount - 1; i >= 0; i--)
{
if (m_SystemInputModules[i] && m_SystemInputModules[i].IsActive())
continue;
m_SystemInputModules.RemoveAt(i);
}
}
每次OnEnable的时候会获取当前EventSystem组件和当前组件上的输入组件BaseInputModule
通常我们创建EventSystem对象上是有绑定StandaloneInputModule 专门用来处理用户的输入
EventSystem会每帧Update 输入模块,通过调用StandaloneInputModule 的process函数来进行输入模块的更新
protected virtual void Update()
{
if (current != this)
return;
TickModules();
bool changedModule = false;
var systemInputModulesCount = m_SystemInputModules.Count;
for (var i = 0; i < systemInputModulesCount; i++)
{
var module = m_SystemInputModules[i];
if (module.IsModuleSupported() && module.ShouldActivateModule())
{
if (m_CurrentInputModule != module)
{
ChangeEventModule(module);
changedModule = true;
}
break;
}
}
// no event module set... set the first valid one...
if (m_CurrentInputModule == null)
{
for (var i = 0; i < systemInputModulesCount; i++)
{
var module = m_SystemInputModules[i];
if (module.IsModuleSupported())
{
ChangeEventModule(module);
changedModule = true;
break;
}
}
}
//这里是进行输入模块的执行操作
if (!changedModule && m_CurrentInputModule != null)
m_CurrentInputModule.Process();
#if UNITY_EDITOR
if (Application.isPlaying)
{
int eventSystemCount = 0;
for (int i = 0; i < m_EventSystems.Count; i++)
{
if (m_EventSystems[i].GetType() == typeof(EventSystem))
eventSystemCount++;
}
if (eventSystemCount > 1)
Debug.LogWarning("There are " + eventSystemCount + " event systems in the scene. Please ensure there is always exactly one event system in the scene");
}
#endif
}
射线获取所有点击对象 (这个后续讲解)
/// <summary>
/// Raycast into the scene using all configured BaseRaycasters.
/// </summary>
/// <param name="eventData">Current pointer data.</param>
/// <param name="raycastResults">List of 'hits' to populate.</param>
public void RaycastAll(PointerEventData eventData, List<RaycastResult> raycastResults)
{
raycastResults.Clear();
var modules = RaycasterManager.GetRaycasters();
var modulesCount = modules.Count;
for (int i = 0; i < modulesCount; ++i)
{
var module = modules[i];
if (module == null || !module.IsActive())
continue;
module.Raycast(eventData, raycastResults);
}
raycastResults.Sort(s_RaycastComparer);
}
看下来其实EventSystem并没有做多少的事情,更多的时将具体的逻辑交给具体的模块去处理。所以说在事件系统中,它更多的是作为一个Manager的存在。
- 负责维护输入模块的列表,并将用户输入交给专门的输入模块去处理。
- 记录当前选中物体。
- 处理射线投射时,将具体逻辑交给RaycasterManager。