🎮

Unity…じゃなくてGodotでスマホアプリのゲームを作った

2020/09/24に公開

Unity であればゲームを作っている方であれば誰でも知っていると思いますが、今回は Godot というゲームエンジンでゲームを作り、Android, iOS のマルチプラットフォームでゲームをリリースしてみました。

Godot とは?

Godot は、オープンソースとして開発されている、クロスプラットフォームのゲームエンジンです。

Godot の何が良いのか?

オープンソースのため、ライセンス料を気にする必要がありません。最初から最後まで自由にゲームを作ることができます。

また、Unity や Unreal Engine と違って、実行ファイルを一つダウンロードしてそれを実行するだけですぐにゲーム開発が始められます。ゲーム作りが初めての方にも敷居が低いでしょう。よくあるゲームエンジンだとわりとゲームエンジンを使い始めるまでの準備に時間が取られたりハマったりすることもあるため、この敷居の低さは安心感があります。

スマホ向けゲームを作る時に何を使うと良いのかを考察 - Crieit

Godot で何が作れるのか?

2D も 3D もいけます。作ったことはありませんが、AR や VR もいけるようです。Reddit で Godot の情報を見たりしていると、結構みんな色々とカッコいいゲーム開発中の動画をあげてくれたりしています。

あとはドキュメントの左側の目次を見ていくとワクワクすると思います。

はじめに — Godot Engine (stable)の日本語のドキュメント

実際にどんな感じで作ったのか

実際にどのように作っていったのかを簡単に紹介していきます。

UI

下記のような感じで、シーンにポチポチと UI をのっけていきます。

適当に配置していくこともできますし、一般的なスマホアプリと同様、レイアウトを組んで UI を配置していくこともできます。シーンによって使い分けると良いと思います。

それぞれ配置しているものを Node と呼びます。これらにはスクリプトを割り当てることができ、プログラムで動かすことができます。

Prefab 的なもの

Godot には Prefab という概念はありませんが、同様の概念として、シーンをそのまま別のシーンに配置することができます。プログラムで動的に生成して配置することもできます。わかりやすくて個人的には好きです。ちなみにさっきの画像の一番下のナビボタンなどもいろいろなところで使うのでシーンとして作って配置してあるだけのものです。

プログラム

プログラムは GDScript という独自の言語を使っています。Python に似ています。

var v2 = Vector2(1, 2)
var v3 = Vector3(1, 2, 3)


# Function

func some_function(param1, param2):
    var local_var = 5

    if param1 < local_var:
        print(param1)
    elif param2 > 5:
        print(param2)
    else:
        print("Fail!")

これ以外にも公式では C#や、UI でプログラムを設計できる Visual Script というものもあります。

下記のような感じで、シーン上の Node にアクセスすることもできたりします。

    $ColorRect/Label.set_text("test")

とにかくシーンを細かく分割し、それに応じてプログラムも分割することができるため、量が増えてきたな、と思ったらどんどん分割していくのがおすすめです。

スクリプトの割当

Unity のコンポーネントとは異なり、一つの Node につき一つのスクリプトです。Unity と同様、スクリプト上の変数をエディタの UI 上で設定できるようにすることもできます。

export(Texture) var texture
export(String, FILE) var scene: String

上記のように export という命令を利用すると、下記のようにエディタ上でも設定できるようになります。 tool という仕組みを使うと、このように実際にエディタ上でもプレビューしたまま開発ができます。

動的にシーンのインスタンスを生成する

作ったシーンをプログラム中で動的に生成するには下記のようなプログラムになります。

var SkillButton = preload("res://scenes/battle/skill_button.tscn")

    var skill_button = SkillButton.instance()
    skill_button.initialize(battle_character)
    battle_character.set_skill_button(skill_button)
    $UILayer.add_child(skill_button)

あらかじめプログラム中でロードしておき、それの instance メソッドで生成できます。あとは設定などしてシーン上に add_child するだけです。

Tween もある

