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

news2024/11/14 14:23:25

文章目录

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

前言

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.coloradmin.cn/o/1535126.html

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

相关文章

ModbusRTU/TCP/profinet网关在西门子博图软件中无法连接PLC的解决方法

ModbusRTU/TCP/profinet网关在西门子博图软件中无法连接PLC的解决方法 在工业生产现场&#xff0c;ModbusRTU/TCP/profinet网关在与西门子PLC连接时&#xff0c;必须要使用西门子的博图软件来进行配置&#xff0c;博图v17是一个集成软件平台&#xff0c;专业版支持300、400、12…

【碳资产管理/精细化能源管控】Acrel-7000企业能源管控平台

工厂企业用能需求 能源管理 安科瑞薛瑶瑶18701709087 生产全过程用能数据监测和分析&#xff1b;完善并落实能源管理制度&#xff0c;使之更有效的运行&#xff1b;量化能效考核kpi&#xff0c;用数据说明问题。 用能安全 完善用能安全监测&#xff0c;保障人身与电气设备…

【计算机】——51单片机

单片机是一种内部包含CPU、存储器和输入/输出接口等电路的集成电路&#xff08;IC芯片&#xff09; 单片机是单片微型计算机&#xff08;Single Chip Microcomputer&#xff09;的简称&#xff0c;用于控制领域&#xff0c;所以又称为微型控制器&#xff08;Microcontroller U…

ubuntu20.04搭建nginx rtmp视频服务到指定位置解决权限不足

1.安装依赖 apt-get install build-essential libpcre3 libpcre3-dev libssl-dev2.建一个目录 mldir rtmp_nginx 3.源码下载 wget http://nginx.org/download/nginx-1.21.6.tar.gz wget https://github.com/arut/nginx-rtmp-module/archive/master.zip4.解压缩 tar -xf ng…

RabbitMQ--04--Spring Cloud Stream(消息驱动)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.Spring Cloud Stream1. 基本介绍https://spring.io/projects/spring-cloud-stream#overview 2.Spring Cloud Stream 解决的痛点问题3.设计思想Stream为什么可以统…

游戏平台出海运营有难度吗?

随着全球互联网的飞速发展&#xff0c;游戏产业已经成为了文化娱乐领域的重要支柱。在这个背景下&#xff0c;越来越多的游戏平台开始寻求出海运营&#xff0c;以拓展海外市场&#xff0c;实现更大的商业价值。然而&#xff0c;游戏平台出海运营并非易事&#xff0c;其中涉及到…

【深度学习】最强算法之:深度神经网络(DNN)

深度神经网络 1、引言2、深度神经网络2.1 定义2.2 原理2.3 实现方式2.4 算法公式2.4.1 前向传播公式2.4.2 反向传播公式 2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;我遇到难题了 小鱼&#xff1a;然后呢 小屌丝&#xff1a;你帮我看看呗&#xff1f; 小…

sentinel热点参数流控

1、概念 热点参数限流会统计传入参数中的热点参数&#xff0c;并根据配置的限流阈值与模式&#xff0c;对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制&#xff0c;仅对包含热点参数的资源调用生效。 2、示例 2.1、目的 对于如下的/get接口的参…

【CSS】flex弹性盒保持均分

通过Flex布局可以将容器均分&#xff0c;给每个小容器设置相同的flex-grow即可。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">&…

Flink入门知识点汇总(一)

具体内容请看b站尚硅谷课程&#xff01; 32_Flink运行时架构_提交流程_Yarn应用模式_哔哩哔哩_bilibili Flink本身有状态机制&#xff0c;状态都存储在Flink内部结构中&#xff0c;无需集成Mysql等对于精确一次Exactly-once&#xff0c;Flink进行了相关的配置&#xff0c;无需像…

综合知识篇15-开发管理考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

CSS隐藏video标签中各种控件

1.edio标签加上controls会出现视频控件&#xff0c;如播放按钮、进度条、全屏、观看的当前时间、剩余时间、音量按钮、音量的控制条等等 <video type"video/mp4" src"" autoplay"" style"width: 400px; height: 300px;" id"e…

springboot-MybatisPlus

mybatisplus是来简化mybatis开发的&#xff0c;其中封装好了各种sql语句&#xff0c;我们直接调用即可&#xff0c;省略了编写mapper.xm映射文件的过程 MybatisPlus怎么来获取数据库表的信息&#xff1f; 默认以类型驼峰转下划线作为表名默认把id字段作为主键默认把变量名驼峰转…

eNSP--vlan技术

思路: 一、配置交换机与路由器, 二、通过DHCP 获取地址 单臂路由,实现访问要求,重点考察对vlan标签的处理和使用。 用到的接口有access,trunk,hybrid三种 (所有配置请以下图为准) 配置: 一、 sw1 sw1接口g0/0/1 指定access接口,属于vlan2; g0/0/2接口我们将它…

C#中解决字符串在编译后无法修改的情况

文章目录 一、配置文件二、使用方式对于.NET Framework应用程序&#xff08;使用app.config&#xff09;对于.NET Core和.NET 5/6应用程序&#xff08;使用appsettings.json&#xff09; 三、应用实例 一、配置文件 在C#等编程语言中&#xff0c;硬编码&#xff08;直接在代码…

#Linux(编写第一个命令)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;编写一个c程序然后将生成的可执行的文件加入环境变量或者放入bin目录中&#xff0c;即可在其他目录下调用&#xff08;之前编写的程序只能在…

深度学习 Lecture 4 Adam算法、全连接层与卷积层的区别、图计算和反向传播

一、Adam算法&#xff08;自适应矩估计&#xff09; 全名&#xff1a;Adapative Moment Estimation 目的&#xff1a;最小化代价函数&#xff08;和梯度下降一样&#xff09; 本质&#xff1a;根据更新学习率后的情况自动更新学习率的值(可能是自动增大&#xff0c;也可能是…

基于python+vue共享单车信息系统的设计与实现flask-django-php-nodejs

课题主要分为二大模块&#xff1a;即管理员模块和用户模块&#xff0c;主要功能包括&#xff1a;用户、区域、共享单车、单车租赁、租赁归还、报修信息、检修信息等&#xff1b;快速发展的社会中&#xff0c;人们的生活水平都在提高&#xff0c;生活节奏也在逐渐加快。为了节省…

酷开科技OTT大屏营销重构新生,让营销被看见

在过去的十年间&#xff0c;中国视听新媒体产业迎来了发展的黄金时代。这一时期&#xff0c;见证了视听新媒体业态的广泛涌现&#xff0c;它们不仅迅速成长和扩张&#xff0c;而且逐步走向了成熟。互联网电视的兴起&#xff0c;为消费者带来了多样化的视听内容享受方式&#xf…

【Linux多线程】线程的概念

【Linux多线程】线程的概念 目录 【Linux多线程】线程的概念Linux线程的概念什么是线程重新定义线程和进程 进程地址空间第四讲线程的优点线程的缺点线程异常线程的用途 Linux进程VS线程进程和线程关于进程线程的问题 Linux线程控制POSIX线程库创建线程如何给线程传参&#xff…