Análisis de principios de Unity uGUI

Análisis de principios de Unity uGUI

Unity uGUI es la solución de interfaz de usuario oficial lanzada por Unity. Proporcionado en Unity como un paquete. Manual de referencia oficial API Referencia

El uso de Unity uGUI puede referirse a la enseñanza súper detallada de Unity UGUI

Preparación

Dado que UGUI es el paquete central proporcionado por Unity, para poder ver y depurar el código fuente. Debe verificar los paquetes integrados en Preferencias -> Herramientas externas -> Generar archivo .csproj para: Después de regenerar, puede ver el proyecto en Visual Studio UnityEngine.UI. En este punto, puede usar 附加到Unityla función normalmente para depurar el código UGUI.

Con la función Ver diagrama de clases de Visual Studio, podemos ver UnityEngine.UIel diagrama de clases. Para generar un diagrama de clases, puede consultar la estructura del código VS para generar automáticamente un diagrama de clases .

El diagrama de clase específico es más o menos el siguiente (versión de Unity 2019.4.20):
inserte la descripción de la imagen aquí

análisis de diagrama de clases

Se puede ver en el diagrama de clases que la clase base de los componentes de la interfaz de usuario en UGUI es UIBehaviour. Los componentes de la interfaz de usuario se pueden dividir aproximadamente en:

Principio de UGUI

En UGUI, la composición de la interfaz de usuario es aproximadamente interfaces y eventos. y
se generará automáticamente al crear la UI , estos dos corresponden a la interfaz y los eventos. Aquí también suele aparecer junto con .CanvasEventSystemEventSystemInput Module

EventSystemHeredado de UIBehaviour, podemos ver que se agrega a m_EventSystemsesta variable estática cuando es OnEnable y se elimina cuando es OnDisable m_EventSystems. El propósito de este paso es determinar si el actual está en Actualización. Es decir, si hay varios EventSystemcomponentes, solo uno activará el contenido en Actualizar.

Al final de Update, después de una serie de juicios, se llamará al método Process de InputModule.

public class EventSystem : UIBehaviour
{
    
    
	//...
	protected override void OnEnable()
	{
    
    
	    base.OnEnable();
	    m_EventSystems.Add(this);
	}
	
	protected override void OnDisable()
	{
    
    
	    if (m_CurrentInputModule != null)
	    {
    
    
	        m_CurrentInputModule.DeactivateModule();
	        m_CurrentInputModule = null;
	    }
	
	    m_EventSystems.Remove(this);
	
	    base.OnDisable();
	}
    protected virtual void Update()
    {
    
    
        if (current != this)
            return;
        TickModules(); // <<--  在这里触发 InputModule 的 UpdateModule 方法
		
		//...
       	if (!changedModule && m_CurrentInputModule != null)
			m_CurrentInputModule.Process(); // <<-- 在这里进行输入的处理
    }
	//...
}

InputModule tiene PointerInputModule, StandaloneInputModule, TouchInputModule, estas clases se heredan de BaseInputModule.

Aquí hay StandaloneInputModuleun ejemplo, donde la función Proceso es el método llamado en Actualizar en EventSystem. También será llamado ProcessMouseEvent para manejar eventos del mouse. Antes de manejar el evento, también necesitamos saber en qué componente se hizo clic. Por lo tanto, GetMousePointerEventData también llamará EventSystem.RaycastAllpara realizar la detección de rayos en BaseRaycasterlos componentes heredados de .

public class StandaloneInputModule : PointerInputModule
{
    
    
	//...
    public override void Process()
    {
    
    
        if (!eventSystem.isFocused && ShouldIgnoreEventsOnNoFocus())
            return;
        // ...
        // touch needs to take precedence because of the mouse emulation layer
        if (!ProcessTouchEvents() && input.mousePresent)
            ProcessMouseEvent(); // 处理鼠标事件
        // ...
    }
	/// <summary>
    /// Process all mouse events.
    /// </summary>
    protected void ProcessMouseEvent(int id)
    {
    
    
        var mouseData = GetMousePointerEventData(id); // << 在这里面会调用 EventSystem.RaycastAll 来执行射线检测
		//...
    }
}

Resumen: EventSystem detecta principalmente todos los objetos (BaseRaycaster) que necesitan ser detectados a través del módulo de entrada (InputModule). Por lo general, lo que vemos es GraphicRaycaster (y Canvas montado en el objeto de juego unificado) para la detección de rayos. Luego llame a cada Gráfico (es decir, RawImage, Image, Text) que implementa la interfaz ICanvasRaycastFilter a través de GraphicRaycaster.

Supongo que te gusta

Origin blog.csdn.net/qq_36433883/article/details/125444197
Recomendado
Clasificación