加载为占位符的功能设计上是用来辅助选择性加载场景的。比如一个很庞大的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. vuw3学习大全(2)

    # composition(组合式api) ## 1.为什么使用composition vue3里面不需要Mixins了?因为有compoition api 能讲逻辑进行抽离和复用 大型组件中,其中* ...

  2. 西电oj73题字符串处理

    问题描述 有一种简单的字符串压缩算法,对于字符串中连续出现的同一个英文字符,用该字符加上连续出现的次数来表示(连续出现次数小于3时不压缩).例如,字符串aaaaabbbabaaaaaaaaaaaaab ...

  3. Executors.newScheduledThreadPool()定时任务线程池

    定时任务线程池是由 Timer 进化而来 jdk中的计划任务 Timer 工具类提供了以计时器或计划任务的功能来实现按指定时间或时间间隔执行任务,但由于 Timer 工具类并不是以池 pool ,而是 ...

  4. bash中的basename与dirname以及${}

    var=/dir1/dir2/file.tar.gz basename $var        #获取文件名 file.tar.gz dirname $var            #获取目录名称 / ...

  5. go 发布

    rm test-serv.bingo build -o test-serv.bin main.go

  6. 发布订阅者模式 -- 简单的PubSub

    /** * 发布订阅者模式 * **/interface handle { [propName: string]: Function[]}class PubSub { private handles: ...

  7. 关于Spring注解的基础详解(补充上次并不清楚的内容)

    注解,需要在.xml文件里面加这么一句话:<context:component-scan base-package=""/>(组件) Component注解 主要用于接 ...

  8. 树状分级框架UI实例

    树状分级框架UI实例:(内容参考https://zhuanlan.zhihu.com/p/108485875) #coding:utf8 #!/usr/bin/env python #@author: ...

  9. day06-静态资源访问&Rest风格

    SpringBoot之静态资源访问&REST风格请求 1.SpringBoot静态资源访问 1.1基本介绍 只要静态资源是放在类路径下的:/static./public./resources. ...

  10. ElasticSearch 实现分词全文检索 - 高亮查询

    目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...