土鍋で雑多煮

UnityでXR・ゲーム開発をしています。学んだことや備忘録、趣味の記録などを書いていきます。

MENU

ゲーム & XR学生エンジニアの就活体験記

はじめに

※注意点※
就活の戦略は三者三様なので、ここで書いた内容は再現性のあるものではないし、一個人の感想です。バックグラウンドや価値観が違うのは前提としてお読みください。また、自分の意見は多くの人の影響を受けて造成されたもので、業界や界隈による考え方の違いに関しても考慮してご覧ください。


どうも、土鍋です。
この度、内定をいただき、承諾したので就活体験記を書いてみようと思います。

自分が意識したこと、注意したこと、どういう思考プロセスで就職先を絞っていたかなど、自分の経験を元に書いています。非常に狭い領域に特化して就活をしたため、参考にならない場合も多いとは思いますが、どういうことを考えて就活してたかを詰めこんだので誰かの参考になれば嬉しいです。

筆者のバックグラウンド

26卒の修士1年です。

X: @donadonadonabe

大学
情報工学系の学部&大学院

サークル

  • VR・ARコンテンツ開発サークル
  • 技術系全般サークル
  • ゲーム開発サークル

に所属していました。メインはVRサークル。

技術スタック
プログラミングは大学から始めて、現在で約4年半くらい。
基本的に現在までずっとVR・MRゲームを開発してきました。

  • Unity 4年半 ほとんどの作品はUnityで制作・有名なライブラリは一通り使用経験あり
  • C# 4年半 UnityC#
  • C 4å¹´ マイコン
  • Python 2å¹´ C#かCで書きづらいものを作るとき

インターン
合計10社(短期・長期含め)

  • スタートアップ2社
  • 中小3社
  • 大企業5社

アウトプット

  • ハッカソン・コンテスト参加数13回
  • 開発した作品数20個くらい
  • ブログ54記事
  • LT登壇(サークル内含め)50回くらい

意識していたこと

目の前のプロジェクトにオーナーシップを持って取り組む

「オーナーシップ」という言葉を知ったのはこの半年とかなのですが(というか受け売り)、自分の持っていた気持ちを表す言葉として非常に合っているなと感じたので使いました。

「オーナーシップ」とは、自分の割り当てられた役職や作品、プロジェクト、会社に対して当事者意識を持っているか、ということです。

言葉にするとなんだその程度かと、一蹴されるかもしれませんが、学生でこの気持ちを持って何か物事を進めている人は案外少ないんじゃないかなと思っています。

授業にしろ、研究にしろ、学生はどうしてもやらないといけないから、みんなやってるからでやってしまう事がたくさんあります。開発にフォーカスすると、任されたタスクをこなすかとかですかね。

タスクをこなすことはめちゃくちゃ大事だし、なんならタスクをこなせないことも全然あるので、こなせてるのであれば、むしろすごいと思います。

ここで言いたいのは、そのタスクがなんのためにあって、その開発や作品の何を良くしたり、加速させるものか、そもそもタスク自体おかしい可能性も疑うなど、主体性を持って考えて取り組むということです。

ちなみにオーナーといってもチームリーダーという意味ではありません。

リーダーとは簡単に決断できないときに決断する役割をする役目だと自分は思っています。それゆえに間違うときが必ずあります。リーダー以外の人はただ従うのではなく、それに対して自分の意見を伝えることが大切になってきます。

最終的に、この作品・プロジェクトは自分が一員として作り上げたんだと自信を持って話せれば、オーナーシップが持てている、ということだと思います。

具体的にどういう話題を就活のときに書いた話したということは以降で述べますが、オーナーシップを持って開発に関わっていれば、話す話題がないなんてことにはならないはずです。

自分が何をしたいのか

上記で述べたオーナーシップを持てるかには、まず自分がやりたいことなのかどうかというのは大きいです。

どんなに熱いプロジェクトでも、自分がやりたい役職じゃなかったり、疑問のある内容だったり、メンバーとの相性が絶望的に悪かったりすることもあると思います。

そうなると、タスクをこなすことがギリできても、自分が成し遂げた成果に感じなかったり、そもそも気持ちも落ち込んでしまい、最悪の場合、プロジェクトを完遂できなくなってしまう可能性もあります。

「これは誰々さんリーダーの作品だから」とか「自分は大したタスクやってないから」など、どこか他人事のようにその開発に関わるのは自分にとってもチームにとっても健全ではありません。

社会人になってお金が関わるようになってくると話は別かもしれませんが、せっかく学生という短い時間でなにかプロジェクトに関われているのであれば、ぜひ自分が幸せな形で進めるべきです。

ちょっと就活の話からズレてしまった気がするので戻すと、
自分が幸せになるための就活の軸を持っていた方がいいです。

自分は何を将来的にやっていきたくて、会社ではどんな役割で、どんなものに関わっていきたいかなどを持っておくと、面接のときに話せるのはもちろん、希望するムーブができる会社にいけます(受かれば)。 就活のあとに待っている長い長い社会人人生で自分のやりたいことができるのは、一番幸せなことです。

きれいごと言ってるみたいに思われるかもしれないですが、実際そうだと思うので、希望の会社に行ける行けないは別として考えるに越したことはないと思います。

会社が何を求めているのか・どう思うか

これは就活っぽい話ですが、会社が自分のことをどのように評価するかを考えるのは、就活をする以上常に考えていました。

例えば大好きな技術があって(自分ならXR)それを今後もやっていきたい!という思いがあったとします。

それを面接などで押し出した時、会社はどのように評価するでしょうか。

それ以外に興味が無さそうと思われたら使いにくい人材だなと思われるかもしれないし、それだけ特化して技術を突き詰められてすごい!と思われるかもしれない。

つまり、会社にどういう風に思われたいか、を考えると良いと思います。

例えば

  • 技術力つよつよアピール
  • マネジメントスキルアピール
  • クリエイティブアピール

などですかね?(他にもあると思いますが)

会社がどう判断するかは千差万別でしょうが、アピールしたい自分の像というのは定まると思います。

ちなみにゲーム好きアピールはあまりプラスにならないので注意が必要です。
なぜならゲーム会社志望してる時点でゲーム好きなのは当たり前なので。

ゲーム好きなのになんで作ってないの?って言われないように、まだ作ってない人はひとまず手を動かして作ってみてください。アピールの話はそれ以降に見えてくるはずです!

最終的に会社側がどういう人材を欲しているかを調べる方法は、色々ありますが、
まずはHPに掲載しているビジョンや社員インタビューはそういう人材が欲しいという明確な指標になります。
あとはIR(投資家向け情報)やプレスリリースを見て今後どういう事業に力を入れるのかを探るのも面白いと思います。
社員に直接話を聞くのはリアルタイムな情報を得ることができます。最近社内で勢いのある部署の話とかとか。

言語化する

