エクスポート

概要

動作するゲームを作成したら、他の人にシェアしたいでしょう。でも、友達にGodotをダウンロードして、あなたのプロジェクトを開くように頼むのは現実的ではないですね。代わりに、あなたは自分のプロジェクトをエクスポートして誰でも動作させることのできる「パッケージ」にすることができます。

エクスポートの方法はプラットホームごとに異なります。このチュートリアルでは「クリープをよけろ」をいろいろなプラットフォームにエクスポートする方法を学びます。まず最初に、ゲームの動作を少し変える必要があります。

注釈

自分でまだ クリープをよけろ を作成していない場合は、このチュートリアルを続ける前に 最初のゲーム をお読みください。

プロジェクトの準備

「クリープをよけろ」ではプレイヤーキャラクターをキーボードでコントロールしました。これはPCなら良いのですが、スマートフォンやタブレットでは、タッチスクリーンの入力に対応する必要があります。クリックイベントならタッチイベントと同じように扱うことができるので、クリックして移動するようにゲームを変更します。

デフォルトでは、Godotはタッチ入力からマウス入力をエミュレートします。つまり、何かがマウスイベントで発生するようにコーディングされている場合、タッチしたときもトリガーされます。 Godotは、マウスクリックからタッチ入力をエミュレートすることもできますが、タッチ入力に切り替えた後でも、コンピューターでゲームをプレイし続けることができる必要があります。

プロジェクト → プロジェクト設定 で、 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 内の Orientationportrait に設定する必要があります。

../../_images/export_handheld_stretchsettings.png

次に、 Player.gd スクリプトを変更して、入力メソッドを変更する必要があります。 キー入力を削除し、タッチ(またはクリック)イベントで設定された「ターゲット」にプレイヤーを移動させます。

プレイヤーの完全なスクリプトを以下に示します。変更点はコメントに記載されています。

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);
    }
}

メイン シーンの設定

メインシーンは、ゲームが開始されるシーンです。この「クリープをよけろ」の場合、 プロジェクト -> プロジェクト設定 -> Application -> Run で、フォルダアイコンをクリックして選択し、 Main SceneMain.tscn に設定します。

テンプレートのエクスポート

エクスポートするには、https://godotengine.org/download から エクスポートテンプレート をダウンロードする必要があります。これらのテンプレートは、エディタを取り除いた最適化版のエンジンで、各プラットフォーム用にプリコンパイルされています。 エディタ → エクスポートテンプレートの管理 をクリックして、Godot内でダウンロードすることもできます。

../../_images/export_template_menu.png

注釈

Godot を Steam からダウンロードした場合、エクスポートテンプレートはすでに含まれています。そのため、 エクスポートテンプレートの管理 ダイアログを使ってダウンロードする必要はありません。

表示されるウィンドウ内で ダウンロード をクリックして、使用中のGodotのバージョンに一致するテンプレート版を取得できます。

../../_images/export_template_manager.png

注釈

エクスポートテンプレートは、特定のGodotのバージョンに拘束されます。Godotをアップグレードした場合は、新しいバージョンに合ったテンプレートをダウンロードする必要があります。

プリセットのエクスポート

次に、 プロジェクト → エクスポート の順にクリックして、エクスポート設定を構成できます。

追加... をクリックしてプラットフォームを選択し、新しいエクスポートプリセットを作成します。 さまざまな設定で好きなだけプリセットを作成できます。

../../_images/export_presets_window.png

ウィンドウの下部には2つのボタンがあります。 PCK / ZIPのエクスポート は、プロジェクトデータがパックされたバージョンのみを作成します。 これには実行可能ファイルが含まれていないため、プロジェクトを単独で実行することはできません。

2番目のボタン プロジェクトのエクスポート は、Androidの場合は .apk 、Windowsの場合は .exe など、ゲームの完全な実行可能バージョンを作成します。

リソース タブと 機能 タブでは、プラットフォームごとにゲームをエクスポートする方法をカスタマイズできます。 今のところ、これらの設定はそのままにしておきます。

プラットフォーム別のエクスポート

このセクションでは、必要な追加のソフトウェアまたは要件を含む、各プラットフォームのプロセスを説明します。

PC (Linux/macOS/Windows)

PCプラットフォームへのエクスポートは3つのサポートされたオペレーションシステムで同じ様に動きます。プリセットを作るためにエクスポートウィンドウを開き 追加... をクリックします。その後 プロジェクトのエクスポート をクリックし、名前と保存先フォルダを選びます。あなたのプロジェクトの 外側 にある場所を選んで下さい。

保存 をクリックするとエンジンはエクスポートファイルをビルドします。

注釈

