内容
约定:
2D节点命名:
Game - 根节点,用Node3D,Node2D,特征不明显可用Node;通常不挂脚本。
Stage - 主舞台,用Node3D,Node2D;脚本名为Stage.cs;命名备选arena竞技场。
Player - 玩家角色,player.tscn,脚本名为Player.cs
3D节点命名:
Game - 根节点,用Node3D,Node2D,特征不明显可用Node;通常不挂脚本。
Stage - 主舞台,用Node3D,Node2D;脚本名为Stage.cs;命名备选arena竞技场。
Player - 玩家角色,封装至player.tscn,根类型用CharacterBody3D(需要隔离时再加个Node3D),脚本名为Player.cs,挂载至player.tscn内,在当前节点右侧会显示脚本图标;演示暂用跟人类躯体相像的圆柱体(CapsuleMesh)。
Thing- 地面门窗等,用StaticBody3D+子节点CollisionShape3D(设置其shape属性为无限平面WorldBoundaryShape3D),由于物体多,故根节点类型用Node3D隔离下。
Camera3D - 摄像头,2D用Camera2D。
WorldEnvironment - 光照。
死记:
2D项目不需要Camera2D摄像头节点,3D项目则需要Camera3D+环境节点。
TouchScreenButton - 因触摸设备横行,故用其换掉不支持多点触控的Button节点;
默认无尺寸不显示,必须拖拽个图片(icon.svg)或新建个GradientTexture2D至texture_normal;
在PC上 GetNode("TouchScreenButton").Pressed += () => GD.Print("Hi!") 启用“项目设置->输入设备->指点->用鼠标模拟触摸”后才会触发。
编程语言:
C# 获取类名与Java的this.getClass()不同,使用 GD.Print(this.GetType()); 或 GD.Print(MethodBase.GetCurrentMethod().DeclaringType.Name);
GodotObject的GetClass()获取的是Godot内置类型(Node等),并非当前对象类型。
C# Lambda - var 变量可直接赋值无参 Lambda 表达式;若有参必须写上入参类型,想省略则要声明为 Action<string> 或 Func<int, int, int>。
Callable.From(Pressed) // 直接用方法名 public void Pressed() { GD.Print("pressed"); }
Callable.From((int index) => GD.Print(index)) // lambda表达式
Callable.From(delegate { GD.Print("pressed"); }) // 匿名委托
跨平台:
// 功能标签列表 - OS.has_feature("pc"); // 常用的有:mobile、web、windows、linux、macos、ios、debug
if (OS.HasFeature("android")) { Engine.GetSingleton("AndroidRuntime").Call("getActivity").AsGodotObject(); }
Engine.GetSingleton("AndroidRuntime").Call("getActivity").AsGodotObject().Call("getPackageManager").AsGodotObject()
.Call("hasSystemFeature", "com.google.android.play.feature.HPE_EXPERIENCE").AsBool();
原生对话框:DisplayServer.dialog_show(...) 比 ConfirmationDialog 交互体验更舒服。
DisplayServer.DialogShow("t", "d", new String[] { "b1", "b2" }, Callable.From((int buttonIndex) => GD.Print(buttonIndex)));
Android嵌入Godot库特性:
org.godotengine.godot.utils.DialogUtils.showSnackbar(...)、showDialog(...)
org.godotengine.godot.utils.Crypt.md5(String str)
org.godotengine.godot.utils.GodotNetUtils.getCACertificates()
org.godotengine.godot.utils.ProcessPhoenix - 作为Android Launcher应用时避免重启崩溃
图形卡API:
操作系统 |
Vulkan |
其他API |
Windows |
✔ |
D3D12 |
Linux |
✔ |
|
Android |
✔ |
|
macOS/iOS/iPadOS |
✔(通过MoltenVK模拟至Metal) |
Metal 3(A13/iOS 16/Godot 4.4+) |
Godot IDE 编辑器:
C# SDK 下载 - Windows 选 “.NET SDK x64”;macOS 选 “.NET SDK Arm64 (Apple Silicon)”,向导会自动决定安装路径,dotnet --info。
Godot编辑器 - 鼠标双击 macOS 的 Godot_v4.4-stable_mono_macos.universal.zip 会自动解压至当前目录 Godot_mono.app,故最好先将 *.zip 放到最终目录再解压。
导入:
综述 - 通常用Blender建模,导出glTF导进Godot。
建模 - 3D物体轮廓,不带外皮呈现。
材质 - 3D物体外皮的视觉效果,材质(material/光照交互)包含贴图(map/定位贴图),贴图包含纹理(texture/单纯位图);材质通常使用 基于物理的渲染(Physically Based Rendering , PBR)技术。
导出:
手机平台导出证书首选环境变量 或 .godot\export_credentials.cfg
各OS平台导出发布情况:
综述 - 导出模板用的是同一个,Godot IDE则每个平台1个。
Windows - Godot 最新版即可,渲染模式均可。
Android - aarch 架构用 Godot 最新版 + rendering_method="mobile";x86_64用 Godot 最新版 + rendering_method="gl_compatibility",若想用mobile模式只能回退至 Godot 4.4dev3 导出。
iOS - Godot 最新版即可,且必须在macOS中导出,Windows的导出按钮将永远处于置灰状态;“App Store 团队 ID”和“捆绑包标识符”为必填,故Xcode需要登录Apple Account。
测试设备 - iPhone11 iOS最新版;WeTest iOS云真机每分钟1元,起买60分钟,且要有能添加“UDID”至Devices列表的Apple开发者账号。
默认min_ios_version=14.0、driver.ios=metal,但可手动改为库最低支持的12.0 + 勾上 fallback_to_opengl3,似乎还得 构建个不含Metal/Vulkan的导出模板。
导出模板和编辑器“One-click deploy”按钮可用任何渲染模式部署到真机,而一键部署到iOS模拟器则只能用gl_compatibility模式,即:iOS simulator does not support the Metal/Vulkan rendering driver。
iOS Simulator跑Metal和Vulkan报:Your GPU doesn't support image cube arrays...