网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月22日漏签0天
godot吧 关注:9,012贴子:40,626
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 下一页 尾页
  • 49回复贴,共2页
  • ,跳到 页  
<<返回godot吧
>0< 加载中...

【新手向教程】C#入门手册

  • 只看楼主
  • 收藏

  • 回复
  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
前言:
1.本人之前做了一个Mesh切割插件,是直接用GDS写的,结果开发了一大半才发现,GDS的效率无法满足实际应用!!所以那个插件暂时停滞了下来,我最近研究了C#和C++,准备把这方面的教程补一下。
(顺便证明一下我真的没有摸鱼ヽ(ー_ー)ノ)
2.还是老规矩,本教程如有错误欢迎指出(*^▽^*)
3.排版我已经无能为力了,各位通融通融就这样看吧.......
----------------------------------------------------------------------------------------------------------------------------------
#0简介:
本教程主要针对两类人:
1.对Godot有一定了解,对C#有一定基础,想将C#投入实际Godot生产的人
2.对Godot有一定了解,对GDS十分熟悉,想了解C#并投入实际Godot生产的人
注意!!!本教程并不是教C#这门语言,而是教你如何将C#投入实际Godot脚本的编写!
所以你需要一定C#基础!
但因为Godot的C#脚本的结构是遵循GDS脚本的结构的,所以如果你熟悉GDS,上手C#并不难。
注:本教程在讲C#的时候会分成两个板块,一个是给C#有一定基础的人讲的,另一个则是给GDS有基础的人讲的的,本教程力求大多数人都能使用C# (^_−)☆


