Defold引擎中关于CollectionProxy的使用

昨天刚刚讲了Defold中的Collection Factory,与它比较相似的Collection Proxy组件也今天来讲一讲。Collection Proxy也是用于动态创建Collection。

Collection Proxy与Collection Factory的区别?

区别如下表所示:

特性 Collection Proxy Collection Factory
物理世界 完全独立,每个Collection Proxy的物理世界都是独立的。两个Collection Proxy中的物体就算位置在一起,也不会发生物理碰撞。 物理世界是同一个
资源加载 可通过load与async_load同步或异步加载资源,并经历load/async_load -> init -> enable -> disable -> final -> unload 向个生命周期阶段,并在load/async_load阶段发出proxy_loaded消息,在unlaod阶段发出proxy_unloaded消息。 可通过create与load方法进行同步或异步加载
输入交互 必须给Collection Proxy组件设置获取输入焦点,然后在Collection Proxy中的对象与组件才能获取输入交互。 无须特殊处理
典型场景 加载游戏关卡与独立场景等 向当前游戏世界中添加一个敌人小队或特效、奖励等

如何使用Collection Proxy?

Collection Proxy是一个组件,所以必须放到Game Object中。通过设置Collection属性指定要代理的Collection,如下图所示:

在上图中的Exclude属性,如果选中,那么在游戏打包时会排除内部包含的资源,而改为在运行时动态获取,这相关的知识会在后面讲到在线更新时提及。

Collection Proxy生命周期

Collection Proxy具有完整的生命周期,如下所示:

graph LR load/async_load --> init --> enable --> disable --> final --> unload load/async_load -.广播消息.-> proxy_loaded[/proxy_loaded/] unload -.广播消息.-> proxy_unloaded[/proxy_unloaded/]

从上图可以看到Collection Proxy的完整生命周期,使用代码如下所示:

lua 复制代码
function init(self)
    -- 同步加载
    msg.post("#collectionproxy", "load")
    -- 异步加载
    -- msg.post("#collectionproxy", "async_load")
end

function on_input(self, action_id, action)
    -- 假设有一个按钮点击一下就发布一个 #collectionproxy 禁用的事件
    if action_id == hash("proxy_finished") then
        msg.post("#", "proxy_finished")
    end
end

function on_message(self, message_id, message, sender)
    if message_id == hash("proxy_loaded") then
        -- 初始化Collection Proxy
        msg.post('#collectionproxy', "init")
        -- 生效Collection Proxy
        msg.post("#collectionproxy", "enable")
    -- 接收到proxy_finished事件
    elseif message_id == hash("proxy_finished") then
        -- 禁用Collection Proxy
        msg.post("#collectionproxy", "disable")
        -- 执行资源回收
        msg.post("#collectionproxy", "final")
        -- 卸载
        msg.post("#collectionproxy", "unload")
    elseif message_id == hash("proxy_unloaded") then
        -- 已卸载完成
    end
end

以上代码作为Collection Proxy 完整生命周期的演示,所Collection Proxy的交互都是通过msg.post消息系统通信。

最后的注意事项

  1. Collection Proxy之间的物理世界是隔离的,不同物理世界之间不会发生碰撞。
  2. Collection Proxy加载的资源是需要消耗内存的,如果存在非常大量的Collection Proxy加载,可以考虑一个优化游戏逻辑或使用在线更新。
  3. Collection Proxy必须要能获取得到输入焦点,其中包含的Game Object与组件才能获取焦点。
相关推荐
parade岁月8 小时前
告别 Deno 时代?运行时进入一年倒计时,Deno 团队并入 Cloudflare
前端
Lucky_Turtle8 小时前
【HTML】前端页面禁止缩放
前端·html
恋猫de小郭8 小时前
Genkit Dart 1.0 发布,Flutter 原生的 AI Agent 终于完整了
android·前端·flutter
思码梁田8 小时前
CSS transform 转换详解:translate、rotate、scale、skew 与 3D 变换一次讲清
前端·css·transform·skew·scale·translate·rotate
第10086个小白9 小时前
flutter桌面端打包方式(Inno Setup Compiler)版本
前端·flutter
派小心.9 小时前
多端数据分析平台的漏斗可以跨端搭建吗?5 步搭出跨端转化漏斗
大数据·运维·服务器·前端·数据分析
IT_陈寒9 小时前
为什么我的React组件一直在意外重渲染?
前端·人工智能·后端
Su米苏9 小时前
基于 Token 预算的上下文压缩控制器(Context Compaction Controller)
前端·数据库·人工智能
骇客野人9 小时前
Java 开发组件大全覆盖后端主流技术栈(基础、Web、ORM、中间件、微服务、安全、工具、测试、运维、信创适配常用组件)
java·前端·中间件
风骏时光牛马9 小时前
大模型底层架构与推理流程AI源码深度剖析
前端