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代码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM的知识

什么是JVM 1.JVM&#xff1a; JVM其实就是运行在 操作系统之上的一个特殊的软件。 2.JVM的内部结构&#xff1a; &#xff08;1&#xff09;因为栈会将执行的程序弹出栈。 &#xff08;2&#xff09;垃圾99%的都是在堆和方法区中产生的。 类加载器&#xff1a;加载class文件。…

处理 input type=‘hidden‘ 的事件触发

前言 在公司的 MES 系统&#xff08;摩尔元数N2&#xff09;做二次开发页面。某个字段在表单模型中配置为 弹出窗口 后、页面的对应字段样式自动转为 <input type"hidden"> &#xff0c;从而导致不能使用常规的 blur 、keydown 事件触发关联操作。下面是解决思…

【力扣刷题日记】603.连续空余座位

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 603.连续空余座位 表&#xff1a;Cinema 列名类型seat_idintfreebool Seat_id 是该表的自动递增主键列。 在…

将表格数据导出 Excel 格式的数据方法(2)

1、在工具类中创建一个脚本文件 /*** param {*} tableValueData* 表格数据: []* param {*} tableTitleData* 表格标题数据: ["", "", "", ""]* param {*} fileName* 文件名* param {*} tableHeader* 表格名*/// …

【RabbitMQ | 第一篇】消息队列基础知识

文章目录 1.消息队列基础知识1.1什么是消息队列&#xff1f;1.2消息队列有什么用&#xff1f;&#xff08;结合项目说&#xff09;1.2.1异步处理1.2.2削峰/限流1.2.3降低系统耦合性1.2.4实现分布式事务 1.3消息队列的缺点1.4JMS和AMQP1.4.1 JMS的两种消息模型&#xff08;1&…

高效备考2024年AMC10:吃透2000-2023年1250道真题(限时免费送)

我们今天继续来随机看5道AMC10真题&#xff0c;以及详细解析&#xff0c;这些题目来自1250道完整的官方历年AMC10真题库。通过系统研究和吃透AMC10的历年真题&#xff0c;参加AMC10的竞赛就能拿到好名次。即使不参加AMC10竞赛&#xff0c;掌握了这些知识和解题思路后初中和高中…

Google 的 C++编程规范

1.1 头文件均使用 #define guards #ifndef <PROJECT>_<PATH>_<FILE>_H_ #define <PROJECT>_<PATH>_<FILE>_H_...#endif // <PROJECT>_<PATH>_<FILE>_H_1.2 包含所有使用到的头文件 只要头文件中引用了其他文件中的符…

mysql基础01

登录 and 修改密码 登录 mysql //默认用户root ,主机名为localhost,密码为空,端口为3306 mysql -uroot -p123 -hlocalhost -p3306 //如果-p后无密码,可以通过非明文实现登录修改密码 mysqladmin -uroot -p password 123 //在root密码为空的情况下可以设置密码,否则需要旧密…

#鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行

3 月 19 日&#xff0c;#鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行。 现场&#xff0c;深圳市南山区人民政府副区长李志娜发布《2024 年南山区支持鸿蒙原生应用发展首批政策措施清单》&#xff0c;从加强鸿蒙原生应用供给能力、推动鸿蒙原生应用产业集聚、完善鸿蒙原生…

扩容分区和文件系统(Linux)

在ECS控制台上扩容云盘容量后&#xff0c;对应分区和文件系统并未扩容&#xff0c;您还需要进入ECS实例内部继续扩容云盘的分区和文件系统&#xff0c;将扩容部分的容量划分至已有分区及文件系统内&#xff0c;使云盘扩容生效。本文为您介绍如何通过两个步骤完成Linux实例云盘的…

API 接口渗透测试

1 API 接口介绍 1.1 RPC&#xff08;远程过程调用&#xff09; 远程过程调用&#xff08;英语&#xff1a;Remote Procedure Call&#xff0c;缩写为 RPC&#xff09;是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序&#xff0c;而程序员无…

RecyclerView万能适配器之BaseQuickAdapter方法详解

BaseQuickAdapter方法详解 1. setNewData(List<T> data)2. addData(List<T> data)3. replaceData(int index, List<T> data) 这篇文章我们主要对BaseQuickAdapter的setNewData()、addData()、和 replaceData() 三个方法进行讲解 1. setNewData(List data) …

JavaScript高级(十三)---ES6中Set,map

ES6 Set 在ES6之前&#xff0c;我们存储数据的结构主要有两种&#xff1a;数组、对象。 在ES6中新增了另外两种数据结构&#xff1a;Set、Map&#xff0c;以及它们的另外形式WeakSet、WeakMap。 Set是一个新增的数据结构&#xff0c;可以用来保存数据&#xff0c;类似于数组&a…

应用APM-如何配置Prometheus + Grafana监控springboot应用

文章目录 概述在Spring Boot应用中集成Micrometerspringboot配置修改 Docker安装Prometheus和Grafanaprometheus配置grafana配置启动Prometheus和Grafana在Grafana中配置数据源创建Grafana仪表盘配置Grafana告警&#xff08;可选&#xff09;监控和分析 概述 配置Prometheus和…

前缀列表和route-policy

前缀列表和route-policy ACL&#xff1a;访问控制列表 1、它可以用于过滤流量报文 2、又可以过滤路由条目 前缀列表&#xff1a; 1、只能过滤路由条目 2、不能过滤流量报文 ACL&#xff1a;在过滤路由条目时&#xff0c;只能过滤路由前缀。 前缀列表&#xff1a;在过滤…

第十节HarmonyOS 常用容器组件2-Counter

1、描述 计数器组件&#xff0c;提供相应的增加或者减少的计数操作。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 2、子组件 可以包含子组件。 3、接口 Counter() 从API version 9开始…

如何在Android设备上运行深度网络

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a; 下一篇&#xff1a; 介绍 在本教程中&#xff0c;您将了解如何使用 OpenCV 深度学习模块在 Android 设备上运行深度学习网络。教程是为 Android Studio 2022.2.1 编写的。…

SystemService.java 解读

frameworks/base/services/core/java/com/android/server/SystemService.java 是Android框架服务层的一个核心Java类文件&#xff0c;它在Android系统中扮演着基础服务管理的重要角色。 SystemService类通常作为系统服务的基类&#xff0c;定义了系统服务的基本结构和生命周期…

牛客小白月赛86(D剪纸游戏)

题目链接:D-剪纸游戏_牛客小白月赛86 (nowcoder.com) 题目描述: 输入描述: 输入第一行包含两个空格分隔的整数分别代表 n 和 m。 接下来输入 n行&#xff0c;每行包含 m 个字符&#xff0c;代表残缺纸张。 保证&#xff1a; 1≤n,m≤10001 字符仅有 . 和 * 两种字符&#xf…

基于ssm的实验室耗材管理系统设计与实现论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对实验室耗材信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性…