UGUI自動化–QImage、QRawImage

UGUI自動化–QImage、QRawImage

今天接着介紹UGUI自動化中的Image和RawImage控件,爲什麼要放在一起介紹呢?主要是封裝的功能和代碼都差不多。QImage繼承自UGUI的Image組件,QRawImage繼承自UGUI的RawImage組件。兩個Image組件都是增加了一個多語言KEY的顯示。圖片也需要多語言,因此通過一個string類型的KEY,根據不同語言動態設置即可。

QImage

在這裏插入圖片描述

QRawImage

在這裏插入圖片描述

圖QImage組件和QRawImage組件都使用一個KEY用來統一處理多語言圖片的顯示。將Image進行封裝也是爲了後面爲Image的默認值的修改可以統一設置,便於管理,下面看如何實現。

QImage組件

新建一個QImage.cs代碼如下

/**
*   Author:onelei
*   Copyright © 2019 - 2020 ONELEI. All Rights Reserved
*/
using UnityEngine;
using UnityEngine.UI;

namespace Lemon.UI
{
    [AddComponentMenu("UI/QImage")]
    public class QImage : Image
    {
        [HideInInspector]
        public bool bInit = false;
        /// <summary>
        /// 多語言key
        /// </summary>
        public string key = string.Empty;

        private GameObject _CacheGameObject = null;
        public GameObject CacheGameObject { get { if (_CacheGameObject == null) { _CacheGameObject = gameObject; } return _CacheGameObject; } }

        private Transform _CacheTransform = null;
        public Transform CacheTransform { get { if (_CacheTransform == null) { _CacheTransform = transform; } return _CacheTransform; } }
    }
}

QImage組件繼承自Unity的Image組件,這點應該都知道。主要是多瞭如下兩個變量

        [HideInInspector]
        public bool bInit = false;
        /// <summary>
        /// 多語言key
        /// </summary>
        public string key = string.Empty;

第一個bInit是用來初始化變量用的,第二個key就是用於多語言處理的KEY。

接着我們新建一個QImageEditor.cs的腳本,將其放入Editor文件夾下。代碼如下

/**
*   Author:onelei
*   Copyright © 2019 - 2020 ONELEI. All Rights Reserved
*/
using UnityEditor;
using UnityEngine;

namespace Lemon.UI
{
    [CustomEditor(typeof(QImage), true)]
    public class QImageEditor : UnityEditor.UI.ImageEditor
    {
        [MenuItem("GameObject/UI/QImage", false, UtilEditor.Priority_QImage)]
        public static QImage AddComponent()
        {
            QImage component = UtilEditor.ExtensionComponentWhenCreate<QImage>(typeof(QImage).Name.ToString());
            //設置默認值
            SetDefaultValue(component);
            return component;
        }

        QImage component;
        public override void OnInspectorGUI()
        {
            component = (QImage)target;
            base.OnInspectorGUI();
            component.key = EditorGUILayout.TextField("KEY", component.key);
            if (!component.bInit)
            {
                component.bInit = true;
                SetDefaultValue(component);
            }
        }

        private static void SetDefaultValue(QImage component)
        {
            if (component == null)
                return;
            component.raycastTarget = false;
        }
    }
}

QImage通過重寫OnInspectorGUI函數,來重新繪製組件的顯示。先調用

base.OnInspectorGUI();

優先繪製Image組件,然後繪製一個ImageField用來顯示多語言所需要的KEY。

然後我們通過SetDefaultValue函數來重寫Image組件裏面的參數。同樣的道理用來封裝RawImage。

QRawImge組件

新建一個QRawImage.cs代碼如下

 /**
*   Author:onelei
*   Copyright © 2019 - 2020 ONELEI. All Rights Reserved
*/
using UnityEngine;
using UnityEngine.UI;

namespace Lemon.UI
{
    [AddComponentMenu("UI/QRawImage")]
    public class QRawImage : RawImage
    {
        [HideInInspector]
        public bool bInit = false;
        /// <summary>
        /// 多語言key
        /// </summary>
        public string key = string.Empty;

        private GameObject _CacheGameObject = null;
        public GameObject CacheGameObject { get { if (_CacheGameObject == null) { _CacheGameObject = gameObject; } return _CacheGameObject; } }

        private Transform _CacheTransform = null;
        public Transform CacheTransform { get { if (_CacheTransform == null) { _CacheTransform = transform; } return _CacheTransform; } }
    }
}

接着我們新建一個QRawImageEditor.cs的腳本,將其放入Editor文件夾下。代碼如下

 /**
*   Author:onelei
*   Copyright © 2019 - 2020 ONELEI. All Rights Reserved
*/
using UnityEditor;
using UnityEngine;

namespace Lemon.UI
{
    [CustomEditor(typeof(QRawImage), true)]
    public class QRawImageEditor : UnityEditor.UI.RawImageEditor
    {
        [MenuItem("GameObject/UI/QRawImage", false, UtilEditor.Priority_QRawImage)]
        public static QRawImage AddComponent()
        { 
            QRawImage component = UtilEditor.ExtensionComponentWhenCreate<QRawImage>(typeof(QRawImage).Name.ToString());
            //設置默認值
            SetDefaultValue(component);
            return component;
        }

        QRawImage component;
        public override void OnInspectorGUI()
        {
            component = (QRawImage)target;
            base.OnInspectorGUI();
            component.key = EditorGUILayout.TextField("KEY", component.key);
            if (!component.bInit)
            {
                component.bInit = true;
                SetDefaultValue(component);
            }
        }

        private static void SetDefaultValue(QRawImage component)
        {
            if (component == null)
                return;
            component.raycastTarget = false;
        } 
    }
}

詳細代碼參見:https://github.com/onelei/Lemon/tree/master/Assets/QGUI,歡迎Star。

歡迎關注微信公衆號:Unity遊戲開發筆記
在這裏插入圖片描述
QQ羣:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章