これは気持ちというよりテクニック的な話ですが、就活ではどうしても求められてしまう技能なので、どうにかこうにかできるようにならなければなりません。

これに関しては僕もずっと苦手でしたが、最近はマシになってきたかな?という感じです。

高校生・大学前半までは正直なんとなくとか、周りに合わせてとかで全然なんとかなるし、そうした方が心地良いので、特に深く物事について考えて言葉にすることはなかったのですが、最近はそれじゃだめだなと感じています。

別に就活のために始めた訳では無いですが、ブログ・LT登壇などは今振り返ると言語化能力向上に役立ったなと思います。

ブログはエンジニアとしてのアウトプットとして最適だと思います。

人に教えると自分も理解が深まるとはよく言いますが、本当にその通りで、なんとなくでやっていることの文章化や公式リファレンスを読み込むなど結構労力がいりますが、その分思考が整理されるのでおすすめです。

LT登壇も今思えば人前に立って喋るのが苦でなくなって、面接でもほとんど緊張しなかった理由の一つな気がします。

あとは日報書くのもいいと思います(僕は1ヶ月坊主でした…)

技術力向上

圧倒的な技術力はすべてを解決するというのはコミュニケーションに難さえなければ実際そうだと思います。

ただ自分もそうですが、ほとんどの人は学生のうちに圧倒的技術力なんて身につきません。

一般的な企業の多くは新卒採用で即戦力よりはマインドやエンジニアとしての適正を大切をしているケースが多いので、それをアピールできるようにするといいと思います。

この適正を示すために一定レベルの技術力を学生のうちに持っていた方が有利にはなると思います。
一定レベルをどれくらいとするかは会社によってまちまちだと思いますが、技術選定の理由が話せるレベルが一つの基準だと思います。結構これは大変で、どんな思想のもとその設計をして、そのライブラリを使用したかみたいなのを明確に示せなきゃいけないので、ある程度開発経験が必要です。

スケジュール

以下は自分が本格的に就活を始めてからのスケジュールです。(これより前からスタートアップで長期インターンなどはしていました)

4月 就活サイトに登録しだす
5月 ES書き始める
6月 ES・面接
7月 面接
8~10月 インターン
11月~12月 本選考・内定
1月 本選考・内定

これは特にIT系の就活ですし早めの方なので、普通はもっと遅いはずです(3月ぐらいから本選考)。
ただ早めに動くに越したことはないです。

会社探し・選び

自分の探し方は

  • 趣味領域
  • 技術系イベントで知った会社
  • 就活サイトでスカウトされた会社

くらいです。他やったことはそんなになかった気がします。

ゲーム系は少ないですが、逆求人イベントから採用決まるケースよく聞きます。

選ぶ基準

洗い出す段階においてはまずは直感でいいと思います。

この会社のこのゲーム・サービス好きなんだよな~とか、技術的アウトプットがおもしろいとか、オフィスがきれいとか、儲かっているとか。

そもそもよく調べないと選ぶのは難しいです。

今は興味あるサービスがないかもしれないけど、裏ではおもしろいプロジェクトが動いているかもしれないですし、なんならその部分の採用を強化しているかもしれません。

それをどうやって知るかですが、これは色んな方法があります。

会社のIRの資料を読んでみたり、プレスリリースを漁ったり、実際に中の人に聞いてみたり、などなど。

方法は様々ですが、それぐらい事細かに調べないと本当に自分がやりたいことができるかやマッチしている企業が見つけられません。

逆に言うと、それぐらい調べたうえで選考受けると、面接で空気が凍ったり、うちじゃないねって言われなくなると思います。

で、網羅的に調べてると、だんだん自分の就活の軸みたいなものも見えてくると思います。

趣味

僕は技術的にゲームとXRが好きなので、まずはNotionに知ってる会社をバーっと書き出してリストを作りました。

XR

自分がずっとやってきてこれからも関わっていきたい領域です。
ですが結果から言うとXR特化の会社を選びませんでした。
これにはいくつか理由があります。

1つ目は普段の開発のどこに面白さを感じているかを振り返ったときに、Unity自体に開発の楽しさを感じていたからです。VRゲームにしろARアプリにしろ、内部で書いているコードはインプットアウトプット以外は通常のゲームと変わりません。その中でも自分の開発者としての興味は、設計やアウトゲーム開発など、ユーザー体験を支える裏側の領域にあると気付き、それならば無理にXR系に就職先を絞る必要がないのではないかと考えるようになりました。(もちろんインプットアウトプットとしてのXRも大好きだけど、あくまで長く仕事としてやるなら何がいいかを考えた結果)

2つ目は自社サービス開発をしたかったからです。現在のXR企業の多くは受注開発です。もちろん相手企業の抱える問題や作りたいサービスをXRで解決するのは魅力があると思いますし、事例をたくさん作ってXR業界全体を盛り上げるという楽しさがあります。
自分の場合、企業に就職してやりたかったことが、自分たちで面白いと思うもの・愛されるものを作り上げていってそれが世界中で流行ったら嬉しい、ということだったので、この決断をしました。また、社内の他事業とのかけ合わせで新しいプロダクトやサービスを作れるのも魅力でした。

しかし、最終的に決めた会社はXRも可能性があればサービスが生まれる環境のある会社です。例えばARグラスが普及した未来が来たとしたら事業を立ち上げに関わったりしてみたいです。

また、XR系を副業でやっていきたい気持ちもあります。例えば知り合いがXR系で起業して人手が足りない!ってなっていたらぜひ手伝いたいです!

ゲーム

ゲーム好きの人が迷うのはコンシューマーなのかスマホなのかが一つポイントな気がします。

ひとまずは自分が好きなゲームで選んでいいと思います。

自分はジャンルとしては、シミュレーションゲームやストラテジー、オープンワールドなど、どちらかというとコンシューマー・PCゲームの方が好きなのでかなり迷いました。

ただ、最終的にはゲームを「仕事」として「作る」側として楽しそうな方を選びました。

自分はWeb系やXR系のエンジニアの友人や知り合いが多く、そちらではLT会やブログなどで普段からアウトプットする文化があるのですが、僕はその文化が好きです。

スマホゲーム系はその風潮があるのですが、コンシューマー系でその文化はあまり聞かないです。 まあ自社エンジンのとこが多いのであんまりオープンにするメリットがないのだと思います。

Unityはオープンソースではないですが、日本のUnityコミュニティはみんなで知見を共有したり、OSSライブラリ作ろうという風潮があるので、自分はそこに居心地の良さを感じたんだろうなあと分析しています。

しかし、あくまで僕の経験した範囲内での話であることに注意してください。
絶対にコンシューマーでも開発楽しいです。(自社エンジンも経験してみたかったなあ)

技術系イベント

学生エンジニア向けの技術系イベントはたくさんあります。
これの何が嬉しいかと言うと、会社内部の人と直接喋れるという点です。

