导出

概览

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

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

注解

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

准备项目

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

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

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

../../_images/export_touchsettings.png

我们还想确保游戏在不同尺寸的屏幕上有一致的比例,所以在项目设置中进入 显示Display ,然后点击 窗口Window 。在 拉伸Stretch 选项中,将 模式Mode 设置为 2d方向Aspect 设置为 保持keep

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

../../_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

# 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 = "walk"
        $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;
        }

        // 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 = "walk";
            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);
    }
}

设置主场景

主场景是你的游戏开始的场景. 对于这个 躲避爬行者 的例子, 在 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 命令行工具.

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

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, 您可以在设备上下载. 要在命令行上进行这项工作, 请使用以下方法:

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 仓库 上报告你发现的任何错误.