👾

iOSアプリにミニゲームを組み込む!Goでミニゲーム開発 Ebitengine

2024/06/03に公開

前回の記事(Android版)
https://zenn.dev/heartrails/articles/f404bb9c988547

iOS でもやってみましょう!

大まかな作業のロードマップ

  • iOS 用にビルドする
    • gomobile の設定
  • XCode に組み込む
    • 遭遇したエラー

iOS 用にビルドする

公式のビルド部分の記載
https://ebitengine.org/en/documents/mobile.html

cd /path/to/yourgame
ebitenmobile bind -target ios -o path/to/YourGame.xcframework .

遭遇したエラー1 ebitenmobile をシェルから呼べない!

前回の記事でAndroid版の時にも遭遇してたんですが、 ebitenmobile がターミナルから見つからない状態でした。(go run github.com/hajimehoshi/ebiten/v2/cmd/ebitenmobile で無理やり回避してた)
シェルから呼べない=パスが通ってない、だったので普通にシェルの知識の問題でした・・

go env GOPATH
/User/.../.asdf/installs/golang/1.22.3/packages # 自分がインストールした golang のパス

こんな感じだったので、PATH に読み込めるように設定

# 一番下あたりに PATH の読み込みを追加
export PATH="$(go env GOPATH)/bin:$PATH"

するか、私の場合は asdf を使って go を入れてたので asdf reshim しなさいとのことでした。。
参考 : https://blog.framinal.life/entry/2021/07/30/205745

遭遇したエラー2 : gomobile requires Xcode

ebitenmobile bind -target ios とすると次のエラー

gomobile: -target="ios" requires Xcode
exit status 1

なんよ。。XCodeインストールしてるワイ・・
色々調べてるうちにこちらの記載に遭遇

https://github.com/golang/go/issues/26348

以下を実行することでXCodeのパスを再設定できます、とのことなので実行。

sudo Xcode-select --switch /Applications/Xcode.app/Contents/Developer/

遭遇したエラー3 : missing .xcframework suffix

お次はこれ。

gomobile: static framework name "./mobile/ios/" missing .xcframework suffix
exit status 1

ebitenmobile bind 時に出力ファイル名指定をミスってた(xcframework ではなかった)ため発生していた模様。(ちょっと古い記事を参考にしてたので .framework って書いてあった)

以下を実行

ebitenmobile bind -target ios -o ./mobile/ios/Mobile.xcframework ./mobile

ここまででビルドできているはず・・!

ls ./mobile/ios
Mobile.xcframework

.xcframework ですが、普通にディレクトリで中身見れるようなのでチラ見しておく。

あとでこの Mobile.h をインポートして使う。


XCode に組み込む

こちらを参考にゴニョゴニョしてみた

https://qiita.com/krile136/items/b931a56cbcaa8690bc9c

XCode でサンプルのアプリケーションを作成

XCode -> Create New Project -> App を選んでプロジェクトを作成する

  • Product Name
  • Team
  • Organization Identifier

を適当に指定

  • Interface (今時っぽく SwiftUI を指定したいところですが、公式のサンプルにある方でいかないとハマりそうなので Storyboard を選択)
  • Language : (今時っぽく Swift を指定したいところですが、Objective-C <-> Swift のところをうまく変換できる自信がなかったため、 Objective-C を選択)

Build Phase の設定

左側のツリーから先ほどつけたプロジェクト名「MyFirstProject」を選択
TARGET : MyFirstProject
タブの Build Phases を選択し、「Link Binary With Libraries」を選択
+ ボタンをクリックしてライブラリを追加したい

参考にしたQiita の記事だと、何度か Mobile.framwork をドラッグドロップしてるが、左側のツリーの「Frameworks」部分に入れたいだけのような気がするのと
この手順で行ったら別のエラーに遭遇してライブラリ追加しなきゃいけなくなったので先にそのライブラリを追加する。

「GameController」frameworkを追加

遭遇するエラー : Undefined symbol: OBJC_CLASS$_GCController
リンカ系のエラーが出る。

https://github.com/ocornut/imgui/issues/5938
こちらを参考に、「GameController」framework を追加すれば良いようなので
(これを追加するとツリーに「Frameworks」が出てくる)
こちらを先に追加。

(追記)
今更よくみたら、公式のドキュメントに GameController 入れて、って書いてありました・・

タブの Build Phases を選択し、「Link Binary With Libraries」を選択
+ ボタンをクリック
「GameController」frameworkを追加

ebitengine のゲーム framework を追加する

Finder で先ほどの Mobile.xcframework を選んで、XCodeの左側のツリー部分にドラッグドロップする

「Copy items if needed」のチェックを入れてコピー!

MobileEbitenViewController を継承した自前の ViewController を作る

左側のツリーから 右クリック>New File...>Header File
を選択

MyViewController.h として作成

公式を参考に以下記載

#import <Mobile/Mobile.h>    // ebitengine で書き出したゲームモジュールの import

@interface MyViewController : MobileEbitenViewController // ebitengine の書き出した ViewController を継承

@end

同じく、 MyViewController.m (Objective-Cファイル)を作成

#import "MyViewController.h"

#import <Foundation/Foundation.h>

@implementation MyViewController {
    
}

- (void)onErrorOnGameUpdate:(NSError *)err {
    NSLog(@"MyViewController game error %@", err);
}

@end

Storyboard の ViewController を差し替える

左のツリーから「Main」ストーリーボードを選択
Scene に最初から配置してあった ViewController をクリックして
右端のCustom Class 設定を変更する
先ほど作った MyViewController と書く

ビルドしてみる。この時点でゲーム画面が表示される。
めでたい 🎉

AppDelegate.m の修正

下の方に以下を追加。
アプリが止まった or 再開した時などにゲームも止める・再開する処理

- (void)applicationWillResignActive:(UIApplication *)application {
    [[self ebitenViewController] suspendGame];
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    [[self ebitenViewController] resumeGame];
}

- (MyViewController*)ebitenViewController
{
    return (MyViewController*)([[self window] rootViewController]);
}

今回設定した iOS のサンプルアプリ

ソースコードはこちら

https://github.com/maripiyoko/FirstIosGameApplication

ハートレイルズ

Discussion