Tween もあります。時間に応じて Node のプロパティを変えることでアニメーションさせることもできます。また、時間指定でメソッドを呼び出して処理することもできます。

    tween.interpolate_property(
        $LabelBG,
        'position',
        Vector2(1000, 240),
        Vector2(140, 240),
        APPEAR_TIME,
        Tween.TRANS_LINEAR,
        Tween.EASE_IN_OUT
    )

自動読み込み

スクリプトの自動読み込み機能があります。ゲーム上の単一のシングルトンとして生成させることもできるため、ゲーム全体で使う処理や設定などはこれを利用することで簡単に開発ができます。

僕も共通で利用するリソースやキャラクターデータはそちらを使って参照したり、AdMob の操作もそちらに任せたりしています。地味な機能ですが設定しておくだけですぐ利用できるようになるためめちゃくちゃ便利です。

ローカライズ

ローカライズもとても簡単です。下記のような CSV を作るだけです。

keys,en,ja
SUFFIX,_en,_ja
ACHIEVEMENT,Achievement,実績
ATTRIBUTE,Attribute,属性
BACK,Back,戻る

あとは tr("BACK") のようにすればプログラム中で利用できますし、UI 上のボタンやラベルには、キーをそのまま書いておけば勝手に変換してくれます。

画像などのリソースも言語によって置き換えてくれる設定があります。

プラグイン

エディタにある基本的な機能以外の拡張機能は、プラグインとして導入することができます。例えば AdMob や Game Services などです。

日本では iPhone がすごく流行っていますが、海外では Android が主流です。Android は現在とても簡単にプラグインとして機能が組み込めるようになっています。元々はソースのビルドなどが必要でしたが、現在はダウンロードしてきたファイルを配置して、設定画面でオンにするだけで利用を始めることができるようになっています。

iOS については開発者も人数が少ないのか、もしくは単純に Xcode を挟むせいでややこしいのか、今も Godot 自体のビルドが必要になります。Godot や各プラグインの解説通りにやればできるのですが、ハマりどころでもありちょっと大変です。特に、気づいた限りでは現状 iOS に対応している Firebase のプラグインが存在しません。そのため解析ができないため、解析がしたければ独自にプラグインを開発するか、別のサービスを利用する必要があります。

ちなみに今回僕が使ったのは、AdMob と、Android 用に Firebase Analytics、Game Services、Billing です。iOS 用のペイメントと Game Center は Godot 本体に含まれているようです(が正直ペイメントは使い物になりません)。

リリース用ビルド

Android

Android は諸々設定したら、後は Godot 上でビルドするだけで簡単に apk が作成されます。超簡単です。(もちろん事前の Android SDK の設定などは通常通り必要です)

iOS

iOS もデフォルトのままで良ければ一度 Xcode プロジェクトをエクスポートし、あとは Xcode 側でビルドすれば可能です。プラグインを利用する場合はそこに色々と前処理を挟む必要があります。

Godot 側と Xcode 側の紐付けもできますので、Godot エディタ側で開発したものをいちいちコピーしたりしなくても Xcode 側でビルドすることもできます。

ちょっと面倒ですが、そんな感じで一度設定してしまえばあとは大変ではありません。

まとめ

その他、語りきれないほどたくさんの開発しやすい機能があります。Unity にしろ Unreal Engine にしろそうですが、ドキュメントを見ていると試したくても試しきれないほどたくさんの便利機能があります。とにかく遊んでみるだけでも楽しいです。

また情報量などの周辺環境的にも機能的にも Unity の方が一般的には良いと思いますが、個人的には好きなのでこのような紹介記事を書いてみました。不便なところもちょこちょこありますが、こだわらない場合は是非使ってみてください!

下記が実際に作ったゲームです。よろしければ遊んでみてください。一応他にもいくつか Godot 製のものをリリースしていますが、子ども向けのものだったりするためかなり簡単なものです。

Android
https://play.google.com/store/apps/details?id=com.alphabrend.formationbattle

iOS
https://apps.apple.com/jp/app/id1527275998

参考になる箇所などあったらぜひ「いいね」をお願いします。

Discussion