导出

概览

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

导出游戏的方式取决于您的目标平台。本教程中,您将学习如何将 Dodge the Creeps 游戏导出到各种平台。然而,首先我们需要对游戏的工作方式做一些改变。

注解

如果您还没有自己完成 Dodge the Creeps 游戏,请阅读 您的第一个游戏 后再继续本教程。

准备项目

Dodge the Creeps 中我们使用键盘控制 Player 角色的移动。如果您的游戏是在PC平台上玩的,这没问题,但在手机或平板上,您需要支持触屏输入。因为点击事件可以被视为触摸事件,我们将把游戏转换为点击移动输入风格。

默认情况下,Godot 从触摸输入模拟鼠标输入。这意味着为鼠标事件所写的代码也能被触摸事件触发。Godot 也可以从鼠标点击模拟触摸输入。如果我们将游戏转到触摸操纵, 要在电脑上继续玩就要用到这个功能。在”项目设置”下的*Input Devices*, Pointing 下, 设置*Emulate Touch From Mouse* 为 “启用”。

../../_images/export_touchsettings.png

我们也希望保证游戏在不同大小的屏幕上缩放正常。在项目设置中转到 显示(Display),然后点击 窗口(Window)。在 伸展(Stretch) 选项中,将 模式(Mode) 设置为 “2d”,将 纵横比(Aspect) 设置为”keep”。

由于我们已经在*窗口*设置中,我们还应该在*手持*的*方向*下设置为“纵向”。

../../_images/export_handheld_stretchsettings.png

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

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

extends Area2D

signal hit

export var speed = 400
var screen_size
# Add this variable to hold the clicked position.
var target = Vector2()

func _ready():
    hide()
    screen_size = get_viewport_rect().size

func start(pos):
    position = pos
    # Initial target is the start position.
    target = pos
    show()
    $CollisionShape2D.disabled = false

# Change the target whenever a touch event happens.
func _input(event):
    if event is InputEventScreenTouch and event.pressed:
        target = event.position

func _process(delta):
    var velocity = Vector2()
    # Move towards the target and stop when close.
    if position.distance_to(target) > 10:
        velocity = (target - position).normalized() * speed
    else:
        velocity = Vector2()

# Remove keyboard controls.
#    if Input.is_action_pressed("ui_right"):
#       velocity.x += 1
#    if Input.is_action_pressed("ui_left"):
#        velocity.x -= 1
#    if Input.is_action_pressed("ui_down"):
#        velocity.y += 1
#    if Input.is_action_pressed("ui_up"):
#        velocity.y -= 1

    if velocity.length() > 0:
        velocity = velocity.normalized() * speed
        $AnimatedSprite.play()
    else:
        $AnimatedSprite.stop()

    position += velocity * delta
    # We still need to clamp the player's position here because on devices that don't
    # match your game's aspect ratio, Godot will try to maintain it as much as possible
    # by creating black borders, if necessary.
    # Without clamp(), the player would be able to move under those borders.
    position.x = clamp(position.x, 0, screen_size.x)
    position.y = clamp(position.y, 0, screen_size.y)

    if velocity.x != 0:
        $AnimatedSprite.animation = "right"
        $AnimatedSprite.flip_v = false
        $AnimatedSprite.flip_h = velocity.x < 0
    elif velocity.y != 0:
        $AnimatedSprite.animation = "up"
        $AnimatedSprite.flip_v = velocity.y > 0

func _on_Player_body_entered( body ):
    hide()
    emit_signal("hit")
    $CollisionShape2D.set_deferred("disabled", true)
using Godot;
using System;

public class Player : Area2D
{
    [Signal]
    public delegate void Hit();

    [Export]
    public int Speed = 400;

    private Vector2 _screenSize;
    // Add this variable to hold the clicked position.
    private Vector2 _target;

    public override void _Ready()
    {
        Hide();
        _screenSize = GetViewport().Size;
    }

    public void Start(Vector2 pos)
    {
        Position = pos;
        // Initial target us the start position.
        _target = pos;
        Show();
        GetNode<CollisionShape2D>("CollisionShape2D").Disabled = false;
    }

    // Change the target whenever a touch event happens.
    public override void _Input(InputEvent @event)
    {
        if (@event is InputEventScreenTouch eventMouseButton && eventMouseButton.Pressed)
        {
            _target = (@event as InputEventScreenTouch).Position;
        }
    }

    public override void _Process(float delta)
    {
        var velocity = new Vector2();
        // Move towards the target and stop when close.
        if (Position.DistanceTo(_target) > 10)
        {
            velocity = (_target - Position).Normalized() * Speed;
        }
        else
        {
            velocity = new Vector2();
        }

        // Remove keyboard controls.
        //if (Input.IsActionPressed("ui_right"))
        //{
        //    velocity.x += 1;
        //}

        //if (Input.IsActionPressed("ui_left"))
        //{
        //    velocity.x -= 1;
        //}

        //if (Input.IsActionPressed("ui_down"))
        //{
        //    velocity.y += 1;
        //}

        //if (Input.IsActionPressed("ui_up"))
        //{
        //    velocity.y -= 1;
        //}

        var animatedSprite = GetNode<AnimatedSprite>("AnimatedSprite");

        if (velocity.Length() > 0)
        {
            velocity = velocity.Normalized() * Speed;
            animatedSprite.Play();
        }
        else
        {
            animatedSprite.Stop();
        }

        Position += velocity * delta;
        // We still need to clamp the player's position here because on devices that don't
        // match your game's aspect ratio, Godot will try to maintain it as much as possible
        // by creating black borders, if necessary.
        // Without clamp(), the player would be able to move under those borders.
        Position = new Vector2(
            x: Mathf.Clamp(Position.x, 0, _screenSize.x),
            y: Mathf.Clamp(Position.y, 0, _screenSize.y)
        );

        if (velocity.x != 0)
        {
            animatedSprite.Animation = "right";
            animatedSprite.FlipV = false;
            animatedSprite.FlipH = velocity.x < 0;
        }
        else if(velocity.y != 0)
        {
            animatedSprite.Animation = "up";
            animatedSprite.FlipV = velocity.y > 0;
        }
    }
    public void OnPlayerBodyEntered(PhysicsBody2D body)
    {
        Hide(); // Player disappears after being hit.
        EmitSignal("Hit");
        GetNode<CollisionShape2D>("CollisionShape2D").SetDeferred("disabled", true);
    }
}

