导出

概览

现在您已经有了一个可以运行的游戏,您可能想要和别人分享您的成果.然而,让您的朋友下载Godot而只是为了打开您的项目是不实际的.相反,您可以 导出 您的项目,将其转换为任何人都可以运行的 软件包.

你导出游戏的方式取决于你的目标平台是什么.在本教程中,你将学习如何为各种平台导出 躲避爬行者 游戏.首先,需要对游戏的工作方式进行一些更改.

注解

如果你还没有自己制作 躲避爬行者 ,请在继续本教程之前阅读 您的第一个游戏 .

准备项目

躲避爬行者 中,我们使用键盘控制玩家角色移动.如果游戏是在PC平台上进行的,这将很良好,但在手机或平板电脑上,需要支持触屏输入.其点击事件可以和触摸事件一样处理,所以会将游戏转换为点击移动的输入方式.

默认情况下,Godot从触摸输入中模拟鼠标输入.这意味着,发生鼠标事件上编码中的事件,触摸时也会触发它.Godot还可以从鼠标点击中模拟触摸输入,为了需要在切换到触摸输入后,能够继续在电脑上玩我们的游戏.

Project > Project Settings [项目>项目设置]中,在 Input Devices > Pointing [输入设备>定点]下,启用 Emulate Touch From Mouse [模拟鼠标触摸].

../../_images/export_touchsettings.png

We also want to ensure that the game scales consistently on different-sized screens, so in the project settings go to Display, then click on Window. In the Stretch options, set Mode to 2d and Aspect to keep.

由于我们已经在 Window 设置中,还应该在 Handheld 下将 Orientation 设置为 portrait 纵向.

../../_images/export_handheld_stretchsettings.png

接下来,我们需要修改 Player.gd 脚本来改变输入方式.我们将移除键盘输入并使 Player 移动到触摸(或点击)事件设置的 目标.

这是 Player 的完整脚本,注释指出了我们做了哪些改变:

GDScript

