エクスポート

概要

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

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

注釈

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

プロジェクトの準備

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

デフォルトでは、Godotはタッチ入力からマウス入力をエミュレートします。つまり、何かがマウスイベントで発生するようにコーディングされている場合、タッチもそれをトリガーします。 Godotは、マウスクリックからタッチ入力をエミュレートすることもできますが、タッチ入力に切り替えた後でも、コンピューターでゲームをプレイし続けることができる必要があります。 [プロジェクト設定]で Input DevicesPointing 内にある、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 スクリプトを変更して、入力メソッドを変更する必要があります。 キー入力を削除し、タッチ(またはクリック)イベントで設定された「ターゲット」にプレイヤーを移動させます。

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

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 Scene を"Main.tscn"に設定します。

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

エクスポートするには、http://godotengine.org/download からexport templatesをダウンロードする必要があります。これらのテンプレートは、各プラットフォーム用にエディタがプリコンパイルされていない最適化されたバージョンのエンジンです。Editor-> Manage Export Templatesをクリックして、Godotでダウンロードすることもできます。

../../_images/export_template_menu.png

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

../../_images/export_template_manager.png

注釈

Godotをアップグレードする場合、新しいバージョンに一致するテンプレートをダウンロードする必要があります。そうしないと、エクスポートされたプロジェクトが正しく機能しない場合があります。

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

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

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

../../_images/export_presets_window.png

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

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

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

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

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

PC (Linux/macOS/Windows)

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

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

注釈

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 に移動し、Orientation を"Portrait"に設定します。

「プロジェクトのエクスポート」ボタンをクリックすると、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

注釈

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