自分が参加したものだと

  • 技育Campハッカソン・技育博・技育展などサポーターズ系
  • サークルで企業を呼んだLT会
  • 企業主催の技術系LT会
  • 企業の説明会

とか。

オンラインだと雑談的に会社の話を聞きにくいので、対面だと嬉しいですね。

就活サイト

就活サイトは自分が知らなかった面白そうな会社に出会えるという用途で使用していました。
またスカウトが来たら選考スキップなどもあるので、登録し得だと思います。
ただ、設定で切らないとメールがめっちゃくるので、注意が必要です。

自分は有名どころや理系向けのサービスを一通り使ってみて、良さそうだなと思ったのは以下のサービスです。

LabBase

ちょこちょこ有名企業からスカウト来ます。 あとは興味ありされた企業に興味ありし返すとスカウトもらえたりしますね。 知らない企業を知るという使い方もできると思います。

傾向としてはメーカー系、ソフトウェア系が多めなイメージ。

アカリク

こちらもたまに有名企業からスカウト来ます。 LabBase同様に知らない企業知ることに使えると思います。

傾向としてはソフトウェア系が多めなイメージ。

Wantedly

スタートアップから中規模くらいの会社までは多くの会社が使っています。

こちらはスカウトも来ますが、特に長期インターンの経験をしたい場合などにも結構使えます。

サポーターズ

イベントをたくさん開催してます。
企業が協賛しているケースが多く、そこから直接会社の人と話す機会が生まれやすいです。

技育Campハッカソンは毎月2回くらい?やっているので、ガッと作品を作り上げるきっかけとしておすすめです。

あとは逆求人イベントから就職決まってる人結構見ます。

リファラル

ぶっちゃけこれも大切です。
先輩とかOBの人に相談したら、ぬるっとインターン行けちゃったり選考スキップがあったりします。

が、過信は禁物です。普通にその会社の求める人材じゃなきゃ落ちます。

インターン

会社を選ぶ基準としても、技術的レベルアップとしても、インターンに行けたら一番良いと思います。

やはり、自分の目で実際の業務を見れますし、働いている人の生の声を聞けるのは、会社を選ぶ上で一番参考になりました。

また、インターンの選考に通っている時点で、一定の基準を超えているし、企業とのマッチ度もある程度高い可能性があるのが確認できます。

インターンから早期選考に進むケースもありますし、普通の選考でもインターンでの経験をもとに話が進むことがあります。

おすすめは長期インターンです。

技術力はめちゃくちゃ向上するし、学生のうちに社会人として働く非常に貴重な機会です。 特にその会社で使用しているライブラリや設計思想などを浴びるように体験できるのは自分自身のレベルアップに繋がったと思います。

学生という身分をフルに使って、面白そうな会社を転々として見てまわることもできます。
可能なら色んな業界を見て回るとエンジニアの人たちの傾向が見えてきて、自分にとって居心地のいい業界がどこか分かってきたりします。

スタートアップなら自分からサービス自体を良くするために動きやすく、すぐに自分の成果が出来上がるので超おすすめです。普通に楽しいですし、就活で話せるネタがいくつも出来上がります。

ES

面接時にESベースで話が進むことがあるのでかなり重要です。

文字数制限がないのであれば、今までの経験をなるべく多く書いたほうがいいと思います。大した経験じゃないし、書かなくていいやはもったいないです。

また、書いたESはどこかに保存しておいた方がいいです。使い回せる部分はたくさんありますし、ブラッシュアップしていって、より良い内容にしていけます。

ポートフォリオ

ポートフォリオはあったほうがいいです。特にゲーム系。

エンジニアは手を動かせることをアピールしないと適正ないと判断されかねないです。期間とか規模とか気にせずに全部書いちゃっていいと思います。

成果物が現時点でない人はハッカソンやUnity1week、ゲームジャムなどに参加して一週間くらいで話せる話題ができるのでおすすめです。

Githubの草もアピールになります。contributions数が多いだけで褒められたりしました。

志望理由

なるべく就活の軸の内容中心に具体的に書くように心がけていました。

  • こういう技術に興味があって御社のこの技術に関わってみたい
  • 企業である以上最終的アウトプットであるサービスへの興味も言う
  • その企業の欲しそうなマインドがあること

らへんを文字数に合わせて書いた気がします。

面接

ここまで書いてきたことを考えていれば、話す話題であまり苦労しないと思います。

ただ、正直慣れていないと急に来る質問にテンパってしまって、うまく答えられないこともあると思うので、練習は必要だと思います。インターンの面接なども含めれば、何度も本番の面接を経験できると思うので、ひとまず受けてみるでもいいと思います。

何度も面接していると気づくのは、割とどこの企業も同じようなことを聞かれた気がします。切り口は違うときがありますが、特にエンジニアは作ったものについて詳しく語れれば、あんまり回答に困らない気はします。

注意点としては何もプラスにならないのでネガティブな話はしない方がいいと思います(自分には技術力がないとか)。
ですが、失敗を受けてどう対応したかみたいな話はむしろいいと思うので話していいと思います。

ちなみに、話せる話題がしょぼいからといって盛りすぎるのはやめた方がいいです。相手は人を見るプロなので、嘘は見破られます。自分ではしょぼいと思うことでも案外よく考えてみると学びがあったりするので、それを詳しく深堀って話せるようにすればよいと思います。

力を入れた作品(ガクチカ)

ガクチカとはよく聞きますが、エンジニアはできれば開発エピソードがいいです。

というのも、その開発プロジェクトをベースに深堀りされがちです。

よく聞かれたこととしては

  • どんなプロジェクトか
  • チームでどんな役割をしたか
  • こだわりはなにか
  • 大変だったことはなにか
  • 結果はどうだったのか
  • 何を学んだのか

さらにエンジニア面接のときは

  • 技術的に何を使用したか
  • その技術選定の理由
  • どこに苦労したか
  • エンジニアとしての作品へのこだわり

ちなみにハッカソンやインターンの数は重要ではありませんし、聞かれません。 重要なのはハッカソンやインターンでのエピソードなので。

ただ、数が多いとその分、過去の事例を踏まえてより良い結果につながるし、技術力は上がります。

就活の軸

これもテンプレ質問でした。
これの回答も正解はないです。単純にその軸が受けた会社とズレてなければ問題ないと思います。
また、軸は3つくらいなら言っていいと思います。(むしろそれくらい持ってないと絞れないし)

僕は技術的な軸、サービス的な軸、社風的な軸という3つを考えて会社を選んでいました。

注意することとしては、どの会社にも当てはまるようなことを言うのはやめたほうがいいと思います。

福利厚生がいいとか、成長できるとか、裁量権がでかいとか、社風がいいとか

志望理由

ここをどの段階の面接で聞くかは会社によって違いました。
最初に聞くとこもあれば、最後に聞くとこもありました。

