加载为占位符的功能设计上是用来辅助选择性加载场景的。比如一个很庞大的3D世界,玩家一时之间只会处在世界一小部分区域内,同时让整个地图驻留于内存是不现实的,此时需要选择性地灵活加载地图,使用Godot的"加载为占位符"功能可辅助这项工作的进行。

本人以开发2D游戏为主,发现此功能也可为我提供便利。

基本使用

  1. 将节点保存为场景。

    把希望动态加载的每个节点拖入"文件系统"对话框中,这将使场景被储存起来成为资源。

  2. 加载为占位符。

    右键场景中刚刚操作的节点,勾选"加载为占位符"

  3. 编写脚本,在希望的时机实例化它

    就像获取一般节点一样获取到此节点,然后调用其CreateInstance()函数。C#需要将其转化为InstancePlaceholder才可调用该函数。

//C# code
var node = GetNode("../TheNode");
var placeholderNode = node as InstancePlaceholder;
var target = placeholderNode.CreateInstance();

(启动游戏后,物体没有被立即加载)





(↓点击"加载"按钮后,物体被加载了)

效果与特点

在代码中像上文那样调用函数后,看上去物体已经被实例化了。

如何取得实例化出来的节点?

CreateInstance()会返回实例化出来的节点。

反复实例化会怎样?

目标物体会被多次创建。

实例化后的物体替换了原有节点吗?

并没有。实例化后的节点是新的节点,实例化与作为占位符节点的节点是兄弟关系,

并且Godot会为节点取新的名字。

如果多次实例化,取的名字中带有的序号会递增。

如果你时不时会移除、重新实例化此场景,这似乎是一个合适的设计。

值得注意的bug

节点保存为场景资源后,不要修改该资源的名称。

若进行了修改,原场景将无法找到该资源,并且设置为占用符的节点无法实例化,更糟的是你正在编辑的场景可能因为无法找到此依赖而无法保存,

按理来说Godot内部应该会维护资源名称的变更,但是这次它没有(我使用的版本v4.0.2.stable.mono.official [7a0977ce2],该问题存在。)

跟踪这个Issue以获得Bug修复进展

https://github.com/godotengine/godot/issues/37818

如果遇到了此问题,尝试改回原场景名,或用文本编辑器编辑场景文件(.tscn)使依赖恢复正常。

参考

https://docs.godotengine.org/en/stable/classes/class_instanceplaceholder.html