C#

  1. extends Area2D
  2. signal hit
  3. export var speed = 400
  4. var screen_size
  5. # Add this variable to hold the clicked position.
  6. var target = Vector2()
  7. func _ready():
  8. hide()
  9. screen_size = get_viewport_rect().size
  10. func start(pos):
  11. position = pos
  12. # Initial target is the start position.
  13. target = pos
  14. show()
  15. $CollisionShape2D.disabled = false
  16. # Change the target whenever a touch event happens.
  17. func _input(event):
  18. if event is InputEventScreenTouch and event.pressed:
  19. target = event.position
  20. func _process(delta):
  21. var velocity = Vector2()
  22. # Move towards the target and stop when close.
  23. if position.distance_to(target) > 10:
  24. velocity = target - position
  25. # Remove keyboard controls.
  26. # if Input.is_action_pressed("ui_right"):
  27. # velocity.x += 1
  28. # if Input.is_action_pressed("ui_left"):
  29. # velocity.x -= 1
  30. # if Input.is_action_pressed("ui_down"):
  31. # velocity.y += 1
  32. # if Input.is_action_pressed("ui_up"):
  33. # velocity.y -= 1
  34. if velocity.length() > 0:
  35. velocity = velocity.normalized() * speed
  36. $AnimatedSprite.play()
  37. else:
  38. $AnimatedSprite.stop()
  39. position += velocity * delta
  40. # We still need to clamp the player's position here because on devices that don't
  41. # match your game's aspect ratio, Godot will try to maintain it as much as possible
  42. # by creating black borders, if necessary.
  43. # Without clamp(), the player would be able to move under those borders.
  44. position.x = clamp(position.x, 0, screen_size.x)
  45. position.y = clamp(position.y, 0, screen_size.y)
  46. if velocity.x != 0:
  47. $AnimatedSprite.animation = "walk"
  48. $AnimatedSprite.flip_v = false
  49. $AnimatedSprite.flip_h = velocity.x < 0
  50. elif velocity.y != 0:
  51. $AnimatedSprite.animation = "up"
  52. $AnimatedSprite.flip_v = velocity.y > 0
  53. func _on_Player_body_entered( body ):
  54. hide()
  55. emit_signal("hit")
  56. $CollisionShape2D.set_deferred("disabled", true)
  1. using Godot;
  2. using System;
  3. public class Player : Area2D
  4. {
  5. [Signal]
  6. public delegate void Hit();
  7. [Export]
  8. public int Speed = 400;
  9. private Vector2 _screenSize;
  10. // Add this variable to hold the clicked position.
  11. private Vector2 _target;
  12. public override void _Ready()
  13. {
  14. Hide();
  15. _screenSize = GetViewport().Size;
  16. }
  17. public void Start(Vector2 pos)
  18. {
  19. Position = pos;
  20. // Initial target us the start position.
  21. _target = pos;
  22. Show();
  23. GetNode<CollisionShape2D>("CollisionShape2D").Disabled = false;
  24. }
  25. // Change the target whenever a touch event happens.
  26. public override void _Input(InputEvent @event)
  27. {
  28. if (@event is InputEventScreenTouch eventMouseButton && eventMouseButton.Pressed)
  29. {
  30. _target = (@event as InputEventScreenTouch).Position;
  31. }
  32. }
  33. public override void _Process(float delta)
  34. {
  35. var velocity = new Vector2();
  36. // Move towards the target and stop when close.
  37. if (Position.DistanceTo(_target) > 10)
  38. {
  39. velocity = _target - Position;
  40. }
  41. // Remove keyboard controls.
  42. //if (Input.IsActionPressed("ui_right"))
  43. //{
  44. // velocity.x += 1;
  45. //}
  46. //if (Input.IsActionPressed("ui_left"))
  47. //{
  48. // velocity.x -= 1;
  49. //}
  50. //if (Input.IsActionPressed("ui_down"))
  51. //{
  52. // velocity.y += 1;
  53. //}
  54. //if (Input.IsActionPressed("ui_up"))
  55. //{
  56. // velocity.y -= 1;
  57. //}
  58. var animatedSprite = GetNode<AnimatedSprite>("AnimatedSprite");
  59. if (velocity.Length() > 0)
  60. {
  61. velocity = velocity.Normalized() * Speed;
  62. animatedSprite.Play();
  63. }
  64. else
  65. {
  66. animatedSprite.Stop();
  67. }
  68. Position += velocity * delta;
  69. // We still need to clamp the player's position here because on devices that don't
  70. // match your game's aspect ratio, Godot will try to maintain it as much as possible
  71. // by creating black borders, if necessary.
  72. // Without clamp(), the player would be able to move under those borders.
  73. Position = new Vector2(
  74. x: Mathf.Clamp(Position.x, 0, _screenSize.x),
  75. y: Mathf.Clamp(Position.y, 0, _screenSize.y)
  76. );
  77. if (velocity.x != 0)
  78. {
  79. animatedSprite.Animation = "walk";
  80. animatedSprite.FlipV = false;
  81. animatedSprite.FlipH = velocity.x < 0;
  82. }
  83. else if(velocity.y != 0)
  84. {
  85. animatedSprite.Animation = "up";
  86. animatedSprite.FlipV = velocity.y > 0;
  87. }
  88. }
  89. public void OnPlayerBodyEntered(PhysicsBody2D body)
  90. {
  91. Hide(); // Player disappears after being hit.
  92. EmitSignal("Hit");
  93. GetNode<CollisionShape2D>("CollisionShape2D").SetDeferred("disabled", true);
  94. }
  95. }

设置主场景

主场景是你的游戏开始的场景.对于这个 躲避爬行者 的例子,在 Project -> Project Settings -> Application -> Run ,通过点击文件夹图标并选择它,将 Main Scene 设置为 Main.tscn .

导出模板

要导出项目,你需要从http://godotengine.org/download 下载 导出模板 .这些模板是引擎的优化版本,没有为每个平台预编译的编辑器.你也可以在Godot中点击 Editor -> Manage Export Templates 下载它们:

../../_images/export_template_menu.png

注解

如果你从 Steam 下载了Godot,导出模板已经包含在里面.因此,你不需要通过 Manage Export Templates [导出模板管理]对话框下载它们.

在出现的窗口中,您可以点击 Download ,获取与您的Godot版本相匹配的模板.

../../_images/export_template_manager.png

注解

导出模板与特定的Godot版本绑定.如果您升级Godot,您必须下载与新版本相匹配的模板.

导出预设

接下来,您可以通过点击 Project -> Export 来配置导出设置.

点击 Add… 并选择一个平台,创建一个新的导出预设.您可以通过不同的设置创建任意数量的预设.

../../_images/export_presets_window.png

窗口底部是两个按钮. Export PCK/ZIP 仅创建项目数据的打包版本,它不包含可执行文件,因此该项目不能单独运行.

第二个按钮,**Export Project**,可以创建一个完整的游戏可执行版本,如Android的 .apk 或Windows的 .exe .

ResourcesFeatures 选项卡中,你可以自定义每个平台的游戏导出方式.可以暂时不做这些设置.