ES同様、なるべく具体的な話をするように意識していました。

生い立ち

志望動機や好きな技術とかの話をするときに、一貫したストーリーがあると説得力を持たせやすいです。

小さい頃にこういうことがあって興味が湧いて、今までこういうことをやってきて、これからこういうことをやっていきたい、みたいな。

キャリアプラン

将来的になにをやって、どのような人生を歩みたいかはよく聞かれました。

その話の中で、その会社でどういうムーブをして、どういうポジションにつきたいかなど明確に言うようにしていました。

逆質問

ここで評価左右されることはあんまない気はしますが、自分は御社に興味ありますよという意思を示すという意味で適当な質問1,2個あればいいと思います。普通に自分が興味あることを聞いてました。

事前に軽く用意していきますが、面接で聞いたことベースにその場で質問考えたりもしました。

結果

本選考は内定3社、選考中辞退2社(役員面接前)、一次面接お祈り1社でした。
ESで落ちることは一度もありませんでした。

2026年からはサイバーエージェントでゲームクライアントエンジニアとして働きます!!

まとめ

最後にもう一度書きますが、就活は色んな戦略があるため、ここに書いたものを完全に鵜呑みにすることはしないでください。ぜひ、先輩を頼ったり、他の人の体験記を読んだりしてください。実際に提出したESや面接の内容を教えてくれるかもです。(僕も後輩には実際のものを見せてます)

人それぞれ向き不向き好き嫌いがあり、それがうまいこと会社の求めることに合致したら通るという話なので、落ちたからといって自分を否定されたかのように落ち込むことはないです。技術力が偉いとか、リーダーだから偉いとかないです。

特にエンジニアは売り手市場なので就職に困ることは少ないかもですが、正直適正という意味で人を選ぶ職業です。未経験でエンジニアとかありますが、お金目的だけは辛いだけなのでやめた方が良いです。

最終的にその人も会社も双方納得感があれば縁があると思います。

と、長ったらしく書いてきましたが、自分はまだ社会人にもなっていない学生です。

何も社会を知らない若造が言っているだけなので、ここに書いた意見は社会に出たら変わるかもしれないです。

ですが、現時点までで自分が長い間考えたことを吐き出したので、誰かの参考になれば嬉しいです。

また、自分を応援してくれた方々、色々教えてくださった方々ありがとうございました。 これからもお会いする機会あると思うので今後ともよろしくお願いします。

追記:
この内容は人事の方の許可を頂いて公開しています。

2024年の振り返りと2025年の抱負

はじめに

どうも、土鍋です。

今年も終わってしまうということで、2024年を振り返っていきます。

2024年振り返り

1月

さすがに卒論発表に向けて卒論を書いてた記憶です。

あとは1/1から日報を始めたんですが、確か3ヶ月坊主になりましたね…うーんこういう毎日続ける系は続けられない…

ETLTC2024登壇

一応国際学会ですが、会津大開催なのであんまり国際学会感はなかったですね~。

ただ、英語発表で、英語圏の人が半分以上なのでそこは新鮮でしたね。

あとうちの教授はライブデモが好きなんで発表の中で写真みたいにQuest3被ってデモしましたね。

2月

卒論発表

卒論発表もライブデモしました。

九州一周旅行

これの旅行記書こう書こうと思って書くの忘れてました。うーん今からでも書こうかな。

合計すると2/21から3/2まで移動しまくった旅行でした。しかも出発日の前日まで卒論発表だし。家族旅行・一人旅・友達と旅行の合体旅行だし。なかなかやばい。

いくつか写真をば。

é•·å´Ž

別府温泉

高千穂

桜島

門司港

3月

この月は怒涛の一ヶ月でした。 ハッカソン2つと並行してインターンにも行ってたらしいですね… プラスでつくばへの引っ越しもあったのでだいぶやばかったですね。

Iwaken Labの3周年パーティー、大LT祭もありましたね。

WithAR 最優秀賞・TRAINS賞

3/2に旅行から帰ってきた次の日の3/3にキックオフでした。やばすぎ。 唯一?の事前ではなく会場で組んだチームでしたが、それぞれの得意分野があったので、たった1週間にも関わらずかなりクオリティの高い作品になりました。

結果、最優秀賞とTRAINS賞を頂けました!

youtu.be

自分がスーツなのは、結婚式に出席してからそのまま直行できたからですw

AtelierVision 出場

個人的に一番XRゲームらしい体験が作れたな~という作品がここで爆誕しました。

Quest3の部屋の認識を使って天井をバーチャル空間と接続して巨人が攻めてくるという作品です。

youtu.be

商業誌共著

これは2023年の技術書典の内容が商業誌としてて出版された感じです。 初めての商業誌デビューめちゃくちゃ嬉しかったですね。
自分の名前がAmazonにある!(本名ではなく土鍋で)

会津大学卒業

4年間いた会津の地を離れました。

会津での4年間はまさに今の自分を作り上げたルーツの一つなので第二の故郷です。

土地としても魅力的な場所なのでちょくちょく旅行しに行きたいな。

4月

筑波大学大学院入学

新天地。会津大は単科大学なんで、いる人間も少ないし小さいけど、さすが総合大学、でかい・人多い。

といっても、大学院生は研究室といくつかの授業の教室しかいかないのであんまり関わりないんですけどね。

サークルも入ろうと思ったけど結局大学院生からでも入りやすそうなとこがなくて入らなかったですね(開発系少ない)

技育Campハッカソン vol.4 最優秀賞

イワケンラボメンバーで挑戦。

VR vs ARコンセプト第二弾。 VR側は3D都市モデルが眼下に広がる。AR側プレイヤーの位置情報が都市モデル上に表示される。そのプレイヤーに向かってユニットを配置して戦う。 AR側はGeoSpatialを使用して位置情報に基づいたAR。配置されたユニットが表示されるのでそれを倒す必要がある。

youtu.be

結果は最優秀賞!

だったんですが、限界開発後だったので力尽きて優勝した瞬間に立ち会えなかったという…

LodgeXRTalk展示

「Scramble Battle」を展示。

5月

Iwaken Lab BBQ会楽しかった。あれだけVision Proが集まるBBQ会は初なんじゃないですかね?日本での発売もまだだったので。

あとは夏インターンに向けたESとかにも結構時間取られた記憶。就活って時間と精神を地味に持ってかれる。

6月

研究と就活と後述のenXrossハッカソンに向けた開発をしてました。

7月

enXross ハッカソン 2nd 出場

東京ドーム主催のハッカソンということとウルトラマンというビッグIPを使用できる、貴重な機会!ということでイワケンラボからは3チームも結成し、参加しました。

僕自身、ウルトラマンめっちゃ好きだったで、ウルトラマンや怪獣の3Dモデルを眺めるだけで最高でした。

