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羣: