BlenderとUnityとXcodeで作る初めてのARアプリ開発
2024年の8月から10月にかけて、競技関連の生配信に使用するARアプリの開発に、3Dモデル担当として関わりました。ARアプリの開発案件は自分にとって初めての経験で、ARアプリに組み込むためのBlenderでの3Dモデル制作フローを学ぶことができました。
9月末の番組初回リリース後も継続的に改善作業が行われていて、このプロジェクトが長期的なものとして続いたら良いなと思っています。
自分でもARアプリを開発してみたくなった
今年前半に関わった「Apple Vision Proを活用したサウナアプリ」の開発案件や、今回の「競技配信におけるARアプリ開発」を通じて、「目の前に3Dモデルが手に触れられるほどの距離感で現れる」というインパクトや驚きを体験できました。
また、個人的にもApple Vision Proを使って3Dモデルを動かしている中で、AppleのARKitの充実さに興味を感じたり、Blenderで学んだことをXRにつなげられたら良いなと思うようになりました。
11月前半に開発した「はじめてのARアプリ」
こういった体験がきっかけとなり、個人的にも「ARアプリを作ってみたい」と思うようになりました。そして、11月前半に初めてのARアプリ作品にチャレンジしてみました。3DモデルをBlenderで制作し、UnityでARアプリケーションを開発し、XcodeでビルドしてiPhoneで動かしてみました。
本記事では、このアプリを作るにあたって参考にしたサイトや書籍をメモしたり、実際に書いたコードなどを掲載して備忘録とします。
BlenderとSubstance Painterでの3Dモデリング
以前から「小さな港に停泊する飛行艇」を作ってみたかったので、それをテーマにしました。
3DモデルはBlenderとAdobe Substance 3D Painterを使って制作しました。iPhoneの端末で動かすことを想定しているため、ポリゴン数の軽減を意識し、モデリング段階から軽量化を図りました。
Blenderでモデリングを行った後、Blender標準のカラーグリッドを使いながらUV展開を行い、FBX形式でエクスポートしてSubstance Painterにインポートしました。その後、テクスチャを作成し、Substance Painterでテクスチャを書き出した後、再度Blenderにインポートしました。
このBlenderとSubstance Painterを行き来するプロセスを繰り返す中で、以前は苦手だったUV展開への抵抗感が薄まりました。きれいにUV展開できると、Substance Painterでもきれいに塗れるし、何より塗りやすいと思いました。
また、ARアプリでは360度で3Dモデルを見回すことができるため、見せたくない箇所を隠すことが難しく、背面や底面など目立たない箇所にシームを設定することを意識しました。
Substance Painterに関しては「作りながら覚える Substance Painterの教科書」という書籍を参考にしつつ、Udemyのこちらのコースでハンズオンを体験しました。
個人的には、「作りながら覚える Substance Painterの教科書」という書籍で内容を把握しつつ、ハンズオンに関しては配布される完成度の高い3Dモデルよりも、実際に自分が作った3Dモデルを心のままに着色する方が良いと感じました。なぜなら、きれいにUVを展開した無駄のないメッシュの3Dモデルに対して着色するよりも、自分が作った歪なメッシュや非効率なUV展開に対して着色する方が、実際に「こんなやり方ではまともに着色できない!」と気づくことができ、「きれいに塗るためには3Dモデルをどう作れば良いか」という学びを得られると感じたからです。
UnityとAR Foundationによるアプリ開発
映像制作でUnityを活用した経験はありましたが、ARアプリ開発は初めてでした。
実現したかったのはARマーカーに重ねると3Dモデルが出現し、タップなどでアニメーションするデジタル模型みたいなイメージでした。そこで、UnityのAR Foundationを活用し、XcodeでビルドしてiPhoneで3Dモデルを表示することにしました。
環境設定からビルドまでのフローはこちらのサイトを参考にしました。
また、ARとは関係ないですが、3Dエフェクトの表現を考える中で、UnityのShader Graphを使いたかったので、最初はBRPで開発していた環境をURPに変えました。参考にしたのは下記サイトです。
Unityが提供するAR Foundationは精度が高く、ライブラリも充実していて、何より私のような初心者でも直感的に使用できる点が魅力的でした。
アニメーションとエフェクト演出
カメラ越しに現実世界に自分で作った3Dモデルが表示されるだけでも感動するのですが、せっかくなので3Dモデルを動かしたり、ライティングの演出をしたいと思いました。
Unityのマテリアルとライティングのパラメーターを、C#で制御して「昼と夜の演出」を実装してみました。Unityは、3Dオブジェクトやライトやマテリアルをコードですぐに制御できる上に、直感的でわかりやすいので好きです。
そして、Unityのパーティクルシステムを使って夜景の時に花火が打ち上がる演出を実装しました。花火に関してはこちらのサイトを参考にしながら、タイミングのコントロールなどはC#で制御しました。
完成したアプリはXcodeを使ってビルドし、iPhone上で動作確認を行いました。ARマーカーをカメラにかざすと飛行艇が現れ、演出が再生される様子に達成感を感じました。
またパーティクルシステムに関してはこちらの書籍を参考にしました。何年か前に買った本なので情報は古いかもですが、基本的な動きを知るのには十分でした。
ChatGPT4oとのペアプログラミング
UnityのC#スクリプトの作成は、ChatGPT4oを活用しました。最初は、飛行艇のプロペラ回転や飛行艇の円周運動などを、ペアプログラミング形式で一緒に作ってもらいました。最終的にはライティングやマテリアルの制御、パーティクルシステムのコントロールなど、自分が今までやったことのない技術に関しても、ChatGPT4oを通じて実装することができました。
日本語で指示を出すよりも、簡単なクラス設計やメソッド設計を先に行い、それに合わせて実現したいアニメーションや仕様を伝えると、生成されるコードの品質が高くなる傾向にありました。特に、「開発するアプリケーションがARアプリであること」「XcodeでビルドしてiPhoneで実行すること」「Unityに設定しているマテリアルやInspectorの情報」などの前提情報を伝えると、実行時のエラーや意図しない動きを回避することができました。
生成AIを使ったコーディングは、GitHub Copilotなどを活用する方が効率的かもしれませんが、私は「そもそも3DオブジェクトのマテリアルのエミッションをC#でどうアクセスするのか?」といったことがわからないレベルだったので、ChatGPT4は十分すぎるほどのサポートを提供してくれました。
ChatGPT4oにUnityのC#スクリプトのフォローをもらう事に関しては、以前に購入した「作って学べる Unity本格入門」という書籍を少し読み直すところからはじめました。特にアニメーション制御はBlenderのリグアニメーションで実装したほうが良いのか、UnityのC#スクリプトで制御したほうが早いのかなど、どちらのツールで実現したほうが良いのか判断がつかなかったためです。この書籍に関しては、現在は新版が出ているようで、より最新のことが書いてあるかもです。
生成AIを使ったプログラミングの良いところは、「苦手な分野に対しても、知識ゼロから質問すると具体的な手法を提示してくれる」「すぐに実行できるサンプルコードを詳細なコメント付きで提供してくれる」「どんなにエラーで動かなくても、エラーメッセージや現象を伝えると、とことん付き合ってくれる」点です。
人間相手では聞けないことや、延々とエラーに付き合ってくれるのはとても心強かったです。特に、GPT4からは見ることができない実行時の挙動やUnityのInspector画面についても、言葉で正確に伝えると、それを踏まえたエラー解決に尽力してくれるので、非常に感動しました。
ネクストチャレンジはWebAR
以上が、Blender、Unity、Xcodeを使って開発した初めてのARアプリの開発メモです。開発を通して感じた課題の一つとして、アプリのインストールが必要である点が挙げられます。自分以外の誰かにアプリを配布するには、AppleのApp Storeに申請し、アプリストアからダウンロードしてインストールしてもらう必要があります。今回のようなサンプル的なARアプリの場合だと、気軽にインストールしてもらうのはハードルが高いかもと感じました。
この課題を解消するために、現在はWebARの開発に取り組んでいます。WebARでは、ブラウザを通じて手軽にコンテンツを楽しめるため、利用者のハードルが低くなり、スマホさえあればiPhoneやAndroidなどで気軽に楽しむことができます。
11月後半はWebARアプリの開発を行っていたので、次回はこのWebAR開発についてのメモをnoteに書きたいと思っています。
まとめ
今回のARアプリの個人制作を通じて、xRを想定した3Dモデリング、テクスチャの互換性、UnityのAR Foundationの活用方法、Xcodeでのビルド方法、C#でマテリアルやパーティクルを制御する方法、そして生成AIの活用など、多くの技術を学ぶことができました。
特に、目の前に自分が作った3Dモデルが現れ、手のひらで動く感覚は非常に楽しく、今後、ARグラスなどが普及すれば、その需要はさらに広がると強く感じました。
今回得た経験をもとに、次のステップとしてWebARの開発を進め、より手軽に楽しめるコンテンツにチャレンジしてみたいと思います。