人間からウルトラマンに変身するのをARからVR&3D都市モデルにシームレスに繋ぐことで表現しました。
ウルトラマン好きに刺さる表現を詰め込みました。

技育博展示

技育Campハッカソンで最優秀賞だったので「Xpolis」を展示することができました!

8月

サイバーエージェント 長期インターン

8月と10月にピグ事業部でインターンさせていただきました。

内容は新規事業のアプリ開発なのであまり話せないですが、実際の業務に入らせてもらって開発に関われたのは非常にいい経験になりました。

別職種の人とやり取りがあったり、デバッグしたり、パフォーマンスのことを考えたり、普通の個人開発では経験できないことを経験できました。

Cygames 夏季インターン

一週間のインターンで課題をこなしていく感じの内容でした。

詳しい内容は話しちゃだめらしいので書けないですが、普段0→1をやってるので課題をこなすのは新鮮で勉強になりました。

9月

ゼミ合宿

インターンとインターンの合間にゼミ合宿にも行きました。しかもゼミ係だったので、運営もやりました。

場所は裏磐梯。つまりめっちゃ会津の近くですね。合宿で使えるホテル探しをしててなかなか大人数泊まれる宿が見つからず、じゃあ会津周辺どうだろう?と思って探したら予約できた!って感じですね。裏磐梯は会津いたときも二回くらいしか行ってないので楽しかったです。

ソニー 夏季インターン

憧れのソニーでインターンできて嬉しかったです!

ただインターン内容に関しては一切口外できないのでここには書けませんが、非常に貴重な経験をさせてもらいました!

バーチャルリアリティ学会大会ポスター発表

ソニーインターンの合間に無理言ってスケジュール調整してもらい学会発表もしてきました。

IwakenLab開発合宿2024

技育Campハッカソンで受賞したXpolisを継続開発しようと思って集まったチームA。

…だったのですが、GeoSpatial周りとQuest3周りのライブラリが競合してバグが発生しまくり、ビルドもできない。

必死に色々試したのですが、僕以外がその部分を把握していなかったので自分しか進める事ができない。チームメンバーもやることがないので、もふるねくんはジョジョのアプリの開発。ソラシドくんはバイトのモデリングをしていました。

もはやこのままじゃブラッシュアップどころではない…

それどころか、せっかくの開発合宿なのにチームメンバーが楽しめないのはもっと駄目だ。

発表18時間前、もふるねくんに言いました。

「もうチームAを解体して、チームJにするか!もふるねくんのアプリに乗っからさせてほしい。」

↓そのときのDiscord

そうして誕生したチームA改めチームJは残りの18時間、ほとんど寝ずに開発して、「オラオラッシュ」を完成させました。

承太郎のオラオラを楽しんで体験できるように「オラオラ」のみにフォーカスして、ホームランバット的にオラオラしてぶっ飛ばすというシンプルなゲームを開発しました。

その結果、アニー賞、展示しま賞、サイバーエージェントXR研究所賞の3つをいただくことができました。

18時間という短時間での開発ということで、余計な要素を削ってオラオラだけを極めたので、結果的にシンプルで誰でも楽しめるものになった点が評価されたと思います。

あとはもふるねくんのジョジョ愛溢れるプレゼンですね!

youtu.be

10月

サイバーエージェント インターンを引き続き週3くらいでやっていました。

島根展示

これもなかなかいかれた移動しました。 前日に後輩たちの作品を見るために会津大の学祭に行ってました。

そこから会津→大宮まで電車と新幹線。大宮→大阪、高速バス8時間。大阪→島根、高速バス5時間。という。

いや、お金ケチった結果だけど、さすがに高速バス半日以上は疲れました。

そんな限界状態でLTと展示してきました。

11月

技育展 決勝進出

開発合宿で作ったオラオラッシュを出してみたら?という提案があって↓

出したところ、一回戦二回戦をトントン拍子で突破!

プレゼンはもふるねくんに完全に任せていたので、流石すぎる。やっぱ熱い思いを持っていると応援されるなあというのを感じた。

決勝戦はTokyoNodeのでかいステージ!

もふるねくんはプレゼンなので、オラオラを担当しました。

コスプレもして、大声で「ザ・ワールド!!」と叫びましたね~。

賞は取れなかったけど、記憶には残る発表になったのではないかなーと思います。

HackU 最優秀賞

研究室メンバーがハッカソン参加したことない&みんなの就活で話せるネタにもなるということで参加。

研究室メンバーの得意領域(機械学習・XR)を組み合わせたのは、普段やらない経験で楽しかったですね~。

仮想空間と現実空間を組み合わせた新たなる脱出ゲーム「ITF」
ゲームマスターによって閉じ込められた仮想空間で出題される問題を、現実世界の物体を駆使して解き進み、現実世界に帰還を目指せ

youtu.be

IwakenLab Tech Conference 2024

イワケンラボ初のテックカンファレンス!

にー兄さんとの雑談でイワケンラボでもギークなイベントしたいよねということで開催決定しました。

テックカンファあるあるが詰め込まれていてめっちゃいいイベントになりました。運営やデザイン班の方々ありがとうございました。

来年も開催したいっすねえ。

アーカイブ↓

www.youtube.com

かっこいいHP↓

iwakenlab-tech-conference-24.studio.site

#30_days_unity_blog

ハッカソン2つ、カンファもあるという中で、なぜか毎日Unityブログ書くぞチャレンジを始めてしまいました。なぜでしょうねえ?

逆に開発毎日やる必要があったので自動的に記事テーマが増えていくというのはありました。

修羅でしたが、なんとか駆け抜けることができました。

加えて、ブログの総閲覧数も10000を超えました!嬉しい!

しかもその後の平均閲覧数もだいぶ伸びてるので2万に行くのはだいぶ早そう。

12月

常陸Frogs LeapDay2024 展示

いっちーさんの紹介で展示してきました。

XRKaigi 登壇

ついに登壇側になれた!!めちゃくちゃ嬉しかったです。このXRの祭典で登壇側に立てるという喜びでいっぱいでした。

今度は単独登壇や展示側になりたいですね…精進します。

↓さきやまさん撮影のそれっぽく手を上げてる写真

プロトスプリントリーグ

サイバーエージェントのゲームクライアント3dayインターンに行きました。

成長するブラックホールからひたすら逃げるゲームを作りました。

惑星の重力を使って加速したり、パーツを拾ってカスタマイズして、ブラックホールから逃げ切ろう!という感じ。

5人エンジニアがいてタスクを振るのが難しかったのですが、MVPパターンをアウトゲームで導入し、かつ、その設計思想とUniRxの使い方をレクチャーして、スムーズに進めようとしました。 その甲斐もあって優勝はできなかったのですが個人賞をいただくことができました!

反省としては、コア機能が複雑かつ絞りきれない状態で進めてしまったため、最終的なゲームバランスを整える段階まで行けなかったのが、よくなかったなと思います。

