• Godot 4.0 加载为占位符(InstancePlaceholder)的用法和特点


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

    基本使用

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


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


    3. 编写脚本,在希望的时机实例化它
      就像获取一般节点一样获取到此节点,然后调用其CreateInstance()函数。C#需要将其转化为InstancePlaceholder才可调用该函数。

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

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


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



    效果与特点

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

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

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

    反复实例化会怎样?

    目标物体会被多次创建。

    image

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

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

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

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


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

    值得注意的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

  • 相关阅读:
    【Docker与微服务】高级篇
    基于J2EE的弹幕视频网站设计
    网络流量监控工具iftop
    Git管理远程仓库以及 git push 中遇到的问题
    源码分析:Transport 开发
    你是否想过,字符串没有属性,为什么可以像对象一样调用
    linux————pxe网络批量装机
    艾美捷Abnova MYOC (人)抗体对说明书
    PythonOpenCV随机粘贴图像
    【强化学习】时间循环最优决策:原理与Python实战
  • 原文地址:https://www.cnblogs.com/qiiimiu/p/17383590.html