整了个小Demo仿照《塞尔达传说:旷野之息》,实现 鼠标悬停在Button上时,能够改变Button-Text颜色,并且在Button前显示一个小箭头
标题鼠标指针悬停和移走,改变标题颜色和箭头显示
Unity框架性内容使用C#编写,这些部分均是未来不考虑热更新的配置型的程序,例如如何将UI的Object连接到Lua成为Lua可以调用的变量。Button文字的变色,箭头的显示,这些业务逻辑(考虑到未来可能需要热更新)全部由Lua实现,以后可以在不更新整包软件的情况下,通过热更新的方式只更新Lua脚本来重新编写UI界面的业务逻辑,例如Button直接隐藏,位置修改,scale放大,文字颜色修改rgba等。
附C#代码和Lua代码,,,详细的如何配置Lua解释器运行lua脚本和unity的热更新实现,会在下一篇笔记中全部展示。代码中的UILogic脚本以及Manager.Resource.LoadUI等函数三个脚本属于之后会详细展示的笔记。
//挂到需要检测鼠标悬停的UI物体上
public class UIMenuPointerHover : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
UISelect uiSelect;
void Awake()
{
uiSelect = this.GetComponentInParent<UISelect>();
}
public void OnPointerEnter(PointerEventData eventData)
{
(uiSelect.m_OnPointerClickOrHover)?.Invoke(this.gameObject.name.Replace(" ", ""));
}
public void OnPointerExit(PointerEventData eventData)
{
(uiSelect.m_OnPointerExit)?.Invoke(this.gameObject.name.Replace(" ", ""));
}
}
//通过UIManager挂到ButtonGroup上
public class UISelect : LuaBehaviour
{
//自定义类,连接C# 与 Lua
[System.Serializable]
public class Injection
{
public string name;
public GameObject button;
public GameObject arrow;
}
[SerializeField] private List<Injection> buttons;
[SerializeField] private Image ornament;
Action m_OnMenuUIUpdate;
Action m_OnMenuUIOpen;
public UnityEngine.Events.UnityAction<string> m_OnPointerClickOrHover;
public UnityEngine.Events.UnityAction<string> m_OnPointerExit;
//初始化配置,创建C#与Lua的变量关系
public override void Init(string luaName)
{
base.Init(luaName);
m_ScriptEnv.Get("OnMenuUIUpdate", out m_OnMenuUIUpdate);
m_ScriptEnv.Get("OnMenuUIOpen", out m_OnMenuUIOpen);
m_ScriptEnv.Get("OnPointerClickOrHover", out m_OnPointerClickOrHover);
m_ScriptEnv.Get("OnPointerExit", out m_OnPointerExit)