macOSへとエクスポートする際、macOSマシン上でエクスポートすると、 .dmg ファイルができますが、LinuxあるいはWindowsの場合は .zip ファイルが作られます。いずれの場合も、この圧縮ファイルの中にはmacOS用 .app が含まれていて、ダブルクリックすると実行できます。

注釈

Windows上では、エクスポートされた実行ファイルのアイコンをデフォルトから変えたい場合、手動で変更する必要があります。Windows用のアプリケーションアイコンの変更を参照してください。

Android

ちなみに

モバイル機器には幅広い性能差があります。ほとんどの場合、Godotのデフォルト設定は有効ですが、しかしモバイル開発は時として科学よりも芸術に近くなるので、すべて完璧に動かすには、多少の試行や人の助けが必要になるかもしれません。

Androidへエクスポートできるようにするには、下記のソフトウェアをダウンロードする必要があります。

Android Studioを最初に起動したときは、 Configure → SDK Manager をクリックして Android SDK Platform Tools をインストールしてください。これにより、Godotがデバイスと通信するのに使うコマンドラインツール adb がインストールされます。

次は、デバッグ用キーストア(keystore) を生成する下記のコマンドを、コマンドラインから実行してください:

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

Godotの「エディタ → エディタ設定」をクリックし、一覧から「Export / Android」を選択してください。ここでadb (Android SDK)、jarsigner (Java SDK)、および作成したキーストアへのパスを指定します。

../../_images/export_editor_android_settings.png

これで、エクスポートする準備ができました。 プロジェクト → エクスポート をクリックし、Android用のプリセットを追加します (上記を参照)。 Androidプリセットを選択し、 オプション にある Screen に移動し、OrientationPortrait に設定します。 ゲームがランドスケープモードの場合 (ウィンドウの幅 (ピクセル) がウィンドウの高さよりも大きい場合)、これを Landscape のままにします。

プロジェクトのエクスポート ボタンをクリックすると、Godotはデバイスに送信できるAPKをビルドします。コマンドライン上でするには、下記のように実行してください:

adb install dodge.apk

注釈

デバイスをデベロッパー・モードにする必要があるかもしれません。デバイスのドキュメンテーションを参照してください。

システムが対応している場合、互換性のあるAndroidデバイスを接続すると、Godotのテストプレイ用ボタンの場所に ワンクリック・デプロイ ボタンが現れます。

../../_images/export_android_oneclick.png

このボタンをクリックすると、一度にAPKがビルドされてあなたのデバイスにコピーされます。

iOS

注釈

ゲームをiOS用にビルドするには、XcodeがインストールされたmacOSが動くコンピュータが必要になります。

エクスポートする前に、 必ず しなければならないプロジェクト設定がいくつかあります。一つ目に必要なのは App Store Team ID で、Appleデベロッパー・アカウントにログインしてから メンバーシップ のセクションを探すとあります。

アイコンとスプラッシュスクリーンも下の画像のように指定する必要があります:

../../_images/export_ios_settings.png

プロジェクトのエクスポート をクリックして、エクスポート先のフォルダを選択します。

プロジェクトのエクスポートに成功すると、選択した場所に、以下の通りにフォルダとファイルが作られます。

../../_images/export_xcode_project_folders.png

このプロジェクトをXcodeで開いて、iOS向けにビルドします。Xcodeのビルド手順についてはこのチュートリアルの範疇を超えるので、https://help.apple.com/xcode/mac/current/#/devc8c2a6be1 を参考にしてください (英語)。

HTML5 (ウェブ)

HTML5のプリセットにて プロジェクトのエクスポート をクリックします。設定はデフォルトから変える必要はありません。

エクスポートが完了すると、下記のファイルがあるフォルダが作られます。

../../_images/export_web_files.png

.html ファイルをブラウザーで見るとゲームをプレイできます。しかし、このファイルを直接開くことはできないので、ウェブサーバー上に置く必要があります。もし用意していないのであれば、お使いのOSに適したセットアップ法をオンラインで検索してみてください。

HTMLファイルを置いた場所のURLをブラウザで開いてみてください。ゲームがロードされてスタートスクリーンが表示されるまで、しばらくかかるかもしれません。

../../_images/export_web_example.png

下にあるコンソール・ウィンドウは、なにか問題があればそれを知らせてくれます。プロジェクトのエクスポート時に デバッグ付きエクスポート のチェックを外すと、無効にできます。

../../_images/export_web_export_with_debug_disabled.png

注釈

全てのメジャーなブラウザはWebAssemblyに対応していますが、しかしこれはまだ新しいテクノロジーなので上手く動かないこともあるかもしれません。最新版のブラウザにアップデートされているか確認してから、もしバグがあれば Godot Github repositoryまでご報告ください (英語)。