如果你想系统的学习C#
传送门(C#教程):https://www.runoob.com/csharp/csharp-tutorial.html


本节完


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#1环境配置:
C#并不能直接被编辑器运行,它需要先经过编译
我们使用的并不是C#脚本,而是它编译成的dll文件


想要Godot将C#作为脚本,总共有两步:
1.下载适合电脑系统的Godot Momo版本
2.搭建C#编译环境


因为我的电脑系统是 windows,所以这里我就以windows为例


第一步十分简单,到官网去下载就行了:因为是机器翻译,所以有些奇怪,不要在意


下载解压好之后:


这样,第一步就完成了


#——————————————————————————————————


第二步,配置环境就有些麻烦了


1.(此为windows适用方法)如果你内存空间富足,在后期想要享受到外部编辑器自动补全,debug等等的话,建议直接使用VS
连接:https://visualstudio.microsoft.com/zh-hans/vs/
VS有三个版本,如果没有特殊需求,直接下载第一个版本


下载好后打开:
选中.NET开发,并把.NET Framework4.7也选中


以上的文件加起来共有5GB左右!!!
别更改安装路径,等待安装完成,重启电脑,环境就搭建完成了。
#----------------------------------------------------------------------------
2.(此为windows适用方法)如果你的内存并不充裕,并不想享受哪些花里胡哨的东西的话,则可以只下载生成工具:
注意,这样下载的VS只是编译工具,除此之外它一无是处!!!
https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16
(进入网页后自动下载)
下载完成后,运行:
进入后,到单个组件,勾选.NET Framework4.7目标包:


以上的文件实际安装后只有300MB左右!!!
直接点安装,别更改安装路径,等待安装完成,重启电脑,环境就搭建完成了。
#-----------------------------------------------------------------------
3.以上两种方法虽然简单,一步到位,但不通用(只适用windows)
接下来这个方案适用于windows Mac linux!!
Mono .NET 框架的一个开源版本
下载链接:https://www.mono-project.com/download/stable/
下载安装好后,重启,环境已经完成了。
但还是有些问题,如果你是在windows上安装mono,你还得安装.NET Framework 4.7开发人员包
链接:https://dotnet.microsoft.com/download/dotnet-framework/net47


安装后记得重启


#————————————————————————————————


测试阶段:
进入编辑器,添加一个节点:


如果你用的是VS,则直接按F5运行!
如果你使用的是mono,你需要在把编辑器的编辑器设置中的mono下的Builds的build tool改为mono:




设置完成后按F5运行


以上两种编译器正常的话,你将看到绿色对勾:




这就是C#的环境搭建......


2025-08-22 22:15:24
广告
不感兴趣
开通SVIP免广告
  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#1后记
因为我一直使用的是windows系统,所以我并不确定mono在Mac和Linux下的实际情况,可能有出乎意料的错误,如果遇到问题,请与我联系。
Question and Answer
Q:能自定义编译器的路径吗?
A:不确定,但本人并没有在项目设置或编辑器设置中找到相关设置........所以建议在安装VS或mono的时候保持默认路径(如果有哪位兄台知道怎么设置,请尽快告诉我一声)


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#2概念理解:
当你在用Godot开发时,你将用到许多节点:

而节点的实质是什么呢?
节点的实质就是类!
而每个节点最多有三种参数:属性,方法,枚举
而属性,方法,枚举的实质是什么呢?
节点的属性就是类中已经声明的变量
节点的方法就是类中已经定义的方法
节点的枚举就是类中已经声明的枚举
而在添加节点时,你会发现,节点是“树状结构”,这也表明了Godot中的节点(类)是有继承关系的!譬如:

Spatial类就是Node类的派生类!!!
这就是Godot中一些重要的概念,请务必理解!
本节完


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#3初步进入:
首先,创建一个新项目,进入项目后,选择2D场景在添加一个Label节点,再给Label节点添加一个C#脚本:

把脚本的注释删除,在添加如下代码:

运行结果:(屏幕上显示"C#")

完成这个例子后,我们再回过头来梳理一下代码:

首先,C#脚本默认使用Godot和System命名空间,不建议更改!
接着定义一个类,注意!这个类的类名必须和脚本名一致!!!
因为我们的脚本为:

所以这的类名就是Label
接着就是继承,一般情况下,这个脚本附属于什么节点,就继承什么类:
因为我们的节点是Label:

所以我们继承Godot.Label类
(注:当前定义的这个类必须用Public访问修饰符!)
最后,我们就可以在定义好的类中写自己的代码了
如蓝色方框所示,我们“重写”了一个方法,
这个_Ready方法是官方已经定义好的,它在当前节点加载完成时调用
(官方已经定义的方法的方法名统一为 “_文本” )
正是因为它已经事先定义好了,所以需要用override关键字“重写”
而官方定义的方法的返回类型只能是void!
这些官方定义的方法必须用Public访问修饰符!
再来看这个_Ready方法中的代码:
Text="C#";
你会发现,这个Text就是一个变量
而我们并没有声明Text
根据上一节的理解,不难发现,它是“属性”(它已经在Godot.Label类中声明)
点击Label节点,你也可以发现Text这个属性.....

这就是最基础的结构,一定要好好理解
本节完


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#3后记:
这里再解释一下_Ready,它是一个方法,它在Godot.Node类中被定义
但因为我们示例中的脚本继承自Godot.Label类,而Godot.Label类继承自Godot.Control类,而Godot.Control类继承自Godot.CanvasItem类,最后Godot.CanvasItem类继承自Godot.Node类

继承了一大圈,最后,我们就可以去调用,重写_Ready()方法了


  • JAVA是我大哥
  • 动画特效
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
用c#不如unity


  • JAVA是我大哥
  • 动画特效
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
c++的话舒服了


2025-08-22 22:09:24
广告
不感兴趣
开通SVIP免广告
  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#4了解GetNode方法:
注:如果你看到这段文字,说明本节已经修改过3次,由于本人对GetNode最初的的理解与官方给出的解释有些出入,本人已在阅读并理解源代码后矫正本节内容!!!
GetNode方法,作为Godot的基础方法之一,可谓是作用节点的基石。
但在C#之中,GetNode变得极其“危险”!
这节,我们就深入了解GetNode
想象这样一个场景:
类似上节,仍是一个简单的场景,但我们的脚本在Node2D这个节点上,而我们想更改Label的Text属性,这要怎么办呢?

联系之前的内容,Godot中的每个节点都是类,譬如:图中的Label节点就是Label类的一个实例!
所以更改Text属性就是更改这个类中的变量Text!
所以我们得先获取到图中Label节点这个类
而GetNode就是这个作用
在脚本中写如下代码

代码很简单,后面的Text="C#"就不用了多说了。
咱们来看看GetNode<Label>("Label"),
这个GetNode<Label>("Label")就返回了我们的Label节点(类)
("Label")它可以传入参数"NodePath",如果你只写节点名的话,默认是在当前节点的子节点中查询(这段话可能很难理解,等下我详细解释)
其实我们并没使用GetNode方法,而是用到了GetNode<T>这个泛型方法!
这样做的原因是:
GetNode这个方法无论获取到任何节点类,只会把它们转换为所有节点的基类Node类

而我们并不是想获取Node类,所以官方给出了扩展方法:
GetNode<T>这个泛型方法,它会强制返回你书写的T类型
如:GetNode<Label>就是强制将获取的节点类转换为Label类
你可以暂时理解为:
在获取节点类时,要使用GetNode<T>方法,并指出T类型
(详细内容在本节后记中指出)
接着我们详解一下NodePath这个参数:
请观察以下示例:


#-----------------------------


你会发现,NodePath直接写一个节点名时,默认是在子节点中寻找的
那么遇到如下情况怎么办?

three是one子节点的子节点
则需要这样

先获取two再获取three,节点名中间用斜杠(/)隔
图片限制,接下文


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
接上文
那我们能不能获取父节点呢?

当然可以!如下所示

在NodePath中,两个英文句号(..)就代指父节点!
这就是NodePath的大部分内容,暂时你也只需要了解这么多。
练习:
如何从three获取Label?

思路:
直接看Label节点,它既不是three的子节点,也不是父节点
再看与Label有关系的two,它既不是three的子节点,也不是父节点
再看与two有关系one,它是three的父节点!

所以:
three -> one -> two -> Label
代码如下:

这就是GetNode的用法
本节完


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#4后记:
其实NodePath还可以只写".",这样写意味着获取当前节点类

关于GetNode的实现
GetNode方法可以获取任何节点类,但在return返回这些节点类时,会将它们隐式转换为Node类!!
相信很多人都对GetNode方法只返回Node类很迷惑,这得联系到Godot自身原因:
GetNode方法可以获取节点类,但Godot中,节点类有很多,总不能让官方写近百个GetNode方法以对应返回每个节点类吧?而且效率也不高....
所以官方用了一个简便的方法:
在获取到节点类之后,把它隐式转换成所有节点类统一的基类Node类,这样,就可以只写一个GetNode方法就能返回全部节点类了,但这样做的弊端是:使用前必须将这个Node类强制转换回原本的节点类:

当然,官方给出了扩展方法GetNode<T>,其实就是把强制转换封装了而已,所以上面的代码就可以简化为:

伪源代码(方便理解):
首先定义两个类:

GetNode方法大致如下:

GetNode<T>方法大致如下:


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#5 Godot中的类:
这一节,我们来讲一下Godot中所有的类
打开一个项目,然后按Shift + F1即可打开GDS文档
因为C#脚本的格式是参照GDS的,所以两种语言间虽然命名规则有些差异,有些类也有区别,但还是可以作为参照

我们可以发现,Godot中,类大致有三种:
红色:全局静态类,静态方法,枚举的集合
紫色:Object基类和它的派生类(所有节点类均扩展自Object)
剩下:值类型的类(在这里String类也视作值类型)
首先说一下值类型的类:
在这其中,官方对Float,Int,String等原本就有的类做出了扩展,添加了很多实用的方法
并定义了一些新的值类型的类,例如Plane类
而Object基类,所有节点类均扩展自它,但注意一点:
这里的Object基类指的是Godot.Object类,它是Godot所有节点类的基类,它扩展自object类,Godot.Object类不是object类!!!
这里重点说一下Godot中的全局静态类:
你也许发现@ GDScript,@ GlobalScope开头都有 @, 这表明它们在GDS中不是实际的类,而是其它全局的方法,枚举,类 的集合!!!它们的作用只是便于查询!
1.
首先说一下GDScript这个集合,里面包括了杂七杂八的方法,在C#中,它包含的大部分方法被加入到GD这个全局静态类中。
示例:

2.
原本GDScript集合中有许多数学方法(如,cos,sin),但在C#中,为了区分,这些方法迁移到了Mathf这个全局静态类中。
示例:

Mathf类与原本的Math类的主要区别是,Mathf类的方法精度稍低:

3.
再说一下,GlobalScope集合,它包含了GDS中所有的全局类,在C#中,这些类仍是全局静态类:

示例:

这就是Godot中的全局静态类的内容
本节完


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#6 信号:
在游戏场景中,往往会有许多事件发生,例如:一个按钮被按下,一个怪物被玩家击败等等,在Godot中,信号就可以优雅而快速地编写这些事件
先来看一个例子:

我们想实现:在按钮(Button1)被按下后,更改标签节点(Label1)的Text属性
这要怎么实现呢???
这完全可以用信号完成
首先我们理解一下信号:
先选中Button节点,你将会看到它的属性,然后点击节点:

然后你将会看到这个节点拥有的信号,这些信号会在特定的时候发出:

而这里,我们要用到pressed信号,它在按钮被按下时发出
接下来,我们就要用Connect方法将信号与函数连接:

因为pressed信号是Button1节点拥有的,所以先要用GetNode获取到Button1节点
Connect方法可以传入5个参数,后两个参数有默认值,

我们首先来看前三个参数:
signal:填要连接的信号的名称
method:信号发出时,要调用的方法的方法名
target:要调用的方法所在的类,在例子中,我们调用s()方法,而它就在当前节点类的脚本中,所以可以用this指向当前节点类
而s()方法中,就是更改Label1节点的Text属性
这样,在Button1被按下后Label1的Text属性就被改为C#
我们再来详细说一下target参数:
看一个例子:

Label1节点的脚本如下:

我们在Node2D节点的脚本中,怎么用信号实现在Button1被按下时,调用Label1的o()方法呢?
代码如下:

首先,因为我们要连接的是Button1的pressed信号,所以先要获取Button1节点
然后因为我们要调用o()方法,所以method参数填"o"
最后因为o()方法在Label1节点的脚本中的,所以target参数处,就要获取Label1节点,这样才能调用Label1节点的脚本中的o()方法
这样就行了
图片限制,接下文


  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
接上文
而信号是支持自定义的
首先你得声明一个信号
在C#中声明一个信号是通过一个 delegate 上的 [Signal] 属性完成的。

(注:在声明信号时,可以自由定义返回值,但因为意义不大,建议写void)
当然,你还是需要将它与方法连接

最后,在适合的时机用EmitSignal方法发出信号

这样,我们自己的信号系统就完成了
如果你之前仔细观察,会发现:官方定义的有些信号具有参数,这些参数可以传入方法。
而我们自定义的信号,也可以加入参数:

Connect方法不变,而定义的参数在EmitSignal方法中依次写入:

o方法接收参数:

这样就可以传入参数了
注:参数传递的顺序是:EmitSignal -> delegate(定义的信号) -> 绑定的方法
所以上述例子的参数传递为:15,89 -> int a,int b -> int A,int B
而Connect方法也可以传入参数:



Connect方法第四个参数可以传入一个数组,而这个数组中的每一个元素都会传递给绑定的方法
注:这里的数组(Array)指的是Godot内置的Godot.Collections.Array类,并不是C#的Array
Connect方法参数传递的顺序是:Connect -> 绑定的方法
本节完


2025-08-22 22:03:24
广告
不感兴趣
开通SVIP免广告
  • 多能豆
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#6 信号 后记:
当EmitSignal方法和Connect方法都传入参数时,方法将先接收EmitSignal方法传入的参数:




登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 49回复贴,共2页
  • ,跳到 页  
<<返回godot吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示