开发 COCOS Creator 插件的较佳实践

那你是不是因为会web前端才这样说,如果哪一天插件需要后端,那你咋办,再学后端?插件本来就是个辅助工具,主要还是为了辅助游戏业务,这上面要做插件要绕弯是不是曲线救国曲的太严重了。

html、css、js 这东西比学任何一门语言都烦,,

我也更喜欢Unity插件的方式,它让我感觉就是常用的游戏开发的东西不用去学习更多的东西

using UnityEngine;
using UnityEditor;
using System.IO;

public class MyUnityPlugin : EditorWindow
{
    // 配置文件保存路径
    private static readonly string configFilePath = "Assets/Editor/MyPluginConfig.json";

    // 配置数据类
    [System.Serializable]
    public class PluginConfig
    {
        public string userText = "Default Text";
        public int sliderValue = 5;
        public bool toggleOption = false;
    }

    private PluginConfig config;

    // 添加菜单选项打开窗口
    [MenuItem("Tools/My Unity Plugin")]
    public static void ShowWindow()
    {
        GetWindow<MyUnityPlugin>("My Unity Plugin");
    }

    private void OnEnable()
    {
        LoadConfig();
    }

    private void OnGUI()
    {
        GUILayout.Label("My Unity Plugin", EditorStyles.boldLabel);

        // 显示和编辑配置数据
        config.userText = EditorGUILayout.TextField("User Text:", config.userText);
        config.sliderValue = EditorGUILayout.IntSlider("Slider Value:", config.sliderValue, 1, 10);
        config.toggleOption = EditorGUILayout.Toggle("Enable Option:", config.toggleOption);

        GUILayout.Space(10);

        // 保存配置
        if (GUILayout.Button("Save Config"))
        {
            SaveConfig();
            Debug.Log("Configuration saved!");
        }

        // 运行自定义逻辑
        if (GUILayout.Button("Run Action"))
        {
            RunCustomAction();
        }
    }

    private void RunCustomAction()
    {
        if (config.toggleOption)
        {
            Debug.Log($"Custom Action: {config.userText} (Slider: {config.sliderValue})");
        }
        else
        {
            Debug.LogWarning("Toggle option is disabled. Action not executed.");
        }
    }

    private void LoadConfig()
    {
        if (File.Exists(configFilePath))
        {
            string json = File.ReadAllText(configFilePath);
            config = JsonUtility.FromJson<PluginConfig>(json);
        }
        else
        {
            config = new PluginConfig(); // 默认配置
        }
    }

    private void SaveConfig()
    {
        string json = JsonUtility.ToJson(config, true);
        File.WriteAllText(configFilePath, json);
    }
}

3赞

我不会啊别写别学的不然我用ai干嘛!

说到点上了,插件或其它大模块的上限,是由顶级架构师那个位置的人的个人能力决定的,没错,是个人能力,他决定的方向和实现思路,就决定了实际使用时效果怎么样。

跟 Cocos Dashboard 一样,开发者用得爽不爽他自己不知道吗,,

现在做一个地编,真的费老鼻子劲儿了。 :rofl:

:thinking::thinking::thinking:。。。

哈哈哈被你逮住了

笑了,头次见到怼开发者都受不了的,,

插件开发要学习css,html,vue等等,这样繁杂的学习曲线劝退多少人来拓展cocos,商店上面一堆卖游戏源码和框架的,鲜有辅助和方便开发的插件类的,不是没有原因的。作为引擎开发者还觉得这是理所应当的,对你们能提供方便易用的产品不抱什么希望了。

本来想给大家做顿大餐,结果端上来的是一坨屎,那只能出个食谱,来大家这样吃会更香点。

我猜测是两拨人分别开发引擎和编辑器导致了这种割裂。引擎和编辑器的连接是屏蔽的,想连通就需要通过插件来搭桥。

1赞

我也猜一下,是两种不同技术栈的人分别开发的编辑器和引擎,一个是web前端技术,一个是游戏开发。

因为游戏开发技术在制作编辑器的时候,一般都会想到用游戏引擎内部的控件来做编辑器,不仅仅是Unity,早在以前OGRE之类3D库流行的时候,都主要是这个思路。这样插件就可以简单的用游戏内接口开发了,而编辑器也天然就随着引擎跨平台了。而web开发的思路才是利用web框架electron之类的来开发编辑器。

然后技术人员和实际的用户就割裂了。因为技术栈不同,各自认为的基础和方向都不同了,所以引擎组人员认为用vue,react之类的都很简单,而游戏开发人员都是c++/opengl/c#/unity过来的,就觉得自己还要为了这个插件的小小需求去学web开发,什么html/css的不懂,学了用不到也会忘记。就造成了功能与需求不匹配的情况。

3赞

关键还很自得的样子,从来不考虑开发人员的感受,我会一点 vue 都不想用这种模式开发,,

api不透明不开放,有些甚至已经开放了,但是外面看不到,只针对引擎内部使用,如果你想实现稍微复杂一些的功能,你必须破解编辑器源码,然后一点点调试的找到你想要那个api,大部分api实际上都可以在自己插件中使用,只不过官方没有对应文档,可能认为开发者用不到吧,,或者开发者用了这些方法之后会对编辑器功能有破坏的风险吗?一直感觉插件系统上限不高,简单的插件实现没啥问题,如果你想象力丰富一些,你就需要各种特殊手段,或者拦截electron的消息转发等技巧来实现

Editor.Message.addBroadcastListener 在游戏脚本中能不能用?
如果不能用:为什么 Editor.Message.request 可以用
如果能用:有没有文档说明怎么用,比如想监听assets/data目录下的文件内容变更,要怎么注册监听事件
@weihai.yuan @啾啾啾

CocosCoreator插件开发借力web其实还是很好的,有很多漂亮的UI库可以拿来用,大家关心的无非是不会写html+css这一套,要从新学(会写也不爱写,没有可视化浑身难受)。

所以下一步的关键是实现插件的低代码开发,可视化 + 漂亮的UI丰富的组件 + JS/TS。

2.x好用。3.x的插件有点头疼。
2.x都能破解自定义。3.x无语

2.x写了很多插件,3.x直接懒得写了。

我觉得web应该作为扩展, 应该先提供单纯跟ccc差不多方式开发, 例如直接开发一个场景当作插件界面也挺好的, 用起来跟ccc差不多的感受, 各种api都是相同的, 这样他们用ccc的话,自然也不会排斥开发插件了