Unityタイトルにある通り、たった1人の個人開発で約1年をかけ、ARでつながるSNS「Treadraw」を制作しました。その制作の話をしたいと思います。NetworkingFreeapps.apple.comTreadrawとは?「トレドロ」と読みます。ARを使って現実世界にお絵描きしたり、メッセージや画像などを置き、それらを空間ごとシェアすることができるSNSアプリです。お絵描きなどのAR物体は現実空間にずっと残すことができ、他の人も同じ場所で同様のAR体験を共有できます!現実空間にあなたの思い出の足跡を残すことができる新しいSNSなのです!動画はこちら↓Treadrawの名前の由来は?treadとdrawの二つの英単語を組み合わせた造語を作品名にしました。treadには踏むや足取りなどの意味があり、drawには描くといった意味があります。思い出という足跡を描き残すという、このアプリのコンセプトを名前にしました。アイコンもそのような思いを込めたものを作成しました。作った理由ときっかけSFアニメなどで登場するホログラムなどの技術が研究開発されたりしていますが、この技術は将来的に街に溶け込むと思っています。ホログラムの時代が来る前にARによる疑似的な表現がなされる時代が来ると思っています。オーディナルスケール」のような世界です。↓オーグマーと呼ばれるデバイスを装着することで、バトルシーンでは街の建物がゲームの世界観に合わせた見た目になっています。このような街全体を対象としたARを現実的に実現する場合、ARCloudのような技術が必要になります(ARCloudの説明は割愛、興味ある方はリンクを見てください)。世界中の場所を網羅したARCloudデータはありませんし、僕の知らないところで存在していたとしても、今の時代において個人に貸してもらえるとは到底思えません。いった世界を実現してみたいと思っていましたが、まだ無理かな~と思っていました。そんな中約1年前、AppleのARKitの機能の一つのARWorldMapを知り、ARデータ(カメラが捉えた点群データ)を端末内に保存し復元できることを知りました。ARCloudのようなデータがなければ、各ユーザに点群データを集めてもらえば良いのではないか?ARWolrdMapの機能を応用することで、↑のようなことに挑戦しようと思い制作したのがTreadrawです。コンテンツに落とし込む私はせっかくやるなら、作品にしたいと思いました。できたものをTwitterで言うだけ、ブログに書くだけ、デモシステムの作成などではなく、作品として世の中に発信し、新しい価値観に触れてもらいたいと。考えた結果、自分はクラウド技術を使ったシステム制作の経験もあるため、その経験を活かせるSNSの作品とすることで、空間を「投稿」としてシェアする作品にしました。InstagramのARバージョンといったような感じをイメージしてました。ARWorldMapはARCloudなどと違い、現実世界の一部分しか捉えることができない欠点があります。「投稿」という形態とGPSを併用し、「現実空間の中でARオブジェクトを探す」ことで乗り換えました。来た人は空間もシェアし、時間を超えた体験の共有ができる新しい作品に落とし込むことができました。ARKit、Django前述したAppleのARKitの機能のARWorldMapを使用するので、UnityでiPhoneアプリとして制作しました。SNSなので当然、バックエンドが必要ですが個人開発なので、開発コスト(費用も)を考え、firebaseを利用しました。全体のシステム構成は↓のような感じですこのアプリのコアである、AR空間の共有(SNSシェア)↓のような感じです端末内に保存されているARWorldMapデータを取り出して、データベースに保存しています。Storage上のARデータを一緒に管理することで、投稿位置情報に基づいた空間体験共有を実現しています。約1年の制作で学んだ、長期制作の辛さ・苦労点ライブラリのバージョン変更やバグ完成したものでは、約10個近くのライブラリを使用させていただいております。それらのライブラリもアップデートが起こります。これは、ライブラリが開発者様によってメンテナンスされているので非常にありがたいことなのですが、Unityで使用するライブラリは一部手動で差し替えなければいけません。バグが発生し解決されるまで時間がかかることがあります(メンテナンスされていないライブラリだったら自分でデバックするしかない...泣)最も痛手だったのは、UnityでARKitを使うためのプラグインが制作中に非推奨になってしまったことです。Foundationの使用を推奨されました。́;ω;`)プラグインがバグってるから公式のを見に言ったらえぐいことが書いてあった。2019Unityアップデートでのバグ発生Unityのアップデートによってバグが発生することもありました。そもそも、制作中のものなのにUnityのバージョンを変更するべきではないというのは当然だと思うのですが、使用しているライブラリのアップデートによってUnityのバージョンを変更しなければならなくなりました。FoundationもUnityアップデートの一例です。大規模ネットワークデータへの対応これは僕の能力が劣っているだけかもしれませんが、SNSのデータをどのように管理するかに悩まされました。多くの人が利用しかつお互いのデータを共有するため、システム実装面とセキュリティ面を同時に考慮する必要がありました。将来的に機能を追加する場合でも問題ないかなど非常に神経質に考える必要があり、苦労しました。技術の進歩は日進月歩、というのは本当だと思います。長期の制作をしていると、新しい技術や流行が作られたり遷移したりします。Anchorsが発表され、iOS、アンドロイド、HoloLensとプラットフォームに依存しない点群データ共有のサービスが発表されました。これにより、自分の制作物が受け入れられるのかという不安になりました。U-22プログラミングコンテスト2019に応募してみた制作中にβ版ぐらいのものができたときに、他人がどう思っているのかを聞きたかったので、U-22プログラミングコンテスト2019に応募しました。審査員の方からのコメントは、お褒めの言葉から自分では気づかない着眼点のアドバイスなど、非常にありがたいお言葉をいただきました。リリース中のものは最低限の機能のみだと思っています。自分の中で拡大させたいユースケース案や追加機能を考えているので、これからもっとTreadrawを進化させていきたいと思います!!Treadrawのこれからの進化を楽しみにしていただけたら幸いです。10:391人で1年かけて、ARでつながる新時代SNS「Treadraw」をつくったTweet広告を非表示にするもっと読むコメントを書く2019-11-11チームラボのインターンに行ってきた(インタラクティブチーム)インターン2019/09/02~2019/09/13の2週間、チームラボ株式会社のサマーインターンに参加させていただきました。そのインターンでのことをまとめたいと思います。チームラボ株式会社とはチームラボは、メディアアートやweb開発、モバイル開発など様々な制作・開発を行なっている会社です。チームラボ」というように、様々な分野のスペシャリストの方がいらっしゃるようです。インターンで参加できるコースも12コースほどあり、私はインタラクティブチームに参加させていただきました。チームラボとの出会いチームラボの名前を知ったきっかけは、2年前参加したVRの国際コンテスト(IVRC2017)に出場した時でした。このコンテストにチームラボが協賛しており、自分の作品を社員の方が体験していただけたことがきっかけです。自分は高校生のころ映像制作などの芸術と技術が融合したものを作りたいと思って今の大学に入学したので、チームラボが制作しているメディアアート作品をwebで見たときは「まさに自分が追い求めているもの」と非常に驚いたのを覚えています。インタラクティブチームインタラクティブチームは、このメディアアートなどを制作しているチームです。Borderlessのビジュアル部分を制作しているのも、このチームです。インターン応募インターンの選考は、エントリーシートによる書類選考後、面接でした。面接は、参加希望するコースの現場エンジニアの方とお話したので、技術話で盛り上がりました。会社自体や利用している技術に興味があり、現場を見たい将来の就職先として考えていると大きく2つです。他に参加したインターンの大体は前者なのですが、チームラボは両方の動機がありました。してもインターンに行ってみたかったのです。(実は、今回インターンに参加する前に2回応募しているのですが、2回とも書類選考で落とされています...笑)インターンの内容インターンでの内容は初日の日にメンターの社員さんと相談して決めました。何か作りたいものがあるか、何をしてみたいかなどを話し合い、2週間で制作するものを決めました。僕の場合、インターンの間にやりたいと思っていたこととして、「シェーダーを使えるようになる!」と言うことを考えていました。シェーダーで何を作りたいかがその場で思い浮かばなかったので、開発中のARペイントアプリでも使えそうな、「自作のブラシエフェクトを作ろう!」となりました。Brush」とかでは、アニメーションをするブラシが少ないと言うことだったので、アニメーションするブラシもできたらいいよねとなりました。最終的に、「アニメーションブラシエフェクトに凝ったVRペイント」を作ることにしました。今回のインターンの期間に大きく分けて3つのブラシを作成できました。最終的な作品がこちら↓ソースコードはこちらインターンで作ったものを自分の成果物にしていいよとのことだったので、GitHubでソースコードは公開しています。最終日には、インターン生が2週間の成果を発表する機会があったので、その時に発表もしました。開発中はほとんど見た目のディテールにこだわることをしており、ブラシの線の太さやペイントスピードなどが変わっても、見た目のディテールに影響しないように調整するのが大変でした。世界中から高い評価を受けるアートを作っている会社であるだけに、豊富な技術力やノウハウを持っていることを実感しました。実装方法に悩んだり勉強したいことがあれば、サンプルプログラムを見せてもらえたり、オススメの本を教えてもらえたりしました。週一で短い時間ですが、インタラクティブチームの勉強会があったり、今やっている仕事の内容や工夫点を共有していたりと、ありとあらゆる場面で学ぶことができる環境だったと思います。2019チームラボのインターン生としての感想インタラクティブチームではなくチームラボのインターン生としても非常に楽しい働ける環境でした!初日と最終日にはインターン生全員と社員さんで懇談会があり、他のインターン生や社員さんと話すことで刺激が多いです。自分の知らない分野の技術話を聞いたり、チームラボ働いてみてどうかとかなど多くのことを話せました。一方で自分の技術話も理解してもらえて通用するのも非常に嬉しかったです。2019採用チームの方とランチする機会があった時に、前述したIVRCの話ができたのも記憶に残っています。今年のIVRC予選が、インターン期間中チームラボオフィスの近くで開催されたこともあり、自分が出場した時の話もできました。学生が企画・制作したVR作品を競う大会に協賛しています。決勝へ進む作品(https://t.co/ckq1VDimdS)は果たして!?我々は13日に参戦予定です。通年でアルバイトを募集しています。2019インターンの待遇チームラボのインターンはインターンの経験だけでなく、待遇も非常に素晴らしくありがたいものでした。インターン期間中は時給1000円が発生しており、お給料がもらえます。(他のチームは実務やってるとこもあるけど、インタラクティブチームは実務してないのに....。感謝感激😂)また、交通費、宿泊費も全額支給してもらえます。宿泊に関しては、インターン開始前日から最終日翌日まで、オフィスまで徒歩10分のホテルをチームラボ側で予約していただけました。そのため、初日の朝早くや最終日の深夜に新幹線に乗ることもなく、初日前日にゆっくり行ったり、最終日翌日に観光したりもできました。Borderlessの見学会もありました。様々な人と出会い交流しつつも、自分の専門を深め非常に多くのことを吸収できる環境が整っていると思いました。何より、自由に好きなことで働けるということが実感しました。AI前回、概念から数学的なことも含めてGANについて説明しました。今回はCycleGANにフォーカスを当てます。CycleGANの論文よりCycleGANとは画像から画像への変換が可能なGANの一種です。いった画像to画像の変換にはpix2pixのように、データセット画像がペアになっているのが普通です。「入力画像に対して画像変換を行うとこういう画像になる」という風に、入力画像群と変換目標画像群をペアにして与えます。下の画像のようなペアではないものでも、CycleGANは画像間のスタイル変換が行えます。上の画像のように現実的にペアの画像を用意することが難しいものが対象でも画像変換が可能です。(馬とシマウマを全く同じ構図、背景、姿勢で写真を取るのはほぼ無理ですよね?)工夫点ペアの画像の場合は入力画像と変換目標の画像間のピクセルごとの差分を利用する(MSEやMAE)などで、学習を進めることができます。今回はペアでないものを対象とするための工夫がなされています。F)を用意し、Gで変換したものをFで変換した時に、元の画像に戻るかという設計です。ドメインXの画像群の画像xをGによってドメインYの画像群のような画像y^に変換。(数学的にいうと、X→Yの写像GとY→Xの写像Fがあり、Xの画像xを入力した時、x-F(G(x))の値を小さくする、ということ)。以下のようになっています。Lossがどれかというと、上式の3項目です。L1ノルムなので、ただピクセル間の差分を見ているだけですね。2項目は以下のようになっています。GeneratorがDiscriminatorを騙せたかどうかということです。Lossと同じなので、説明は割愛します。Lossの割合を決めるハイパーパラメータで、論文の実装では10で実装したとなっています。実装してみたてことで、内容は理解したのでChainerを使って実装してみました。実装したコードはこちら。データセットは公開されているものの2つ(馬↔︎シマウマ、りんご↔︎みかん)と、オリジナルで作成したものを利用しました。オリジナルは、ポケモンのモンスターボール↔︎マスターボールの変換です。google-imagedownloadを使って、Google画像検索で出てくる画像を使いました。馬↔︎シマウマりんご↔︎みかんモンスターボール↔︎マスターボールモンスターボール↔︎マスターボールでいい感じのやつを集めてみました↓。左上がMマークが作成されてるので、ちょっとびっくりしました。感想ペアデータなしでここまでの画像変換ができるのは、かなり感動です。論文の画像を見る限りではもう少しクオリティが高そうだったので調べると、今回実装したコードは学習安定化のテクニックを入れていなかったので、それが原因かなと思います。GAN)を使うことになったので、いろいろ勉強しました。備忘録として勉強したことをまとめておきたいと思います。これから、GANを勉強する方の参考にでもなればと思います。Network(日本語では、敵対的生成ネットワーク)と呼ばれるディープラーニングを用いた生成モデルの一種です。GeneratorとDiscriminatorという二つのニューラルネットから構成されており、二つを敵対させながら学習を進めることで、高精度なデータを生成することができるようになります。説明される例を挙げると、偽札屋と警察の関係に似ています。偽札屋(=Generator)は警察(=Discriminator)が本物と誤判別する偽札を作る。警察は、与えられたお札が本物の紙幣なのか、偽札なのかを見分けられるように学習する。警察の判別能力が向上すると、偽札屋はより本物そっくりな偽札を作らなければならず、偽札屋が本物そっくりな偽札を作れるようになると、警察はより高度な判別能力が必要となります。これを繰り返すと、偽札屋は徐々により高度で本物そっくりな偽札を作る方法を学ぶことができます。このように、GeneratorはDiscriminatorを騙せるように、Discriminatorは与えられたデータが本物か偽物かを正しく見分けられるようにとお互いが敵対することで、最終的にGeneratorが本物そっくりな高精度なデータを生成できるようになるというのがGANの考え方です。上図がGANの概念図です。潜在変数(VAEなどを勉強すればわかりやすいが、ここでは乱数と思ってOK)をGeneratorに入力し、偽物データを生成。DiscriminatorはGeneratorが生成した偽物データか本物のデータを受け取り、それが本物なのか、偽物なのかを判別、判別結果を出力します。データとして画像を扱う場合は、GeneratorとDiscriminatorは大体、畳み込みニューラルネットワーク(CNN)がベースとなっています。GANの学習GANの損失関数は以下の通りです。Dは0~1を返すDiscriminatorモデルの出力、GはGeneratorの出力(偽物生成データ)、zは潜在変数、xは本物データです。P_dataとP_zは確率分布でxとzがそれぞれの確率分布から生成されるとしています(詳しくは後述の「GANの数学的な考え方」)。GANの学習アルゴリズムは以下の通り(GANの論文より引用)です。GANの数学的な考え方ここでは、GANの学習についてもう少し踏み込むために、GANの数学的な位置づけについて述べます。前述したとおり、GANはディープラーニングを用いた生成モデルの一種です。ここでいう生成モデルとは、「データの生成過程を数理的にモデル化したもの」ということです。数理モデルは確率分布によって表されます。何らかのデータは何らかの確率分布によって生成されると言えます。簡単な例としてサイコロを考えます。サイコロを振った時に出る数字は、1~6どの面も1/6の確率です。これはつまりサイコロは、1/6の確率で1の目が、1/6の確率で2の目が...といったように、1~6すべての事象が1/6の確率である一様分布を確率分布とする生成モデルであると言えます。このように何らかのデータは何らかの確率分布によって生成されるといえることがわかると思います。Generatorはデータを生成するため、Generatorは暗黙的に何らかの確率分布を持っていると言えます。学習に使う本物のデータ群も何らかの確率分布を持っていると言えます(上記の損失関数でいうところのP_data)。この本物データ群の確率分布にGeneratorの確率分布をできるだけ近づけていくというのが、GANの数学的な考え方です。ここで損失関数を展開して計算します。展開したところで、Gを固定してDの最適解について考えます。ミニマックス問題なので、Dの最適解はVを最大化します。Vを最大化するには積分の中身を最大化すれば良いです。P_tとP_gは確率なので0~1、Dも0~1なので、積分の中身の式は、要は下のような上に凸なグラフになります。上凸なグラフの最大点が確率の割合でずれるだけと考えれば、Dで微分してやればいいです。微分してやるとこれが0になるDが最適解なので、式を整理してやると最適解はとなります。次にこれを代入してGの最適解を考えると、となり、最適なDのもとでのGの最適化は、Jensen-Shannonダイバージェンスの最適化に相当するということになります。Jensen-Shannonダイバージェンスを軽く説明すると、2つの分布が距離としてどれだけ異なるかを測る尺度です。最小値は2つの分布が等しい時で0になります。Gの最適解ではVを最小化するのでPtとPgは等しく、V=-log4となります。よって、損失関数のGの最小化はPgをPdataに近づけることに相当し、本物データ群の確率分布にGeneratorの確率分布をできるだけ近づけていくことになるのです!以下、イメージです(GANの論文より引用)。ちなみに、Dの最適解は、0.5となり本物と偽物を五分五分でしか見分けられないということになります。実装してみた以上のことをDCGANとして実装してみました。GANの論文自体は、ネットワークの構成について一切述べていないので、DCGANを使いました。DCGANはGenerator、DiscriminatorをそれぞれFCNで実装したものです。実装コードはこちらデータセットはgoogle-images-downloadを使い、Google画像検索で出てくるマリオの画像を使いました。ダウンロードした画像から個人目線で、マリオだけが写っている画像を手作業で抽出しました。いい感じで生成されていたのを抽出してみました。Inc.)の実務インターンに参加させていただきました。そのインターンで学んだこと、感じたことなどをまとめたいと思います。株式会社ネイキッドとはNAKEDは、空間全体を演出するクリエイティブカンパニーです。具体的には、映像による空間演出やインスタレーション、プロジェクションマッピングなどを行っています。これらの業界で有名なのは、チームラボとかですね。元々はドラマのタイトルバックや、ミュージックビデオとかの制作を行っていたそうですが、最近は上記のような空間演出系のこともされているようです。インターンに参加したきっかけ僕は大学に入ってからプログラミングにハマり、色々開発・制作をしていますがVR・AR系の開発を結構しています。VRといえばHMDというのが今の時代だと思いますが、HMDの映像は3DCGです。ユーザーの行動によって映像が変化するのが普通なため、インタラクティブ3DCGです。僕自身もそういったHMDの映像を作っていました。その後、インタラクティブアートに出会い、自分がやっているVR/ARという分野に近いインタラクティブ3DCGによって、幻想的な空間が作り出せることを知り、いつか現実空間とコンピュータ世界の空間の境界を超えた作品を作ってみたいなと思っていました。そんな中、テレビCMで興味深いものを目にしました。石原さとみさんが出演している、フレアフレグランスのCMです。このCMの演出が面白いなと思い調べて見たら、花が舞うのは映像編集ではなくインタラクティブプロジェクションマッピングだったのです!で、これを作っているのがNAKEDでした。NAKEDについて調べてみるとインターンシップを募集しており、プロジェクションマッピング、AR(拡張現実)といった既存の表現にとどまらない空間を創造していきます。映像表現がモニターのフレームを越えてリアルな空間に広がって行くにつれ、多様なデバイスをコントロールしたり、新しい表現の追求のために、それを実現するツールを生み出す技術が必要とされています。僕は「これだ!」と思い、すぐにインターンシップの応募をしました。流れとしては、エントリーシート提出→面接→採用と一般的なものでした。エントリーシートは、大学などの基本情報に加えなぜNAKEDのインターンに参加したいかを書いたと思います。面接はSkypeで行っていただけました。NAKEDのインターンになぜ参加したいか、自分の経歴や経験はどんなものか、インターンで何を学びたいかなどありきたりな質問でした。面接したその日のうちにインターンシップ採用のメールをいただきました。テクニカルディレクター(メディアアートプログラマー)として参加することになりました。別れており、blueが事務や企画(?)など、greenが映像の制作やインタラクティブ機能の作成など、redがNAKEDの核となるシステムの開発を行う、といったように別れているようです。僕はredチームで働きました。概要としてはgreenチームの人が簡単に制作をできるようにするシミュレーションシステムの開発や、既存映像ツールでは制作困難なものをグラフィックプログラミングによって制作可能にし誰でも簡単に使えるツールにするなどを行いました。インターンで学んだこと、感じたことオブジェクト指向のコーディングをもっと学ぶべきインターフェースやイベントなど、オブジェクト指向の特性や能力をもっと生かしていくべき。大幅に向上する!オブジェクト指向のコーディングをもっと学ぶには、既存の各クラスやメソッドを積極的に利用すべし。リファレンスを軽く眺めるのも1つの手。既存のものを利用すると、バグも少なくなり(リファレンスなどがあるため)誰にとってもわかりやすい。汚いコードは読むだけで一苦労と痛感。結局何をしているかが伝わらないこともあるクラスを分けることで頭の中も整理できる各クラスの役割を明確に定めることで、そのクラスで何を担当すべきか、データをどのように扱うが変わってくる。様々な視点から書いたコードを観察するエンジニアでない人が使うツールの作成を行ったために、どうすれば使いやすいか、人的なミスをなくし自動化できるかを、かなり考えた。それにより、将来的に機能拡張をするときにどんなことが考えられるか、必要なデータがない時の処理やエラーハンドリングをどうするかなど、普段とは異なった視点からコードを観察できたコーディングとリファクタリングを短いスパンで回すコーディングをして一段落したら、放置せずに出来るだけ早くリファクタリングをすべき。コードが膨大になってしまうと、理想的な設計にするのは不可能だと思う。できるとしても、ほぼ作り直し勝手に自分の中のフィルターを作らないグラフィックの動き・綺麗さ、既存アルゴリズムの使用による限界など、「現状の手段では難しい」とか、「こんなものかな」など、現状に満足しないようにすること。何か少しでも気になるところがある場合は、何らかの解決手段を探し検討すべき。それが、繊細なところまでこだわりぬく事につながり、素晴らしい作品作りには不可欠である繊細な調整や、処理負荷を考えられるのはエンジニアのみ。こだわり抜くことができるのもエンジニアにしかできない醍醐味。→圧倒的な映像美をプログラミングで魅せれる感想コーディングに関しては、ほぼ自分で考え自分で思ったことばかりを書きましたが、やはり他の人にとって読みやすくするなり、他の人が使いやすいものにするなりと、他人を意識することで、良いコードが身についていくと思いました。グラフィックプログラミング、グラフィックエンジニアリングの面白さを実感しました。想像している通りになるまでこだわり抜くこと、CGに関する知識や様々なツールを利用することで、未知なるものを生み出すことができると感じました。僕もいつの日か、誰もみたことのない未知なるものを生み出してみたいものです...。3/29までの1週間、株式会社Aimingのエンジニアインターンに参加させていただきました。今回はそのことについて書きます。AimingとはAimingはオンラインゲームの企画からプロデュース・開発・運営までを行なっているゲーム会社です。制作タイトルで有名どころだと剣と魔法のログレスなどがあります。剣と魔法のログレスは運営元は株式会社マーベラスとなっていますが、開発はAiminigが行なっています。インターンに参加したきっかけ大きく分けて2つ理由があります。プロの現場でコードを書いてみたい私は前々からインターンに参加し、プロのエンジニアの現場を体験したいと思っていました。Aimingのインターンに参加する1ヶ月ほど前に任天堂のインターンに行きましたが、プログラミングはしていません。実際にコードを書くインターンに行きたいと思っていました。コードを書くのは個人でもできますが、自分の周りにCG関連のコーディングに強い友人がいないため、プロの現場なら学べるのではないかと思ったからです。Webの知識を活かせるゲーム開発をしてみたい私はアルバイトで開発の仕事をしていますが、そこでWeb系の知識をある程度身につけました。私の興味のある分野がVRやCG関連であるため、ゲーム会社のインターンをしてみたいと思っていました。今の時代、多くのゲーム会社がスマホゲームを作っています。そのほとんどがオンラインゲームです。それらのゲーム会社のインターンの募集を見るとほぼすべて、クライアントとサーバ側でカリキュラムや日程が分けられています。Aimingはインターン募集の時点でそういった区別がありませんでした。実際に会社でオンラインゲームを開発するなら、私はお互いのことをある程度理解しておくべきだと思います。すれば、お互いのことを考えた開発ができます。Aimingはゲーム開発のみではなくWeb技術なども含む、技術的多様性のあるインターンを体験できると思ったからです。私が参加した回だけかもしれませんが、インターン生は私1人でした。チーム開発の手法を教わり、擬似的に実行していました。その中で社員さんからのアドバイスやフィードバックを受けつつ、ひたすら開発を行なっていました。制作物としては、ドイツの2人対戦型のボードゲーム「ガイスター」をオンラインゲームとして作りました。ユーザの作成&ログインからゲームルームの作成&参加、対戦相手とのマッチング、対戦準備処理、ゲーム操作、ゲーム状況の更新&提示、勝敗判定までオンラインゲームの基本となるものを一通り作成し、独自にオリジナル拡張機能の作成もさせていただきました。最終日にはコードレビューを行なっていただき、これから自分が改善していくべき課題やプロのゲームエンジニア目線の考え方などを教わりました。インターンで学んだこと・学ぶべきと感じたこといかなる時もコーディング前の設計を大切に今回のインターン生が私1人だったこと、開発速度を向上しインターンでもっと学びたいという思いから、私はコーディング前の設計を軽視してしまいました。結果、複雑な処理の実装時にどうやって作るべきかを悩んでしまいました。無理くりな手法で実装したことで、コードが汚くなり、挙動も不安定なシステムになってしまい、後々修正する羽目になりました。チーム開発の時は設計をしないと、チーム全体での実装方針が決まらないため、設計はきちんと行なっています。私は1人開発の時に開発速度を優先することにより、設計を軽視する側面があることに気づきました。今回のように開発速度を優先して設計を軽視しても、修正作業が入ってしまい、結果全体で見たときの開発速度は落ちてしまいます。1人の開発でもチーム開発と同じです。1人開発はいわば、「過去の自分、今の自分、未来の自分とのチーム開発」なのです。常に綺麗なコードを書こう。プロのコードは綺麗だよ。設計の話と絡む話ではありますが、設計がしっかりすれば綺麗なコードを書けるはずです。実装方法に悩んだ時は、すぐに無理くりな方法を実装しないようにすべき。周りに相談したり、より良い方法がないかを調べるようにする。結果、チームメンバーのコードのより深い理解につながるし、新たな技術の習得にもつながる。綺麗なコードを書くことは結果として、開発速度の向上や、機能拡張をする時にも役に立つ(長いスパンで考えた場合だけでなく、短いスパンの場合でも)コピペをしない。コピペをすると、その機能に最適な処理でない可能性が高いデフォルトで用意されている機能がないかを調べる。用意されているものがある場合、自分で作るのは時間の無駄&他人は理解しづらい。理解しやすいのはコードを書かないこと!(この辺はリーダブルコードにも書いてあったような気が...)オブジェクト指向型言語ならではのコーディング手法を身につけるMVCモデルを意識し、きっちりと処理を分ける。Viewは極力データを持つべきではない。オブジェクトごとに細かくクラスを分け、機能拡張を容易に行えるコーディングを心がけるUnityの場合、何でもかんでもMonoBehaviourを継承するのをやめ、Unityの機能を本当に必要とするものにのみ継承すべき。することで、Unityを使わないプロットフォームでの開発に利用できる。ロジック系のクラスは特に。メモリのことを考えたコーディングを心がけるどれが重たい処理なのかを理解し、使うべき時を考える。初期化時に行なったり、本当に必要な時にのみ使用する。少なくとも、ループする関数では使わない。チリも積もれば山!デフォルトで配置しておくオブジェクトを少なくする。多いと、データの読み込みに時間がかかってしまう。必要な時にコードから生成しよう定期的に、どこか重い処理がないかを確認しよう。定期的に振り返ろうKPTというプロジェクト振り返り手法を学びました。Problemをなくすために具体的にこれから行うことこれらを書き出し、短いスパンで定期的に振り返りを行うことで、プロジェクトの改善を加速することができるそう。自分の周りにはCG関連に詳しい友人がいないので、なかなか他人にコードを見てもらう機会がありません。そんな中、今回のインターンで自分のコードを見てもらったことで、自分のコードの何がダメで何が良いのかが明確になりました。個人開発では絶対に経験できないことを学べたので、非常に良い体験でした。(ISCA2018)に応募することになりました。応募するとノミネート作品として選出され、本大会に招待されました。本大会では佳作賞を受賞しました。今回はその制作過程を書きます。AWARD(ISCA)は大阪で開催されている、国内、国外の学生を対象とした国際的なクリエイティブアワードです。デジタルコンテンツ部門と3部門あり、私はデジタルコンテンツ部門に応募しました。今年は国内172作品、海外121作品、計293作品の応募があったそうです。実習の一環なので、VRコンテンツということは決まっていました。そこで、VRでできたら面白いと思うアイデア(キーワード)を出していきました。「体験者がパワードスーツを着たヒーローになって、飛んでくる障害物をパンチやビームで破壊していく」というものになりました。体験者の行動量に応じてパワードスーツのバッテリー量が増減し、それと連動して実際に自分の体が重くなったり、パワードスーツが充電され実際に電気が流れるような感覚を提示するといったようなものを実装することにしました。企画は6月ごろに行っていました。7月はテスト期間であったため全然活動できず、8月から制作を始めました。ISCAの前に、大学としての展示が9月初旬にあったので、約1ヶ月の制作の制作でした。僕はメインプログラマを担当したので、Unityによるゲームの実装全てと感覚提示デバイス群との通信を担当しました。多くの方に体験してもらい楽しんでいただけた一方、改善点も多く見つかりました。・初心者にはゲームがむずすぎる・パンチのタイミング、パンチ出来たのかがわかりにくい・操作法がわかりにくいなどが挙がりました。本番のISCAに向けて1ヶ月ほど、ブラッシュアップを行いました。・デバイスのコードに体が絡まらないように、ゲームのアルゴリズムの修正などを中心に大まかな改善を行いました。全体のシステム構成は以下のようになっています。準備日も含めて3日間で開催されました。1日目は、準備で終わり。2日目は、朝の開場前に審査員の方々へのプレゼンから始まりました。・体が重たくなるという感覚提示を行い、それをゲームと連動させる。・体験者が何も意識しなくていいように自然に感覚提示を行う。審査員の方からは、「非常にチャレンジングな作品だった」とのこと。「ゲーム進行によってプレイヤーが不利になっていく新しいゲーム性」や、「VR分野で困難な部類の、重力強化」に挑戦したからだと思います。授賞式の後は、映像部門の作品上映を行ったり、参加者で交流会をしたりして2日目が終わりました。3日目はずっと展示を行っていました。MAN」を制作&ISCAに参加してみて真っ先に思ったのは、私たちはゲームのグラフィック完成度が低いと思いました。他の方の作品はどれも高グラフィックでかつ、個々人の「思い」が込められていました。ゲーム部分の制作を私一人が担当だった(他に担当できる者がいなかった)ことから、グラフィックについて深く話せなかったことが反省点ですね。作品制作において、グラフィックはそれだけで評価に値する要素だと思うのでもっとクオリティを上げれるようにしたいです。作品に「思い」を込めることが、自分の作品を見てくれた人を魅了すると身を持って感じました。私自身、今までの作品に「思い」がこもっていないということではないですが、その「思い」の大きさが違うなと感じました。障がい者の方のためだったり、何かを知ってもらいたいとか、自分の個性を埋め込んだり...私も作品を通して、誰かを魅了しその人の原動力となる作品を作っていきたいと、心から思いました。今回の受賞で満足せずに得たことをバネにして、これからもさらに上を目指していきます!最後になりましたが、関係者のみなさま、体験していただいた方々、ありがとうございました。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。