Godot 学习笔记(4):一切以场景为中心

文章目录

  • 前言
  • 场景搭建
    • 新建子场景
    • 最简单的按钮事件
  • 手动控制场景
    • 手动加载场景
    • 添加多个场景对象
      • 更快速的获取脚本对象
    • 删除多个场景对象
    • 脚本命名的问题
  • 总结

前言

Godot的场景是C#与Godot最后的中间连接。我们解决了场景的加载,我们基本可以保证C#和godot之间的彻底分离。

场景搭建

在这里插入图片描述

新建子场景

我们新建一个最简单的子场景,我们按照规范,应该只在Node 2D的节点上面添加子场景。

在这里插入图片描述
场景新建原则:

  • 根节点必须是Node 2D节点,因为Node 2D节点是最优的通用节点
  • 只在根节点上面添加唯一的脚本

在这里插入图片描述

在 Godot 中应用面向对象原则

最简单的按钮事件

public partial class TestSence:Godot.Node2D
{

    private Button button;

    private int num = 0;

    public TestSence() {
    
       
    }

    public override void _Ready()
    {
        button = GetNode<Button>("Button");
        button.ButtonDown += () =>
        {
            button.Text = $"按钮 {num}";
            num++;
        };
        base._Ready();
    }

    public override void _Process(double delta)
    {
        base._Process(delta);
    }

}

在这里插入图片描述
在这里插入图片描述

手动控制场景

Godot Engine 4.2 简体中文文档 最佳实践 场景组织

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

手动加载场景

Godot Engine 4.2 简体中文文档 最佳实践 何时使用场景与脚本

在这里插入图片描述
主场景的脚本事件


namespace Test2.SenceScripts
{
    public partial class MainSence : Godot.Node2D
    {

        public MainSence() { }

        public override void _Ready()
        {
            //加载脚本
            var packedScene = ResourceLoader.Load<PackedScene>("res://Sences//Test.tscn").Instantiate();

            //自动添加在子节点上面
            AddChild(packedScene);



        }

        public override void _Process(double delta)
        {
            base._Process(delta);
        }
    }
}

在这里插入图片描述

添加多个场景对象

public override void _Ready()
{
    //加载脚本
    var packedScene = ResourceLoader.Load<PackedScene>("res://Sences//Test.tscn").Instantiate();

    
	//无法添加多个脚本,因为会出现命名冲突
    for(var i  = 0; i < 10; i++)
    {
        //自动添加在子节点上面
        AddChild(packedScene);
    }

}

在这里插入图片描述
正确示范

        public override void _Ready()
        {
            //加载脚本
            var packedScene = ResourceLoader.Load<PackedScene>("res://Sences//Test.tscn");

            for (var i = 0; i < 10; i++)
            {
                //每次都要重新创建
                var newPackedScene = packedScene.Instantiate();

                //给每个都赋值不同的名字,保证不会出现冲突
                newPackedScene.Name = "Test" + i;
                AddChild(newPackedScene);
                //反向获取脚本对象
                TestSence testSence = GetNode<TestSence>(newPackedScene.Name.ToString());
                //通过修改节点的位置防止重叠
                testSence.Position = new Vector2(i * 100, 0);
                //if (i < 5)
                //    RemoveChild(packedScene);
            }
            GD.Print("我已经实例化了");

            base._Ready();


        }

在这里插入图片描述

更快速的获取脚本对象

var newPackedScene = packedScene.Instantiate();
//给每个都赋值不同的名字,保证不会出现冲突
newPackedScene.Name = "Test" + i;
AddChild(newPackedScene);
//反向获取脚本对象
TestSence testSence = GetNode<TestSence>(newPackedScene.Name.ToString());

这个添加之后再获取脚本对象太过于麻烦,我们可以通过泛型来获取,这样就少了一个反向获取的操作

var newPackedScene = packedScene.Instantiate<TestSence>();
//给每个都赋值不同的名字,保证不会出现冲突
newPackedScene.Name = "Test" + i;
AddChild(newPackedScene);

