V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
sunny1688
V2EX  ›  程序员

PuerTS(Unity)小白求救!

  •  
  •   sunny1688 · 2023-07-31 09:31:54 +08:00 · 1521 次点击
    这是一个创建于 507 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是 unity 小白,最近也在学 PuerTS ,用 ts 开发游戏( c#端只提供一些工具类给 js 使用),但我不知道如何在 js 那边把整个流程跑起来,我说一下目前的理解

    1 、C#端启动 JsEnv (全局一个即可),cs 文件:Launcher.cs ,env = new JsEnv();

    2 、使用 env.ExecuteModule("main.mjs");执行 js 脚本(入口文件)

    3 、由于 main.mjs 属于 js 端的入口文件,所以 c#端的 env 也只会执行一次 env.ExecuteModule ,后续所有的游戏逻辑都在main.mjs入口文件分发和驱动

    备注:我不清楚这种使用 PuerTS 的流程是否正确,如果不正确的话,请大佬指点迷津,小弟十分感激。

    如果使用 c#开发,可以直接在 c#脚本中定义成员属性,然后在 unity 编辑器中拖入相关物体就完成了绑定,然后 c#中可以直接使用,那 js 的话并不支持这种方式,我有一些疑问:

    1. js 端只能用GameObject.Find去查找物体然后和 ts 脚本关联吗?因为无法直接用编辑器拖入的方式和代码完成绑定

    2. main.mjs 应该如何去派发各种逻辑的处理,比如有时候场景跳转了

    3. 还有其它的问题,暂时问不出来

    请各位大佬指教,谢谢

    9 条回复    2023-07-31 16:19:22 +08:00
    dcoder
        1
    dcoder  
       2023-07-31 09:48:49 +08:00
    用 Unity 就老实用 C#, 最好不要搞第三方的 JS/Lua 那种动态更新, 除非这个 JS/Lua 是你自己写的.
    真的要用 JS, 就用 https://phaser.io/
    ggvoking
        2
    ggvoking  
       2023-07-31 09:53:56 +08:00
    作为游戏行业摸爬滚打多年的老鸟回答一下你,首先如何做代码热更,更推荐 HybridCLR ,这个是趋势。C#开发效率可比什么 lua 、js 高多了,而且舒服很多。你的问题我大概回答一下。
    1. 一般来说不会在脚本中大量 Find ,因为效率很低。都是会在 C#侧做个通用的 Binding 绑定组件,把需要代码调用 Object 和组件挂上去,然后在脚本语言中直接遍历这个 Bingding 中已经绑定 Object 列表,存入 map 中,之后直接调用
    2. 没懂你的意思。场景跳转了,有 SceneManager 的 event api 可以使用。
    ggvoking
        3
    ggvoking  
       2023-07-31 10:02:48 +08:00

    类似这种绑定功能的组件,然后脚本去遍历里面绑定的好的,存储到 name->value 的 map 中,之后就可以直接调用
    sunny1688
        4
    sunny1688  
    OP
       2023-07-31 10:15:54 +08:00
    @ggvoking

    非常感谢!我还有一些问题,

    1 、C#的 `ObjectBingding.cs` 那是如何与 js 相关联的呢? js 端是不是也要先 Find 某个物体,然后 AddComponent<ObjectBingding>() 呀?

    2 、每个脚本需要的物体都不一样(有的要 Button 、有的要 GameObject ,有的要 AudioClip ),那在编辑器拖入物体的时候有这么多类型吗?

    3 、能否提供一下 ObjectBingding.cs ,非常感谢
    ggvoking
        5
    ggvoking  
       2023-07-31 10:26:55 +08:00
    @sunny1688
    1. 如果是场景中的,就那 Find 吧,一般也就这一次 Find ;如果是 Instantiate ,可以直接 GetComponent 。
    2. 可以看到到我这个 ObjectBinding 是支持的,上面图示中 image -> ExImage ,buttonall -> ExButton ,其实就是序列化的时候也记一下类型。然后做编辑器面板的时候,用 EditorGUILayout.ObjectField ,传入指定的类型
    3. 我的开源项目里面有,但是这个是针对 HyBridCLR 做的,C#热更用的生成代码的模式生成到 UI 代码中,如果是脚本语言使用,你需要按我跟你说的,读取绑定列表到脚本语言的 map 中去。
    runtime 代码: https://github.com/821869798/unifantasy/tree/main/Assets/Scripts/UniFantasy/UniFan.Core/Runtime/UICore/Binding
    editor 代码: https://github.com/821869798/unifantasy/tree/main/Assets/Scripts/UniFantasy/UniFan.Core/Editor/UICore/Binding
    C#使用的示例代码:
    https://github.com/821869798/unifantasy/blob/main/Assets/Scripts/HotCode/Runtime/Tester/UILogin.cs
    sunny1688
        6
    sunny1688  
    OP
       2023-07-31 11:37:15 +08:00
    @ggvoking 感谢感谢,我先研究一下
    ggvoking
        7
    ggvoking  
       2023-07-31 14:30:26 +08:00
    @sunny1688 #6 老铁,解答这么多,来个 github star
    sunny1688
        8
    sunny1688  
    OP
       2023-07-31 16:19:14 +08:00
    sunny1688
        9
    sunny1688  
    OP
       2023-07-31 16:19:22 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2569 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 15:36 · PVG 23:36 · LAX 07:36 · JFK 10:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.