チームとしては雰囲気も良くてコミュニケーションもしっかり全員でできたし、誰かが暇になることもなかったので、だいぶ良かったと思います。

内定獲得

書いていませんが、これらの活動の合間に就活も進めていました。

年内に内定を獲得できたので、めちゃくちゃ安心しました。

就活体験記は完全に終わったら出します。

まとめと抱負

卒業、入学、研究、ハッカソン、展示、就活…と今年は今までの人生で一番濃厚な一年でした。
個人として技術的に成長できましたし、関わった作品が最優秀賞を3つ取るなど結果を得ることもできました。 自分から飛び込むことも多いですが、面白そうな話が舞い込んでくることも増えて、幸せものです。

来年は何やっていこうか…
修論もあるので研究しっかりやって、学会(できたら国際学会)にも出せる程度の成果は出せたらいいなあという気持ち。
とは言っても面白いことも舞い込んでくるでしょうから、それには挑戦していきたいです。両立…がんばりたい…

あとは自由な時間があるのはもう最後だと思うので、個人でひとつ作品作って販売なり公開なりしたいな。社会人になったらそんな余裕なくなりそうだし。

来年は学生でいられる最後の一年。
長かった学生生活がついに終わってしまうので、後悔がないように生きていきたいです。

今年もたくさんの方々にお世話になりました。来年もよろしくお願いいたします!

書き初め

※2025/1/7 追記

イワケンラボで書き初め会をしたのですが、そのときに改めて今年の抱負を短い言葉で考え直しました。

今年の抱負は「代表作」を作る!

「貫徹」「完遂」など力を入れてやりきりたい的なものを考えていたのですが、何にでも適用できる言葉過ぎて逃げれちゃうよね、ということで「代表作」になりました。

自分といえばこれ!という作品を作れるように頑張ります!

【AndroidXR】UnityでAndroidXRアプリを作る準備

はじめに

どうも、土鍋です。

この記事はIwakenLab. Advent Calendar 2024の22日目の記事です。

昨日はもふるねくんの HaritoraXを使用してUnityでフルトラをアバターに反映させる方法(一人称視点対応) でした!
明日はにっしさんレーザー加工機を使ったものづくりのすすめです!

今月発表されたAndroidXRのアプリケーションをUnityで作るためのプロジェクトの設定方法を解説します。

エミュレーターの起動方法も記事を書いているのでご覧ください。

donabenabe.hatenablog.com

Unity OpenXR Android XR

AndroidXRはOpenXRをベースに構築されているので、OpenXR PluginやXR Interaction ToolkitやXR Handsのパッケージをそのまま活用して開発できます。

プラスでUnity OpenXR Android XRのパッケージを使用することで、AndroidXR固有の機能も利用できるようになります。

インポート

「Install package from git URL」で「com.unity.xr.androidxr-openxr」を追加

XR Plug-in Management

Edit > Project Settings > XR Plug-in Management を開き、

Plug-in ProvidersのOpenXRとAndroid XR Featureにチェックします。

OpenXRの設定

XR Plug-in Management > OpenXR を開き、

Enabled Interaction Profilesを開き、
コントローラーを使用する場合は Oculus Touch Controller Profile
アイトラッキングを使用する場合は Eye Gaze Interaction profile

を追加してください。

AndroidXRの設定は後述のExtensionsを使用しない場合はすべてにチェックして問題ありません。

Project Validation

Project Validationで残りのエラーなどを一括で解消できます。

Project Settings

Edit > Project Settings > Player > Other Settings を開き、

Graphics APIをValkanのみにします。

Minimum API Levelは32以上にします。

Application Entry Pointは[GameActivity] がオンになっていて、[Activity] がオフになっていることを確認します。

[Resizeable Activity] を有効であることを確認します。

URPの設定

プロジェクトで使用しているUniversal Render Pipeline Assetを開き、

Quality > HDR のチェックを外してください。

さらにUniversal Renderer Dataを開き、

Post-processing > Enabledのチェックを外す

シーンのセットアップ

HierarchyにXR Originを追加します。

MainCameraのEnvironmentから

  1. Background Typeã‚’SolidColor
  2. Backgroundは(0,0,0,0)

に設定することで現実世界を見えるようにします。

これで最低限のセットアップは完了です。

Android XR Extensions for Unity

Android XR Extensions for Unityは先ほど紹介したOpenXRベースのAndroidXRプラグインをさらに拡張できるパッケージです。

現状のOpenXRのみではカバーしきれないAndroidXR固有の機能を利用する場合は用いる必要がありそうです。

詳しい比較などは以下を参照してください。

developer.android.com

インポート

以下のGithubのReleaseからtgzファイルをダウンロードしてください。

github.com

「Install package from tarball...」でダウンロードしたtgzファイルをインポートします。

XR Plug-in Management

OpenXRのみにチェックをつけ、Project Validationでエラーを解消してください。

サンプル

公式のサンプルシーンがたくさんあるのでまずはこれを試していくと良いと思います。

例: Face Tracking

Face Trackingのサンプルが公式的には例にあげられていたのでこれをまずは使用すると良さそうです。

エミュレーターで試そうとした

Android Studioのエミュレーターで試したかったのですが、現状は対応して無いそう。

参考

docs.unity3d.com

developer.android.com

Android XRのEmulatorを起動する方法 & サンプルを試す

はじめに

どうも、土鍋です。

今回はつい先日(現地時間12/12)に発表されたAndroid XRベースのデバイス向けアプリケーション開発に向けて、Android StudioでのAndroid XRデバイスのEmulatorの起動の仕方とサンプルアプリを試し方を紹介します。

この記事の内容は以下の公式ドキュメントを参考に書きました。

developer.android.com

Android XRのEmulatorを起動する

Android Studioをインストールする

以下のリンクからAndroid Studioをダウンロードします。

developer.android.com

Canaryビルドをダウンロードしてください。(本当はCanary 5をインストールする必要があるのですがここからは現状できませんでした。)

インストーラーexeを起動して手順通りにインストールしてください。

Android Studioのアップデート

起動すると右下にCanary 5にUpdateできますという表示が出るので、アップデートしてください。もし、表示が消えてしまってもCheck for Upadatesで確認できます。

さらにアプデがあるのでこれもアプデしてください。

SDKのインストール

アプデが終わったら、SDK Managerを開いてください。

SDK Toolsでは以下のものをインストールしてください。

SDK Platformsに移動して、右下のShow Package Detailsのチェックボックスを押して、Android14のドロップダウンを開き、次のものにチェックを入れてください。

エミュレーターを起動する

新規でプロジェクトを作ろうとするとXRのテンプレートが使えるようになっているのでこれを使用します。

Minimum SDKはAPI 34(Android 14)を選択。