删除多个场景对象

    for (var i = 0; i < 10; i++)
    {
        //每次都要重新创建
        var newPackedScene = packedScene.Instantiate();

        //给每个都赋值不同的名字,保证不会出现冲突
        newPackedScene.Name = "Test" + i;
        AddChild(newPackedScene);
        //反向获取脚本对象
        TestSence testSence = GetNode<TestSence>(newPackedScene.Name.ToString());
        //通过修改节点的位置防止重叠
        testSence.Position = new Vector2(i * 100, 0);
        //将前五个移出
        if (i < 5)
            RemoveChild(newPackedScene);
    }
    GD.Print("我已经实例化了");

    base._Ready();


}

在这里插入图片描述

脚本命名的问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
### 如何手动挂载场景

总结

官方文档写的特别好,建议大家按照官方文档的最佳实践编写Godot代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/485628.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springcloud第4季 负载均衡的介绍3

一 loadbalance 1.1 负载均衡的介绍 使用注解loadbalance&#xff0c;是一个客户端的负载均衡器&#xff1b;通过之前已经从注册中心拉取缓存到本地的服务列表中&#xff0c;获取服务进行轮询负载请求服务列表中的数据。 轮询原理 1.2 loadbalance工作流程 loadBalance工作…

Uni-App电商模板,纯前端模板,可直接使用 实现全平台适配与高效功能

一、引言 随着移动互联网的快速发展&#xff0c;多平台应用开发已成为业界关注的焦点。Uni-App&#xff0c;作为一种前端框架&#xff0c;可以实现一套代码多端运行&#xff0c;大大提高了开发效率。本文将介绍如何使用Uni-App搭建一个电商模板&#xff0c;实现全平台适配与高…

WSL下Ubuntu+RTX4090安装CUDA+cuDnn+Pytorch

安装驱动 首先需要明确的是&#xff0c;在WSL下安装Ubuntu&#xff0c;如果要使用主机的GPU卡&#xff0c;只需要在主机Windows上安装驱动&#xff0c;Linux中不需要安装驱动&#xff0c;可以在Linux中使用nvidia-smi命令查看驱动版本。 安装CUDA 避坑注意事项&#xff1a;如…

机器学习(27)

文章目录 文献阅读1. 题目2. abstract3. 网络架构3.1 Theoretical Results 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 数据集4.3.2 参数设置 4.4 结论 三、实现GAN1. 任务要求2. 实验结果3.实验代码3.1数据准备3.2 模型构建3.3 展示函数3.4 训练过程 小结本周内…

循环队列、循环队列的基本操作

我要成为嵌入式高手之3月22日数据结构第五天&#xff01;&#xff01; ———————————————————————————— 顺序队列 存在问题&#xff1a;假溢出——解决办法&#xff1a;循环队列 空队列、满队列如何判断&#xff1f; 满队列&#xff1a;rear 1 …

一图详解 UVM phase机制

UVM验证环境构建时&#xff0c;引入 phase机制 &#xff0c;通过该机制可以很清晰的 将UVM仿真阶段层次化 。这里层次化&#xff0c;不仅仅是 各个phase的执行顺序 &#xff0c;还有 同一phase中的层次化组件之间phase也有先后关系 。 phase函数/任务执行顺序功能典型应用buil…

Java22已发布,支持SpringBoot3.3.0正式版

Java22已发布&#xff0c;支持SpringBoot3.3.0正式版 文章目录 Java22已发布&#xff0c;支持SpringBoot3.3.0正式版1. JDK22现已推出&#xff01;2. Java22的新功能1. 语言改进1. 语言预览 2. 库文件3. 性能4. 工具 3. 资源 Java 22现已发布 下一个Java版本提高了Java应用程序…

python绘图matplotlib——使用记录1

本博文来自于网络收集&#xff0c;如有侵权请联系删除 使用matplotlib绘图 1 常用函数汇总1.1 plot1.2 legend1.3 scatter1.4 xlim1.5 xlabel1.6 grid1.7 axhline1.7 axvspan1.8 annotate1.9 text1.10 title 2 常见图形绘制2.1 bar——柱状图2.2 barh——条形图2.3 hist——直…

计算机三级——网络技术(综合题第五题)

