Notas de estudio avanzado de Unity: marco de interfaz de usuario

En términos generales, un juego tiene una gran cantidad de componentes de interfaz de usuario. Si solo usa el marco de mensajes anterior para procesar toda la información relacionada con la interfaz de usuario, será muy complicado e ineficiente. Por lo tanto, tratamos el sistema de interfaz de usuario como un sistema independiente y construimos un marco de interfaz de usuario

El marco de la interfaz de usuario se divide principalmente en tres capas: UIManager se usa para administrar todos los componentes de la interfaz de usuario y UIController se usa para administrar un determinado panel de la interfaz de usuario, como el panel de información de roles, el panel de la tienda, etc. UIControl se utiliza para controlar cada componente individual de la interfaz de usuario

En el sistema de interfaz de usuario, abandonamos el marco de transmisión utilizado en el sistema de mensajes anterior, porque esta solución necesita escribir métodos para enviar y recibir mensajes específicamente para cada componente de interfaz de usuario, lo cual es demasiado complicado. Esperamos que a través de UIController y UI Manager, cada componente de UI pueda acceder a cualquier otro componente de UI. Por ejemplo, el componente del botón en el controlador "Tienda" puede cambiar directamente la imagen de la cuadrícula de la mochila en el controlador "Mochila" y realizar directamente la función de agregar artículos comprados en la tienda a la mochila.

1 administrador de interfaz de usuario

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UIManager : ManagerBase<UIManager> {
    
    

    public Dictionary<string, UIController> UIControllerDic = new Dictionary<string, UIController>();

    public void SetActive(string controllerName, bool active) {
    
    
        transform.Find(controllerName).gameObject.SetActive(active);
    }

    public UIControl GetUIControl(string controllerName, string controlName) {
    
    
        if (UIControllerDic.ContainsKey(controllerName)) {
    
    
            if (UIControllerDic[controllerName].UIControlDic.ContainsKey(controlName)) {
    
    
                return UIControllerDic[controllerName].UIControlDic[controlName];
            }
        }

        return null;
    }

    public override byte GetMessageType() {
    
    
        return MessageType.Type_UI;
    }


}

Aquí creamos un diccionario para guardar todos los UIControllers en UIManager.

Controle el interruptor de cada UIController en el método SetActive. GetUIControl se utiliza para encontrar un UIControl característico. Tenga en cuenta que aquí primero encontramos el UIController correspondiente y luego encontramos el UIControl debajo del UIController. Este método puede reducir la cantidad de componentes a recorrer, mejorar la eficiencia y evitar el problema de los componentes con el mismo nombre en diferentes UIControllers.

UIManager uiManager = UIManager.Instance as UIManager;

Presta atención a lo que hace esta oración. La clase UIManager hereda ManagerBase y ManagerBase hereda SingletonBase y crea su tipo ManagerBase. Esto hace que el tipo UIManager.Instance aún pertenezca a ManagerBase, lo que genera problemas. Así que aquí tenemos que forzar la conversión de ManagerBase a UIManager

2 controlador de interfaz de usuario

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UIController : MonoBehaviour
{
    
    
    
    public Dictionary<string, UIControl> UIControlDic = new Dictionary<string, UIControl>();

    void Awake() {
    
    
        UIManager.Instance.UIControllerDic.Add(transform.name, this);
        foreach (Transform trans in transform) {
    
    
            if (trans.gameObject.GetComponent<UIControl>() == null) {
    
    
                trans.gameObject.AddComponent<UIControl>();
            }
        }
    }
}


Cree un diccionario en UIController para guardar los UIControls en UIController.

En el método Awake, primero registramos el componente en el diccionario UIManager. Al mismo tiempo, teniendo en cuenta que puede haber muchos componentes de UI bajo un UIController, agregarlos manualmente sería demasiado problemático. Así que recorremos los objetos de UI bajo UIController y agregamos componentes de UIControl a cada uno.

3 Control de interfaz de usuario

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

public class UIControl : MonoBehaviour
{
    
    
    void Awake() {
    
    
        if (transform.parent != null) {
    
    
            UIController controller = transform.GetComponentInParent<UIController>();
            if (controller != null) {
    
    
                controller.UIControlDic.Add(transform.name, this);
            }
        }
    }


    public void ChangeText(string str) {
    
    
        if (GetComponent<Text>() != null) {
    
    
            GetComponent<Text>().text = str;
        }
    }

    public void ChangeImage(Sprite sprite) {
    
    
        if (GetComponent<Image>() != null) {
    
    
            GetComponent<Image>().sprite = sprite;
        }
    }

    public void AddButtonClickEvent(UnityAction action) {
    
    
        Button control = GetComponent<Button>();
        if (control != null) {
    
    
            control.onClick.AddListener(action);
        }
    }

    public void AddSliderEvent(UnityAction<float> action) {
    
    
        Slider control = GetComponent<Slider>();
        if (control != null) {
    
    
            control.onValueChanged.AddListener(action);
        }
    }

    public void AddInputFieldEvent(UnityAction<string> action) {
    
    
        InputField control = GetComponent<InputField>();
        if (control != null) {
    
    
            control.onValueChanged.AddListener(action);
        }
    }
}

En el método Awake, registramos el componente UIControl en UIController. Aquí hemos completado la construcción del marco. Los subsiguientes ChangeText, ChangeImage, AddButtonClickEvent y AddInputFieldEvent son funciones que facilitan las operaciones de la interfaz de usuario. Aquí tome AddButtonClickEvent como ejemplo:

    public void AddButtonClickEvent(UnityAction action) {
    
    
        Button control = GetComponent<Button>();
        if (control != null) {
    
    
            control.onClick.AddListener(action);
        }
    }

El tipo de parámetro de AddButtonClickEvent es UnityAction, que puede entenderse como un método anónimo.Para usar el tipo UnityAction, debe importar UnityEngine.Events. En el siguiente programa, obtenemos el control del componente de botón del objeto del juego y montamos el oyente de acción en el control.

Los principios de implementación de otros métodos son similares, y se pueden agregar más métodos de control de la interfaz de usuario de acuerdo con las necesidades reales en el desarrollo posterior.

Supongo que te gusta

Origin blog.csdn.net/Raine_Yang/article/details/130617771
Recomendado
Clasificación