Godot 4.0 加载为占位符(InstancePlaceholder)的用法和特点的更多相关文章

  1. Swift3.0语言教程使用占位符格式创建和初始化字符串

    Swift3.0语言教程使用占位符格式创建和初始化字符串 Swift3.0语言教程使用占位符格式创建和初始化字符串在很多的编程语言中都存在占位符,占位符就是为指定的内容占留一个位置.此功能一般在开发者 ...

  2. 转载:Flash AS3.0 加载外部资源(图片,MP3,SWF)的两种方式

    Flash AS3.0 加载外部资源(图片,MP3,SWF)的两种方式 出自:http://www.cnblogs.com/top5/archive/2012/08/04/2623464.html 关 ...

  3. Cocos2d-xvision3.0加载失败,和,Vs2012环境搭建

    1.安装好VS2012,下载Cocos2d-x3.0 双击击win32 sln运行VS2012 如果加载失败点击程序运行,输入devenv.exe /resetuserdata 回车,然后再进入VS, ...

  4. Win10操作系统下Oracle VM VirtualBox6.0加载磁盘提示“发现无效设置”的解决方法(包括“不能桥接网卡”问题的解决方法)

    自从电脑换成Win10操作系统后,想借助VMBox处理一些事情,但是遇到了不能桥接网卡的问题,还以为是程序坏了,于是卸载重新安装,但是不行.接着又尝试在虚拟机里重新安装操作系统,还是不行. 然后百度了 ...

  5. 【python3】 django2.0 加载css 、js 、img 等静态文件

    python : 3.6.4 django : 2.0 1 文件目录  /var/www/mysite 2 nginx配置: server { listen ; #暴露给外部访问的端口 server_ ...

  6. [原]零基础学习SDL开发之在Android使用SDL2.0加载字体

    在上一篇文章我们知道了如何在android使用SDL2.0来渲染显示一张png图,而且在上上一篇我们知道如何使用sdl来渲染输出bmp图,那么sdl是否可以渲染输出自己喜爱的字体库的字体呢?答案是当然 ...

  7. Springboot2.0加载指定配置文件@PropertySource的使用

    1. 在resouces下编写待加载的配置文件 这里使用person.properties # String person.last-name=john # int person.age=112 # ...

  8. vue3.0 加载json的“另类”方法(非ajax)

    问题 加载json一定要用ajax的方式吗? 最近学习vue3.0,在实现一个功能的时候发现一个问题-- 写代码的时候,需要的json太长.太多,和代码放在一起太混乱.看代码总有翻来翻去,又没有&qu ...

  9. axure RP Pro7.0加载日历控件的步骤

  10. as3.0加载swf并控制

    私人QQ 280841609 var myload:Loader=new Loader(); var url:URLRequest=new URLRequest("1.swf"); ...

随机推荐

  1. EVE如何提升名望值

    目录 背景介绍 简介 名望值划分 军团名望值 利弊 背景介绍 ​ 玩eve将近3个星期,开着毒蜥级刷1级代理人任务感觉没有一点难度,想尽快刷3.4级代理任务,而我目前能够接到的最高代理任务也就才1级. ...

  2. TP5.0--5.1获取当前域名的方法

    TP5.0获取当前域名的方法 use think\Request; $request = Request::instance(); $domain = $request->domain(); 获 ...

  3. vite不能用@做为路径的解决方法

    vite创建vue3后,发现原来用@做为路径的不能用了,报错信息是 Internal server error: Failed to resolve import "@ 在网上查了一下资料, ...

  4. Less8-Less10 时间注入

    Less-8和Less-5使用的是一样的布尔盲注,为了学习,这里我们使用时间盲注 Less-8 这里使用到了mysql中的if语句,格式为if(条件,正确执行,错误执行) 实例如图: sleep(秒速 ...

  5. MyBatisPlus-------id生成策略

    不同的表对应不同的id生成策略 日志:自增 购物订单:特殊规则(FQ23324AK443) 外卖单:关联地区日期等信息( 10 04 20200314 34 91) 关系表:可省略id ....... ...

  6. ArcGIS Pro处理发布并在前端调用bim数据全过程-rvt转slpk

    记录ArcGIS处理三维bim模型全纪录,从原始的rvt格式开始,到最后web前端js api调用的整个过程,并记录部分中间操作过程中出现的问题和解决办法. 本文示例使用: 软件:ArcGIS Pro ...

  7. vue:路由守卫

    路由守卫 作用:对路由进行权限控制 配置路由守卫应在暴露前配置 分类:全局守卫.独享守卫.组件内守卫 首先先给需要鉴权的路由设置好meta配置项. meta配置项:是vue-router中的一个对象, ...

  8. 关于Cookie要懂的知识

    ☞演示 什么是Cookie? http是一个无状态协议,它不对之前发生过的请求和响应的状态进行管理.这样就可能导致,我们登陆一个网站后,每次跳转新页面,之前的登陆状态都不能被记住,要重新登陆等问题. ...

  9. 关于关键字extends与implements的不同以及关于接口的详细介绍的文章

    extends与implements的不同 1.在类的声明中,通过关键字extends来创建一个类的子类. 一个类通过关键字implements声明自己使用一个或者多个接口. extends 是继承某 ...

  10. 系统评价——理想点TOPSIS法的R语言实现(五)

    TOPSIS 法是一种常用的综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距.TOPSIS全称Technique for Order Preference by Simi ...