前言吐槽:不得不说,godot作为一款冷门引擎,可查阅的资料几乎只有godot官网的QA或者reddit、*几个网站,贴吧、B站、知乎的资料虽有零散,但有关C#的太少了。
1、godot在windows平台的开发需要两个部分,godot引擎本体和导出模板,mono版和standard版是分开的,只有mono版才能使用C#脚本,导出模板版本需要和引擎版本相同,导出模板包含了所有目标导出平台的模板。
2、使用VS code编辑脚本:在godot的编辑器——编辑器设置——Text Editor——External中,勾选Use External Editor,Exec Path选中VS code的可执行文件(.exe)。
另外,使用vs code的时候要先安装C#插件;使用VS code好处是可以享受内部编辑器没有的代码提示和debug,缺点是每次修改完后godot都会出现报错提示脚本被外部打开。
3、VS code打开脚本无法正常代码提示:VS code——文件——打开文件夹,选择项目的根目录,.sln文件存放在项目根目录中,VS code会自动读取.sln文件,等读取完毕后VS code左下角的OmniSharp Server(火焰图标)会变亮,在它右边会显示当前项目名+.sln。
4、有时VS code的debug功能会出错,可以直接点左下角当前项目名+.sln,VS code上方会出现项目路径,点击后就会重新读取项目,一般出错就会消失,如果还是报错,请检查代码是否有问题。
5、godot的资源读取:
1:.png文件(贴图)
Texture texture = (Texture)GD.Load("res://textures/icon.png");//有时会用替换sprite的图片上
2:.tscn文件(保存为资源的节点或场景)
Node node= GD.Load<PackedScene>("res://prefabs/Enemy.tscn").Instance();
6、保存为资源的节点实例化并添加到某个父节点下:
this.AddChild(GD.Load<PackedScene>("res://prefabs/ExitGameUIController.tscn").Instance());//节点首先要被读取,然后实例化(存在但无法显示),最后成为某个节点的子节点才能显示在场景中
7、信号连接的几种方法:
1:信号不自带参数传递
public override void _Ready() { timer = this.GetNode<Timer>("Timer"); timer.Connect("timeout", this, nameof(rebuildenemy)); _loadenemy(); } private void rebuildenemy() { _loadenemy(); }
2:信号自带参数传递,如RigidBody2D的body_entered(body_Node)会传入与本体碰撞的其他碰撞体。
public override void _Ready() { GetNode<RigidBody2D>("bulletRigidBody2D").Connect("body_entered",this,nameof(_destroy)); } private void _destroy(Node node) { if (node.Name =="EnemyRigidBody2D")//判断其他碰撞体的名字 { this.QueueFree();//销毁自己及所有子节点 } }
暂时写这么多,想到什么能写的话就下次再写。