Files
UnityAI/03_核心功能/UI/UI开发指南.md

3.5 KiB

StrayFog 框架 UI开发指南

一、窗口开发

1.1 创建模板

[HFAssetBundlePath(enHFLanguageRootFolder.ASSETS_GAME_GAMEHFRESOURCE, "UIWindows/MyWindow/MyWindow.prefab")]
[HFUIWindowLayer(enHFUICanvasLayer.UIWindow, enHFUIWindowLayer.Dynamic)]
public class MyWindow : AbsHFUIWindow
{
    private SFUI_Button BtnClose;

    protected override void OnRunAwake()
    {
        base.OnRunAwake();
        BtnClose = FindUICtrlByName<SFUI_Button>("BtnClose");
        BtnClose.OnAddClickListener += OnBtnClose;
    }

    protected override void OnOpen(Action _onOpenComplete)
    {
        base.OnOpen(_onOpenComplete);
        RefreshUI();
    }

    private void OnBtnClose(GameObject go) => CloseWindow();
    private void RefreshUI() { }
}

1.2 生命周期

方法 调用时机 推荐操作
OnRunAwake 创建时一次 绑定UI事件
OnOpen 每次打开 注册TC事件、刷新数据
OnClose 每次关闭 取消TC事件

1.3 窗口操作

// 打开
HFFunCatalogue.UIManager.OpenWindow<MyWindow>();
// 关闭
HFFunCatalogue.UIManager.CloseWindow<MyWindow>();

二、事件绑定

事件类型 绑定位置 是否需要 -=
UI按钮/拖拽 OnRunAwake 不需要
全局TC事件 OnOpen/OnClose 需要

三、常用组件

3.1 按钮

SFUI_Button btn = GetComponent<SFUI_Button>();
btn.OnAddClickListener += OnBtnClick;
btn.SetSelfGray(true);

3.2 文本

SFUI_TextMeshProUGUI txt = GetComponent<SFUI_TextMeshProUGUI>();
txt.text = "Hello";

3.3 图片

SFUI_Image img = GetComponent<SFUI_Image>();
img.HFSetSprite(/* atlasName */, "Icon_Player", /* languageRoot */);

3.4 滚动列表(核心)

SFUI_ScrollRect scroll = GetComponent<SFUI_ScrollRect>();
scroll.BindEvent(
    () => itemList.Count,
    (idx) => itemPrefab.gameObject,
    OnUpdateItem,
    (item) => item.gameObject.HFGetOrAddSimulateBehaviour<ItemSlot>()
);
scroll.ShowView();

四、对象池

场景 推荐方式
滚动列表 SFUI_ScrollRect.BindEvent(内置池)
固定栏(装备/技能) HFSimulateBehaviourPool<T>

五、子组件

5.1 多态基类

public abstract class AbsListItem<T> : AbsHFUIWindow
{
    protected SFUI_Button m_BtnItem;
    protected Action<T> m_OnSelect;

    protected override void OnRunAwake()
    {
        base.OnRunAwake();
        m_BtnItem = gameObject.GetComponent<SFUI_Button>();
        m_BtnItem.OnAddClickListener += OnBtnClick;
    }

    public virtual void SetData(T data, Action<T> onSelect = null)
    {
        m_OnSelect = onSelect;
        OnDataChanged(data);
    }

    protected abstract void OnDataChanged(T data);
    private void OnBtnClick(GameObject go) => m_OnSelect?.Invoke(m_CurrentData);
}

// 子类
public class CardItem : AbsListItem<CardData>
{
    protected override void OnDataChanged(CardData data) { }
}

六、开发规范

6.1 文件路径

类型 路径
脚本 Assets/Game/GameHFScripte/GameFunction/UIWindows/{Name}/
预制体 Assets/Game/GameHFResource/CN/UIWindows/{Name}/
图片 Assets/Game/GameHFResource/CN/SpriteAtlas/{Name}/

6.2 性能优化

  • 使用对象池复用UI元素
  • 将图标打包到SpriteAtlas
  • 滚动列表用 SFUI_ScrollRect.BindEvent

版本: v1.0
适用: StrayFog框架开发人员