跳到主要内容

Godot学习

前置知识

官方--中文文档

Godot默认不支持汉字,想要使用汉字需要引入汉字的字体文件

Mono做了什么?

如何在vscode里写C#

参考 总结下就是

补充一下:Shift + Alt + F 格式化代码

为何安装了C#插件还是没有语法提示

看插件的README文档, 需要先运行npm i命令
然后就可以了

npm i就是npm install,不过这里有个坑npm i和npm install的区别

如何调试Godot

.cspro是什么?

参考自--理解 C# 项目 csproj 文件格式的本质和编译流程

C#项目文件的扩展名,它是“C Sharp Project”的缩写。.net 开发环境中建立项目时,会产生 .csproj 文件,这是C#的工程文件,其中记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置的信息等。

C# 委托(Delegate)

参考菜鸟教程

C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

C# async 关键字

参考官网 使用 async 修饰符可将方法、lambda 表达式或匿名方法指定为异步。 如果对方法或表达式使用此修饰符,则其称为异步方法 。

C#无法给struct变量传参

参考--C# 【无法修改XX返回值,因为它不是变量】 Can't modify XNA Vector components

// 这样写会报错
Position.x = 10;
// 需要改成
Position = new Vector2(10,Position.y)

例子:

// 定义结构
struct MVec3{
public float x;
public float y;
public float z;
}
class CTest{

public MVec3 posx;
public MVec3 pos { set; get; }//等同于下面的写法->
/*MVec3 dv = new MVec3 ();
public MVec3 pos{
set{ dv = value; }
get{ return dv;}
}*/
}

// 测试类
void Start () {
CTest otest = new CTest ();
otest.pos.x = 10; //这里会报错
otest.posx.x = 123;
gameObject.transform.position.x = 10; //这里会报错
Debug.Log ("ot.pos.x={0}" + otest.posx.x);
}

上面报错的原因: C#中,reference类型变量存储在堆上,value类型存储在栈上 由于pos是一个属性,otest.pos将调用属性的get方法,方法的调用是使用栈来进行的,get方法在栈上分配一个临时变量temp来返回pos的的值。即otest.pos返回了一个分配在栈上的临时变量的地址,而otest.pos.x = 10则是试图对栈上临时变量的X进行赋值。这个操作并非不合法,然而是没有意义的,于是编译器就阻止了我们的这个无意义操作,以避免隐患。

  • otest.posx是一个正常的取地址操作,表示取出otest所在堆内存中的posx变量的地址,这个地址是对象的堆内存中的。

  • otest.posx.x = 10则是修改堆内存中posx的x的值。

信号连接

参考自官网

实际上就是监听事件,当发生了某个事件之后会自动跳转到绑定的方法上

N01DOO.png

public void _on_Player_body_entered(){
//...
}

代码部分

GDScript 语法参考自官方文档

C#和GDScript的差异

入门参考官方的入门案例

C#部分

_Ready

相当于Unity的Start 每次开始时执行一次

_Process

这个相当于Unity的Update 每帧刷新的东西在这里做,所以可以在这块做些监听事件(例如监听按键按下)