iOSアプリにミニゲームを組み込む!Goでミニゲーム開発 Ebitengine
前回の記事(Android版)
iOS でもやってみましょう!
大まかな作業のロードマップ
- iOS 用にビルドする
- gomobile の設定
- XCode に組み込む
- 遭遇したエラー
iOS 用にビルドする
公式のビルド部分の記載
cd /path/to/yourgame
ebitenmobile bind -target ios -o path/to/YourGame.xcframework .
ebitenmobile
をシェルから呼べない!
遭遇したエラー1 前回の記事で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インストールしてるワイ・・
色々調べてるうちにこちらの記載に遭遇
以下を実行することで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 に組み込む
こちらを参考にゴニョゴニョしてみた
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
リンカ系のエラーが出る。
(これを追加するとツリーに「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 のサンプルアプリ
ソースコードはこちら
Discussion