第一题 填写路由器RG的路由表项①至④。 目的网络&#xff0f;掩码长度输出端口输出端口172.19.63.192&#xff0f;30S0(直接连接)172.19.63.188&#xff0f;30S1(直接连接) 路由器RG的S0的IP地址是172.19.63.193&#xff0c;路由器RE的S0的IP地址是172.19.63.194。 【解析】…

【Hive】HIVE运行卡死没反应

Hive运行卡死 再次强调 hive&#xff1a;小兄弟&#xff0c;没想到吧&#xff0c;咱可不是随便的人。&#x1f604; 那么&#xff0c;这次又遇见了hadoop问题&#xff0c;问题描述是这样的。 hive> insert into test values(1, nucty, 男); Query ID atguigu_202403241754…

Spring Boot整合Spring Security

Spring Boot 专栏&#xff1a;Spring Boot 从零单排 Spring Cloud 专栏&#xff1a;Spring Cloud 从零单排 GitHub&#xff1a;SpringBootDemo Gitee&#xff1a;SpringBootDemo Spring Security是针对Spring项目的安全框架&#xff0c;也是Spring Boot底层安全模块的默认技术…

MRC是谁?- 媒体评级委员会 Media Rating Council

在在线广告的世界里&#xff0c;有许多不同的技术和实践用于提供和衡量广告。对于广告商、出版商和营销人员来说&#xff0c;了解这些技术是如何工作的以及如何有效使用这些技术很重要。在这方面发挥关键作用的一个组织是媒体评级委员会&#xff08;MRC&#xff09;。 1. 了解…

[Linux]文件系统

1.理解文件系统 Linux磁盘文件特性&#xff1a;内容加属性&#xff0c;内容大小是不确定的&#xff0c;但是属性大小是一定的&#xff0c;并且内容和属性是分开存储的。文件属性是用一个结构体来定义的&#xff0c;在Linux中&#xff0c;该结构体是固定128字节大小如下代码: …

LC 98.验证二叉搜索树

98.验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例…

Vue cli创建项目时键盘操作无效;vue3.0项目搭建自定义配置

一. 问题描述 在创建vue3.0项目时&#xff0c;在建好的文件夹&#xff0c;鼠标右键 git bash 使用 vue create my-vue3.0创建新项目时&#xff0c;键盘方向键失效&#xff0c;无法选中对应的选项&#xff08;交互提示符不工作&#xff09; 解决方案&#xff1a; 方案一 使用…

架构评估方法相关知识总结

一、架构评估中的重要概念 定义&#xff1a;软件架构评估是在对架构分析、评估的基础上&#xff0c;对架构策略的选取进行决策。 常用系统架构评估的方式&#xff1a; 1. 基于调查问卷或检查表的方法&#xff1a;该方法的关键是设计好问卷或检查表。缺点是在很大 程度上依赖于评…

华为北向网管NCE开发教程(5)打包org.omg.CosNotification找不到

1问题描述 在IDE中&#xff0c;代码能正常运行&#xff0c;但是打包的时候&#xff0c;会抱不到一些类 2问题原因 导入的本地包中&#xff0c;能在IDE中找到&#xff0c;但是在使用maven打包时&#xff0c;maven找不到这些依赖包 3解决办法 将依赖包通过maven安装到maven…

算法沉淀 —— 动态规划篇(斐波那契数列模型)

算法沉淀 —— 动态规划篇&#xff08;斐波那契数列模型&#xff09; 前言一、第 N 个泰波那契数二、三步问题三、使用最小花费爬楼梯四、解码方法 前言 几乎所有的动态规划问题大致可分为以下5个步骤&#xff0c;后续所有问题分析都将基于此 1.、状态表示&#xff1a;通常状态…

Matlab|【免费】基于数据驱动的模型预测控制电力系统机组组合优化

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《Feature-Driven Economic Improvement for Network-Constrained Unit Commitment: A Closed-Loop Predict-and-Optimize Framework》&#xff0c;程序主要做的是一个基于数据驱动的电力系统机…

YOLO算法改进Backbone系列之:CoaT

在本文中&#xff0c;我们提出了co-scale conv-attention image transformer&#xff08;CoaT&#xff09;&#xff0c;这是一种基于Transformer的图像分类器&#xff0c;配备了co-scale和conv-attention机制。首先&#xff0c;co-scale机制在各个尺度上保持Transformer编码器支…