Device ManagerからAndroid Virtual Deviceを追加する。

XRの項目からXR Deviceを選択。

追加できたら、再生ボタンを押すことでエミュレーターが起動する

エミュレーターの操作

起動画面

起動するとホーム画面が開かれる。

WindowsだとAltキー押しながら画面ドラッグでカメラ向きを変更できます。

右のメニューからパススルーの切り替えもできる

開発者モードへの変更も通常のAndroidデバイス同様に、設定からBuild numberを7回押すと変更されます。

その他の操作方法はHelpから確認できます。

特にHome画面表示の Ctrl + H はよく使いそうです。

サンプルアプリ「Hello Android XR」

Google公式のサンプルを確認してみます。

以下のGithubからソースコードをダウンロードして、Android Studioで開いてください。

github.com

開いたアプリを実行するには、画面上の画像のようにXR Deviceを選択して実行します。

アプリを開くと画像のようになり、バーチャルキーボードなども動作していることが確認できました。

まとめ

ついにGoogleが一度投げ出したかのように思ったXRに舞い戻ってきたので、さっそく試しました。MetaはHorizon OSを売り込んでいきたい姿勢でしょうから、Googleの参入は相当嫌でしょうね…すでにAndroidXRは多くの企業に売り込んでいるようですし。

自分としてはビッグテックが次々にXRに参入してくれて、業界が加速する瞬間に立ち会っているようでめちゃくちゃワクワクしています。 XRエンジニアとして、どのプラットフォームの知見も追っていく所存です。

【MRUK最新版】MRUKで部屋の情報を取得し加工する【Quest3】

はじめに

どうも、土鍋です。

この記事はAizu Advent Calendar 2024の10日目の記事です。

一年前くらいに下の記事を書いたのですが、どうやら2024/5/16リリースのMeta XR SDK v65でだいぶ仕様が変わっていたので新しい記事を書きました。

donabenabe.hatenablog.com

Meta XR SimulatorでMR空間をシミュレーションする

プレイボタン左のボタンからSimulatorを有効化し、XR環境をシミュレーションできます。

毎回実環境でビルドしてテストするのは効率が悪いので、Synthetic Environment Serverからパススルーで見える現実空間をシミュレートできるようになります。

Tools Prefab

MRUKやそれに付随するツール群を使うことで部屋のデータにアクセスできます。

Prefab群は Packages > Meta MR Utility Kit > Core > Tools にあります。

Scene上にMRUK Prefabを追加するだけでScene API関連のものが勝手に動作します。 そのため特にこれから先の作業が必要ない場合(Raycastするなど)はこれだけで大丈夫です。

MR環境構築の具体的な内容は以下をご覧ください。

https://developers.meta.com/horizon/documentation/unity/unity-mr-utility-kit-gs?locale=ja_JP

AnchorPrefabSpawner

https://developers.meta.com/horizon/reference/mruk/v68/class_meta_x_r_m_r_utility_kit_anchor_prefab_spawner/?locale=ja_JP

AnchorPrefabSpawner Prefabを追加することで、部屋の壁や家具に対応して特定のPrefabを生成させることができるようになります。
これは前のバージョンでOVRSceneManagerとされてたものです。

Prefabs To Spawnで生成したいもののPrefabを設定できます。

デフォルトの状態そのままを実行すると下のように部屋のレイアウトに合わせてPrefabが生成されているのが確認できます。

RoomModel

RoomModel Prefabは基本的にはAnchorPrefabSpawner Prefabと一緒です。
適用されているPrefabが半透明なので現実空間が見やすいといった感じです。

Labelsを切り替えることでそのPrefabの適用先を変更できます。

EffectMesh

https://developers.meta.com/horizon/reference/mruk/v69/class_meta_x_r_m_r_utility_kit_effect_mesh

EffectMeshは特定のマテリアルやコライダーを指定したLabelに適用するものです。

GlobalMeshを可視化するにはLabelsにGlobalMeshを指定してあげることで見えるようになります。

Collidersのチャックボックスにチェックをいれるとメッシュにコライダーをつけることができます。

RoomGuardian

通常のQuestのガーディアンのように物理空間のガーディアンを表示できます。

参考

donabenabe.hatenablog.com

https://developers.meta.com/horizon/reference/mruk/v68/class_meta_x_r_m_r_utility_kit_anchor_prefab_spawner

https://developers.meta.com/horizon/reference/mruk/v69/class_meta_x_r_m_r_utility_kit_effect_mesh

https://developers.meta.com/horizon/downloads/package/meta-xr-mr-utility-kit-upm/65.0

UnityECSで都市開発シミュレーションゲームを作る【その4】~建物を建築する~

はじめに

どうも、土鍋です。

これは土鍋ひとり Advent Calendar 2024の2日目の記事です。

前回は土鍋さんの【ECS&DI】Unity ECSでVContainerによるDIをやってみる - 土鍋で雑多煮でした。

さて、ECSで都市開発シミュレーションゲームを作るシリーズ4回目はいよいよ建築できるようにしようと思います。
といっても、建物選んでInstantiateするだけですが、まーーECSの仕様がむずくって手こずりました。

建築物選択メニューUI

ECSとUI Toolkit

今回のゲーム開発ではなるべくUnityの新しい要素に触れるようにしようという思想の元、開発しているので、UIに関してもUI Toolkitを導入しました。

UIを構築する

建築したい建物を選ぶメニューをどうしようかな~と思ったんですが、やっぱグリッドビューが一番視認性がいいし情報量が多くていいかなと思い実装しました。
ただここで発生した問題がUI Toolkitにグリッドビューがないという問題でした。(uGUIにはあるのに!)

ということで自力で実装して別記事にまとめたので、ご覧ください。

donabenabe.hatenablog.com

ClickEventの設定

上記の記事でグリッドビューの作成とそれにDataをBindingするとこまで実装したので、プラスアルファでどの建物を選択したかの情報をPlayerStatusHolderに渡しています。

public class ConstructMenu : MonoBehaviour
{
    [SerializeField] 
    private VisualTreeAsset buildingElement; // グリッド要素テンプレート
    
    [SerializeField] 
    private BuildingList buildingList; // 追加したいUI要素のList保持ScriptableObject
    
    private void Start()
    {
        var root = GetComponent<UIDocument>().rootVisualElement;

        foreach (var building in buildingList.buildings)
        {
            var buildingTemplate = buildingElement.Instantiate(); // テンプレートの生成
            buildingTemplate.Q<VisualElement>("thumbnail").dataSource = building; // データのバインド
            root.Q<VisualElement>("Grid").contentContainer.Add(buildingTemplate); // グリッドに要素追加
            buildingTemplate.RegisterCallback<ClickEvent, BuildingData>(Clicked, building); // クリックイベントの登録
        }
    }