设置主场景

主场景是你的游戏会启动的场景。要更改任务栏图标,请转到 *项目→项目设置→Application→Run*中, 设置*Main Scene*为”Main.tscn” 。单击文件夹图标,然后选择Main.tscn即可。

导出模板

为了导出,您需要从 这里 下载 导出模板。这些模板是为每个平台预先编译的不带编辑器的引擎的优化版本。您还可以通过点击 编辑器->管理导出模板 在Godot中下载它们:

../../_images/export_template_menu.png

在出现的窗口中,您可以点击 下载 以获取与您的Godot版本匹配的模板版本。

../../_images/export_template_manager.png

注解

如果升级Godot,则必须下载与新版本匹配的模板,否则导出的项目可能无法正常工作。

导出预设

接下来,您可以通过点击 项目 -> 导出 来配置导出设置。

通过点击 添加... 并选择平台来创建新的导出预设。您可以使用不同的设置创建任意数量的预设。

../../_images/export_presets_window.png

窗口的底部有两个按钮。导出 PCK/ZIP 只创建项目数据的打包版本。它不包含可执行文件,因此该项目无法单独运行。

第二个按钮 导出项目 创建游戏的完整可执行版本,例如Android的 .apk 或Windows的 .exe

资源(Resources)特性(Features) 选项卡中,您可以自定义如何为每个平台导出游戏。我们可以先不考虑这些设置。

按平台导出

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

PC (Linux/macOS/Windows)

导出PC平台在三个受支持的操作系统上的工作原理相同。打开导出窗口,然后点击 添加.. 以创建要创建的预设。 然后点击 导出项目,然后选择一个名称和目标文件夹。选择项目文件夹的 外部 位置。

单击 保存,引擎将构建导出文件。

注解

为macOS导出时,如果在macOS计算机上导出,则最终会得到一个 .dmg 文件,而在使用Linux或Windows时会生成一个 .zip 文件。无论哪种情况,压缩文件都包含一个macOS .app,您可以双击并运行它。

注解

在Windows上,如果希望导出的可执行文件的图标与默认图标不同,则需要手动更改它。请参阅: 更改Windows的应用程序图标

Android

小技巧

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

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

首次运行Android Studio时,点击 配置-> SDK Manager 并安装 Android SDK平台工具。这将安装Godot用来与您的设备通信的 adb 命令行工具。

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

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

现在您可以开始导出了。点击 项目 -> 导出,并添加Android的预设(请参见上文)。

点击 导出项目 按钮,Godot将生成一个APK,您可以下载该APK到设备上。为此,请在命令行中使用以下命令:

adb install dodge.apk

注解

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

如果您的系统支持,则连接兼容的Android设备将在Godot的测试按钮区域中显示 一键部署 按钮:

../../_images/export_android_oneclick.png

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

iOS

注解

为了构建适用于iOS的游戏,您必须有一台运行MacOS且安装了Xcode的计算机。

在导出之前,您 必须 完成一些设置才能成功导出项目。首先是 苹果商店团队Id,您可以登录到您的苹果开发者账户并在 会员 一栏中找到它。

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

../../_images/export_ios_settings.png

点击 导出项目 并选择目标文件夹。

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

../../_images/export_xcode_project_folders.png

现在,您可以在Xcode中打开项目并为iOS构建项目。Xcode的构建过程超出了本教程的范围。有关更多信息,请参见 这里

HTML5 (网页)

点击HTML5预置中的 导出项目。我们不需要更改任何默认设置。

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

../../_images/export_web_files.png

在浏览器中查看 .html 文件可以让您玩游戏。但是,您无法直接打开文件,它需要由Web服务器提供。如果您的计算机上还没有设置一个,则可以在线搜索以查找有关特定操作系统的建议。

将浏览器指向放置html文件的URL。在载入游戏之前,您可能需要等待片刻,然后才能看到开始屏幕。

../../_images/export_web_example.png

游戏下方的控制台窗口会告诉您是否出了问题。您可以通过在导出项目时将 使用调试导出 关闭来禁用它。

../../_images/export_web_export_with_debug_disabled.png

注解

虽然 WASM 在所有主要浏览器中都得到支持,但它仍然是一种新兴技术,您可能会发现一些不起作用的东西。请确保您已将浏览器更新到最新版本,并在 “Godot Github 存储库 [https://github.com/godotengine/godot/问题]”中报告您发现的任何错误。