rety2007 发表于 2023-10-10 10:55

想便宜一个UnityIMGUI编纂器代码框架(一)

比来写了不少编纂器代码,然后在想这个事情。
一般来说仿佛城市用Unity自带的IMGUI或者使用一些插件比如Odin(个人十分安利这个插件,因为确实太强大了),还有就是使用Unity新出的UIToolKit。老的IMGUI用起来很难受,但是这么多年也基本习惯了。UIToolKit的UIBuilder用起来倒是很强大,但是本身已经习惯了IMGUI,而且这种方式对于我来说,总感觉过于繁琐了,所以一直不习惯。用起来斗劲简洁简便的倒是OdinInspector,使用标签的方式开发,个人用起来很舒服。但是奈何它太大了而且还收费,不外仿佛出了免费版的有一些核心功能。但是不确定商用上是否有什么风险,所以个人决定测验考试把Unity的EditorGUI对象化,甚至组件化,让它开倡议来像使用UGUI一样开发。本人程度不怎么样,而且是个人心血来潮,三分钟热度的事情,很有可能会鸽,到时候请口下留情。
首先既然要对象化就得有一个所有UI组件的基类,我把它叫做XObject,因为名字没想好,就暂时以X来定名,不外也是我笔名的拼音首字母也挺契合。
我们来总结一下这个XObject都应该由什么构成,个人是这么设计的:
首先是id,每一个组件都需要独一的标识,所以id是必不成少的。
其次是实现绘制的虚方式,子类担任后重写该方式用来实现绘制。
还有该组件感化于的window。
public class XObject : ScriptableObject
{
    static int counter;
    /// <summary>
    /// 独一标识
    /// </summary>
    public readonly int id;


    protected XWindow m_Window;

    /// <summary>
    /// 感化于的界面
    /// </summary>
    public XWindow Windows => m_Window;

    public XObject(XWindow window)
    {
      id = counter++;
      m_Window = window;
    }

    /// <summary>
    /// 实现逻辑和绘制的方式
    /// </summary>
    public virtual void OnGUI()
    {

    }
}
上述代码中引用了XWindow,它是一个担任了EditorWindow的子类,使用它将会对EditorWindow进行一层封装。以下是简单的封装还未详细扩展。
public class XWindow : EditorWindow
{
    public List<XObject> objs;

    protected virtual void Awake()
    {
      objs = new List<XObject>();
    }

    private void OnGUI()
    {
      for (int i = 0; i < objs.Count; i++)
      {
            objs.OnGUI();
      }
    }

    protected virtual void OnDisable() { }
    protected virtual void OnEnable() { }
    protected virtual void OnSelectionChange() { }
    protected virtual void OnFocus() { }
    protected virtual void OnLostFocus() { }
    protected virtual void OnHierarchyChange() { }
    protected virtual void OnInspectorUpdate() { }
}
XWindow的OnGUI方式来调用各个组件的OnGUI来实现绘制。但是objs这个列表里就需要各个组件注册进来了,所以咱们需要在xobject构造的时候加这么一句。
    public XObject(XWindow window)
    {
      id = counter++;
      m_Window = window;
      window.objs.Add(this);
    }
两个基类就大致完成了。
<hr/>更新一下:由于XObject为C#原生类,所以在每次编译脚本的时候XWindow中列表存放的xobject城市被销毁,所以我暂时把它改为了担任 ScriptableObject 的子类。

导航网络 发表于 2023-10-10 10:55

有空研究点别的吧,这玩意一没价值,二没前途;顺道你把XObject标记上,应该是这个,System下的一个特性,然后就能被EditorWindow序列化了

南京电信 发表于 2023-10-10 10:56

IMGUI主要是性能过不去,你还不如把UITooki改成UGUI化

mge192003 发表于 2023-10-10 10:57

序列化之后脚本编译也是会被销毁的,你自己试试,毕竟是原生类。

我是色狼 发表于 2023-10-10 10:58

性能好不好无所谓,毕竟这东西又不会打包出去。而且IMGUI最少用了五年了,习惯已经难改掉了,让我用UItoolkit那套反而会难受的要死,最主要的那个感觉uxml太麻烦了,好用是好用但就是不习惯,只要imgui还支持一天我估计我就是一行一行敲也不会用那玩意儿。
页: [1]
查看完整版本: 想便宜一个UnityIMGUI编纂器代码框架(一)