    private void Clicked(ClickEvent evt, BuildingData data)
    {
        Debug.Log("Click: " + data.buildingName);
        PlayerStatusHolder.I.NowSelectConstructBuildingID = data.buildingID; // PlayerStatusHolderにIDを渡す
    }
}

Raycastによる建物配置場所の決定

Entity情報の取得

通常の画面クリックからのRaycastではECSのEntity情報は取得できません。
そのため、ECS用物理シミュレーションパッケージのPhysicsを使います。
実装方法は別記事にまとめたのでこちらをご覧ください。

donabenabe.hatenablog.com

UI上ではRaycastをブロック

このRaycastはUI上も構わず貫通してRayを飛ばすので対策が必要になってきます。
これも別記事に書いたので、そちらを参照してください。

donabenabe.hatenablog.com

Entityの生成

さてここまででようやく建物選択と配置のためのRaycastが実装できたので、最後は建物のEntityを生成する必要があります。

PrefabのBake

建物のPrefabを作ったのは良いのですが、これはGameObjectなのでそのままECSでは使えません。

そのためBakeを行う必要があるのですが、ランタイムで生成時にBakeは行えません。
(自分はその手法を発見できなかったのでご存じの方いらっしゃいましたらご教授いただきたいです)

建物の種類すべてにBakeを行うために、適当なMonoBehaviorクラスにListなどで全Prefabを保持させて、再生時に一括Bakeさせました。

普通にGameObjectのListからGetEntityでEntityをAddしてやればいいだけかと思いきや
ArgumentException: srcEntity is not a valid entity
InvalidOperationException: Baking error: Attempt to add duplicate component
のようなエラーが出てしまい、苦労しましたが、以下の記事を参考にさせていただき、書き直したところなんとか動きました。

qiita.com

[System.Serializable]
public struct PrefabEntityComponent : IComponentData // 中身なし → Tag的扱い
{
}

public struct PrefabElement : IBufferElementData
{
    public Entity prefabEntity;
}
public class PrefabBaker : MonoBehaviour
{
    [SerializeField]
    private List<GameObject> prefabs;

    class Baker : Baker<PrefabBaker>
    {
        public override void Bake(PrefabBaker authoring)
        {
            var entity = GetEntity(TransformUsageFlags.Dynamic);
            var sample = new PrefabEntityComponent();
            var buffer = AddBuffer<PrefabElement>(entity);
            foreach (var prefab in authoring.prefabs)
            {
                buffer.Add(new PrefabElement
                {
                    prefabEntity = GetEntity(prefab, TransformUsageFlags.Dynamic)
                });
            }
            AddComponent(entity, sample);
        }
    }
}

画像のようにインスペクターからBakeしたいPrefabを指定してあげることで、そのPrefab群を自動的にBakeするようになりました。

Entityの生成

あとは以下のようなコードをクリック時に実行してあげればクリックした場所に生成されます。

if (physics.CastRay(input, out var hit))
{
    var name = this.EntityManager.GetName(hit.Entity);

    if (name == "Plane") // ここ名前でやってるのよくないので変えます
    {
        foreach (var buffer in SystemAPI.Query<DynamicBuffer<PrefabElement>>().WithAll<PrefabEntityComponent>())
        {
            for (int i = 0; i < buffer.Length; i++)
            {
                var entity = buffer[i].prefabEntity;
                if (PlayerStatusHolder.I.NowSelectConstructBuildingID == BuildingLookup[entity].BuildingID) 
                {
                    var buildingTransform = SystemAPI.GetComponentRW<LocalTransform>(entity);
                    buildingTransform.ValueRW.Position = new float3(hit.Position.x, hit.Position.y + buildingTransform.ValueRW.Scale/2, hit.Position.z); // 生成場所の決定
                    EntityManager.Instantiate(entity); // Entityの生成
                }
            }
        }
    }
}

完成

まとめ

MonoBehaviorなら簡単なこともかなり脳みそ使いますね…。
ただ、今回の実装でだいぶECSの気持ちが分かってきました。

参考

qiita.com

wgn-obs.shop-pro.jp

docs.unity3d.com

docs.unity3d.com

docs.unity3d.com

docs.unity3d.com

docs.unity3d.com

qiita.com

www.f-sp.com

www.f-sp.com

【ECS&DI】Unity ECSでVContainerによるDIをやってみる

はじめに

どうも、土鍋です。

これは土鍋ひとり Advent Calendar 2024の1日目の記事です。

現在、ECSでゲームを作ってみているのですが、そのプロジェクトでDIって導入できないのかなーと思い調べたところ、VContainerが対応してくれているようなので、やってみました。

DefaultWorldにおけるDI

テスト用コード

DIで扱えるようにするにはSystemBase継承でSystemを構築する必要があります。
ISystemでは。現状できないようです。(そもそもMonoBehaviorから扱えないので)

public partial class SystemA : SystemBase
{
    protected override void OnUpdate() { }

    public void TestMessage()
    {
        Debug.Log("SystemA");
    }
}
public partial class SystemB : SystemBase
{
    [Inject]
    private SystemA _systemA;
    
    protected override void OnUpdate()
    {
        if (_systemA == null) return;
        _systemA.TestMessage();
    }
}

通常時のDIと同様に[Inject]のAttributeをつけるだけでそこに流し込まれます。

LifetimeScope

LifetimeScopeもMonoBehaviorのときと同様、以下のように簡単に記述できます。

このLifetimeScopeはECS管理ではなくMonoBehaviorのGameObjectにアタッチしてください。

public class TestLifetimeScope : LifetimeScope
{
    protected override void Configure(IContainerBuilder builder)
    {
        builder.RegisterSystemFromDefaultWorld<SystemA>();
        builder.RegisterSystemFromDefaultWorld<SystemB>();
    }
}

上記は以下のように書き換えることができます。

builder.UseDefaultWorld(systems =>
{
    systems.Add<SystemA>();
    systems.Add<SystemB>();
});

CustomWorldにおけるDI

自分で作ったWorldに関してDIを行うこともできます。

これによってWorld自体もVContainerに管理させることができるようです。

テスト用コード

public partial class SystemC : SystemBase
{
    readonly ServiceA serviceA;
    
    public SystemC(ServiceA serviceA)
    {
        this.serviceA = serviceA;
    }
    
    protected override void OnUpdate()
    {
        serviceA.TestMessage();
    }
}
public class ServiceA
{
    public void TestMessage()
    {
        Debug.Log("ServiceA");
    }
}

このような通常のクラスをSystemに流すように扱うことももちろんできる。

LifetimeScope

以下のように記述することで、Worldの生成から登録まで行っています。

builder.RegisterNewWorld("MyWorld", Lifetime.Scoped);
        
builder.RegisterSystemIntoWorld<SystemC>("MyWorld");
        
builder.Register<ServiceA>(Lifetime.Singleton);

参考

vcontainer.hadashikick.jp

hadashia.hatenablog.com