从此
📄文章 #️⃣专题 🌐酷站 👨‍💻技术 📺 📱

Godot游戏引擎、游戏编程开发、开源免费3D手游


综合/最新

Godot游戏开发 | Godot C#/Mono | Godot官方文档墙内文档 | Godot源码 | Godot Shaders 着色器 | 产品发布检查清单 | 游戏开发专题

新: v4.5 - 支持C#导出Web游戏;FoldableContainer 类似HTML <details> 标签 v4.4 - AndroidRuntime + JavaClassWrapper

内容

约定:
  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...

其他

Godot 4.x起非数字区快捷键也可用了:前视图=Num 1等。

4.4+ aab 文件大小暴增至 300MiB 问题解决:
  gradle_build/compress_native_libraries
  android {
    packagingOptions {
        jniLibs {
            useLegacyPackaging true
        }
    }
  }
  说明 - 启用压缩会导致用户安装时多一个系统解压缩*.so文件的步骤,且多一份解压后的副本空间占用,但*.apk尺寸较小;不压缩则用户会更快进入app界面,但*.apk尺寸较大,Play Store推荐该选项;故自己渠道用压缩,Play Store用未压缩。

google play games 发布 x86_64 黑屏报错(4.4dev3正常,4.4dev4起黑屏,4.4.1仍然未修复(兼容模式则无黑屏)/故*.apk用4.4.1+,*.aab则用4.4.1兼容模式或4.4-dev3):
    https://github.com/godotengine/godot/issues/83905#issuecomment-2699605590
    https://godotengine.org/article/dev-snapshot-godot-4-4-dev-3/

  切换至兼容模式即可:
    [rendering]
    renderer/rendering_method="gl_compatibility"
    renderer/rendering_method.mobile="gl_compatibility"

dev3报duplicate class: net.dot.android.crypto.DotnetProxyTrustManager解决:
  说明 - 4.4-beta4 已修复 https://github.com/godotengine/godot/pull/98066
task deleteSpecificJar {
    println "$buildDir/../libs/release/x86_64/libSystem.Security.Cryptography.Native.Android.jar"
    println "$buildDir/intermediates/external_file_lib_dex_archives/monoRelease/1_jetified-libSystem.Security.Cryptography.Native.Android.jar"
    delete "$buildDir/../libs/release/x86_64/libSystem.Security.Cryptography.Native.Android.jar"
    delete "$buildDir/intermediates/external_file_lib_dex_archives/monoRelease/1_jetified-libSystem.Security.Cryptography.Native.Android.jar"

}
tasks.configureEach { task ->
    if (task.name == 'mergeExtDexMonoRelease') {
        task.dependsOn 'deleteSpecificJar'
    }
}