按平台导出

在本节中,我们将逐步介绍每个平台的流程,包括您需要的任何其他软件或要求.

PC (Linux/macOS/Windows)

导出PC平台在三个支持的操作系统中的工作原理是一样的.打开导出窗口,点击 Add… ,创建您要制作的预设.然后点击 Export Project ,选择名称和目标文件夹,选择项目文件夹之 外的 位置.

点击 Save ,引擎将建立导出文件.

注解

在导出macOS时,如果你从macOS电脑导出,你最终会得到一个 .dmg 文件,而使用Linux或Windows则会得到一个 .zip .无论哪种情况,压缩后的文件都包含一个macOS的 .app ,你可以双击并运行.

注解

在Windows上,如果你想让导出的可执行文件的图标与默认图标不同,你需要手动更改.参见 更改Windows的应用程序图标 .

Android

小技巧

移动设备具有各种各样的功能.在大多数情况下,Godot的默认设置是可以工作的,但是移动开发有时更多的是艺术而不是科学,您可能需要做一些试验和寻找帮助,以使一切工作正常.

必须先下载以下软件,然后才能导出Android项目:

当你第一次运行Android Studio时,点击 Configure -> SDK Manager 并安装 Android SDK Platform Tools .这将安装Godot用来与您的设备通信的 adb 命令行工具.

接下来,通过在系统的命令行上运行以下命令来创建调试密钥库:

  1. keytool -keyalg RSA -genkeypair -alias androiddebugkey -keypass android -keystore debug.keystore -storepass android -dname "CN=Android Debug,O=Android,C=US" -validity 9999

单击Godot中的 编辑器 -> 编辑器设置,然后选择 导出/Android 部分.在这里,您需要设置系统上Android SDK应用程序的路径以及刚刚创建的密钥库的位置.

../../_images/export_editor_android_settings.png

现在你已经准备好导出了.点击 Project -> Export ,并添加一个Android的预设(见上).选择新添加的Android预设.在 Options 下,进入 Screen ,将 Orientation 设置为 Portrait .如果你的游戏是横屏模式(即窗口宽度(像素)大于窗口高度),请将此设置保留为 Landscape.

点击 Export Project 按钮,Godot将构建一个APK,您可以在设备上下载.要在命令行上进行这项工作,请使用以下方法:

  1. adb install dodge.apk

注解

我们的设备可能需要处于 开发者模式.有关详细信息,请查阅设备的文档.

如果你的系统支持,连接兼容的安卓设备,就会在Godot的运行测试按钮区域出现 One-click Deploy 一键部署按钮:

../../_images/export_android_oneclick.png

点击此按钮可一步完成构建APK,并将其复制到您的设备上.

iOS

注解

要为iOS构建游戏,你必须有一台运行macOS并安装Xcode的电脑.

在导出之前,有一些设置是你 必须 完成的,这样才能成功导出项目.首先,**App Store Team Id** ,你可以登录苹果开发者账号,在 Membership 栏目中找到.

您还必须提供图标和启动屏幕图像,如下所示:

../../_images/export_ios_settings.png

点击 Export Project ,选择目标文件夹.

成功导出项目后,将在所选位置找到以下文件夹和文件:

../../_images/export_xcode_project_folders.png

现在你可以在Xcode中打开项目,为iOS构建项目.Xcode的构建过程超出了本教程的范围.更多信息请参见 https://help.apple.com/xcode/mac/current/#/devc8c2a6be1.

HTML5 (网页)

点击HTML5预设上的 Export Project ,不需要改变任何默认设置.

导出完成后,您将拥有一个包含以下文件的文件夹:

../../_images/export_web_files.png

在浏览器中查看 .html 文件,可以进行游戏.但是,你不能直接打开该文件,它需要由网络服务器提供服务.如果你的电脑上没有设置服务器,可以在网上搜索,找到适合你特定操作系统的建议.

将浏览器指向你放置HTML文件的URL.您可能需要在游戏加载时等待片刻,才能看到开始屏幕.

../../_images/export_web_example.png

游戏下方的控制台窗口会告诉你是否出现了任何问题.你可以在导出项目时的文件对话框中禁用 Export With Debug 来禁用它.

../../_images/export_web_export_with_debug_disabled.png

注解

虽然所有主流浏览器都支持WebAssembly,但它仍然是一项新兴技术,你可能会发现一些不能使用的东西.确保你已经将浏览器更新到最新的版本,可在 `Godot GitHub仓库<https://github.com/godotengine/godot/issues>`_ 上报告你发现的任何错误.