【Unity】ECS(Entity Component System)を勉強してみた①【DOTS】
- DOTSとは?
- ECS(Entity Component System)とは?
- ECSの構成要素
- Entity
- Component Data
- Component System
- Component Group
- World
- ECSの導入
皆さんは「DOTS」(Data-Oriented Technology Stack)をご存知でしょうか?
DOTSとは?
最新のマルチコアプロセッサを利用した、ゲームの高速実行、可読性、再利用に長けた最新のハイパフォーマンスなUnityのコアです。
DOTSには主に以下の3つが含まれています。
- C# Job System
- ECS(Entity Component System)
- Burst Compiler
今回からはこのうち、ECSについて勉強して行きたいと思います。
ECS(Entity Component System)とは?
今までのMonoBehaviour/Componentの考えより、物量ゲーを超高速に動作させることができるアーキテクチャです。
つまりどういうことかというと、これまで大量のオブジェクト(GameObject)を生成する場合、その生成や削除だけでも重いのに加え最適化させるためにオブジェクトをプーリングさせる設計にしたりと複雑なロジックが必要になってきました。
それが、ECSではGameObjectを生成する必要がないのでめちゃくちゃ早くなります。
この考え方はオブジェクト指向ではなく、構造体主体のプログラミングとなっており、圧倒的にメモリ効率がよくなります。
ECSの構成要素
ECSを構成しているのは以下の3つです。
- Entity
- Component Data
- Component System
この3つに加え、2つの仕組みがあります。
- Component Group
- World
Entity
GameObjectに相当する"モノ"を表す実体の構造体です。
ECSでは、Entityを実体1つとし、各Entityに対して処理を行うという感じになっています。
EntityはEntityManager型のオブジェクトの元で管理されています。
Component Data
MonoBehaviourに相当するフィールドを表す構造体です。
Unity.Entities.IComponentDataというInterfaceを実装しています。
Entityに格納するデータだと思ってもらえれば分かりやすいと思います。
Component System
ComponentのUpdateやLateUpdate内の処理に相当します。
入力や描画、非同期など様々な処理を行う存在です。
通常はComponentDataを持つEntityが存在する場合にのみ動作しますが、
[AlwaysUpdateSystem]Attributeをつけることで存在しなくても動かすことができます。
Component SystemはScriptBehaviourManagerという基底クラスから継承してます。
(EntityManagerもScriptBehaviourManagerの派生になってます。)
Component Group
ComponentDataの種類を設定し、ComponentSystemが処理する対象Entityのフィルタリングをする役割になっています。
World
ComponentSystemやEntityManagerが属する仮想空間です。
ScriptBehaviourManagerの派生となるインスタンスは各Worldに1つずつ存在し、必ずWorldに属しています。
ECSの導入
Project Settings > Scripting Runtime Versionを.NET 4.xに設定
(2018.3からデフォルトが.NET 4.xになっているため設定する必要なし)
Package ManagerからEntitiesをインストール
Project Settings > Scripting Define Symbolsに「UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP」を追加
今回はここまで!
次回から実際にUnityでECSを使ってみようと思います!
参考
【Unity】種類別にアセットを検索する
今回はゆる記事でお送りします。
ヒエラルキービューで名前別、アタッチされたコンポーネント別に検索する方法はみなさんご存知かと思いますが、プロジェクトビューでもアセットの種類別で検索できることをご存知でしょうか?
あくまで"種類別"なのでこのコンポーネントがどのオブジェクトにアタッチされているかまでは検索できません(検索できる方法知っている方いたら教えてください!)
しかし、画像やモーション、スクリプトなど数多くのアセットから欲しいものを見つけるのってなかなか困難なときありますよね
例えば、「Item」の情報を管理しているScriptableObjectを検索したいと思い、プロジェクトの検索欄に「Item」と入れます。
そうすると、Item〇〇や◯◯Itemなどの名前のスクリプトや、画像やモーション等が格納されているフォルダ等がずらーーーっと並び、ちょっとスクロールしないとほしいものが出てこないみたいな感じになります。
そんなときに使えるのがフィルタ検索です。
t: 指定でアセットの種類(t: prefabやt: ScriptableObjectなど)
l: ラベル
他にも指定パス以下のアセットを検索などできるそうです。
つまり、「Item t: ScriptableObject」のように検索すれば
Itemという名前のついたScriptableObjectを取り出すことができます。
【雑記】やることが多い時に意識していること
4月から社会人になったぐっちーです!
先月末から実際に現場に入り業務をしているわけですが、新卒は新卒ならではの作業があり、それらを業務と並行して進めなければならず苦労している人も多いと思います。
実際に、僕も今月の初め頃並行して行う作業が4, 5個あり業務に当てられる時間が1日2時間くらいしかないみたいな日が数日続いたりとかなり苦しい期間がありました。
正直、働き方が分からない状態だとどれを優先してどれくらい時間を使っていいか分かんないです。
僕の場合月初でそういう経験をして「目の前のこと一つ一つをしっかりやる」という意識をしていたのにも関わらず全部中途半端な感じになってしまい多くの反省ができてしまったという結果になってしまったので"意識していること"というよりはこの反省から"意識し始めたこと"になるわけですが、
・第1優先を決める
・第1優先の隙間時間を作り並行作業の時間を当てる
・リカバリー時間を作る
この3つを軸にすることにしました。
僕は、仕事力のついていない今、全部をちゃんとこなすのは無理だと思ってます。
なのでそこはちゃんと割り切って、業務時間は何をすべきか?だけをまず考えることにしました。すべきこと = 一番優先順位が高いものだと思っているので、まずは第1優先となることだけを考え他のことは考えないようにします。
ただ、第1優先のことだけを考えて見積もりをたててしまうと、並行作業に当てられる時間は0となるのでそれは危険な状態です。なのでそこはPMやトレーナーの方と相談するなどしてある程度バッファをとっておきます。(この業務は5営くらいで終わるけど他の作業もあるし2営くらい余裕持って7営で設定しておこうなど)
こうすることで、例え第1優先となったものに遅れが生じてもバッファを取った分で対応ができ、予定通りもしくは前倒しできれば隙間時間ができます。
その時のために「2時間前倒しで作業が進められたらこのタイミングで1時間こっちの作業をやる時間にしよう」と第1優先の方に余裕をもたせつつ並行作業を隙間に入れる想定のスケジューリングもしておくことをします。
逆に、第1優先に時間を使ってしまい、並行して行う予定だった作業が終わらないこともあります。(むしろ経験がないうちはこうなるばかりだと思ってます)
その時にでてくるのがリカバリー時間です。
これは休日や休憩時間、残業に当たります。これはもう割り切るしかないと思ってます。
第1優先:プロジェクトで担当している機能の実装
並行作業①:会社で担当しているコンテンツ
並行作業②:研修
を例に考えてみましょう。
もしこれをぐちゃぐちゃに進めてしまって全て中途半端な状態になってしまった場合、
・スケジュールに遅れが生じプロジェクトチームに迷惑がかかる
・研修の内容が頭に入っておらずチームがあればそのメンバーに迷惑がかかる
などなど考えられる懸念点があります。(実際僕は軽くなりかけました)
そこで上記の通りに考えた場合、
・機能の実装は完了したが、並行作業まで手をつけられなかった
・休日が軽くつぶれた
という懸念点に変わります。
こうしたことによる大きな違いは、
・プロジェクトチームには貢献できた
・第1優先が並行作業に移り、研修に集中できた(上の失敗パターンではぐちゃぐちゃ進んでいる状態がずっと続くことになる)
です。
基本、"業務時間は第1優先のもの、リカバリー時間は並行作業のもの"と考えているのでそのとき何を集中してやるかが明確になります。
また、メリットがもう1つあり、経験を積めば積むほど効率化できてリカバリー時間が減り、成長も感じられます。
新卒だからこそできることの中に「今やるべきこと(第1優先)が分からないときに聞けば教えてくれる」というものがあるのであれもやらないといけないこれもやらないといけないと混乱せずに今やるべきことを明確化して、同じ過ちを犯さないようにどんどん成長していけたらと思います!
【Unity】Webページ表示拡張メソッド【WebViewExtensions】
概要
Webページの表示やunity-webviewの機能(アプリ内にWebページ表示、ローカルページ読み込み)を使いやすくした拡張メソッド
unity-webview
使用方法
①WebPageのScriptableObjectに開きたいページを登録
→ 指定順はWebPage.csを参照ください。WebページのURL→ローカルページのファイル名という順になっています。
②開きたいローカルページをAssets/StreamingAssets内に保存(ローカルページを開く予定がなければ大丈夫です)
③Webページを押下時に開かせたいボタンを用意し、WebViewExtensionsをアタッチ
④各項目を設定
Is Jump Page : チェックをつけるとブラウザでページを開きます(つけない場合はアプリ上に開きます)
Web Page Type : 指定したURLのページを開きます(Local Page Typeと同時に設定していた場合こちらを優先します)
Local Page Type : 指定したローカルページを開きます
Web View Obj : WebViewObjectがアタッチされたオブジェクトのプレハブを設定(アプリ上でページを開く際に必要です)
⑤③で用意したボタンのOnClickにWebViewExtensions.OnClickを登録
Demo
まとめ
ローカルページを開くためのパス設定がなかなか苦戦しましたが公式サイトのお知らせページ開いたりWeb関係を使うことは多いので
まとめられてよかったです!
【雑記】収益化しているアプリを公開する際の注意点
アプリをAppStoreやGooglePlayで公開するときに、レーティングであったり広告が含まれるかどうかみたいな様々な設定を行うことになります。
それを踏まえた上で申請が通れば公開されますが、収益化されているアプリは大きく2つ、設定を忘れてしまうと公開停止になってしまう点があります。
①開発者or開発会社の個人情報を公開しなければならない
これは何かあった時に連絡先等が分からなければやりたい放題ですからね
アプリの中には適当な情報を入れてたり偽物の情報を入れてたりするものもありますが、基本的には個人情報を公開しなければなりません。
会社や団体で制作しているものならともかく個人開発だとダイレクトに自分の個人情報を公開することになるのでなかなか抵抗がありますよね。。。
②プライバシーポリシーを見れるようにしなければならない
私たちが開発している「ドロップシュート」に関して前にGoogleからこのようなメールがきました。
審査の結果、 ドロップシュート, com.NTKG.DropShoot は、Google Play ポリシーに違反していると判断されたため、Google Play ストアから削除されました。このアプリは、ポリシーに準拠するアップデートをご送信いただくまで、ユーザーに配布、販売されなくなりますのでご了承ください。
削除の理由: Android 広告 ID の使用ポリシー及び Google Play デベロッパー販売 / 配布契約 4.8 への違反
アプリが個人情報や個人情報や機密情報を扱う場合、有効なプライバシーポリシーを掲載して頂く必要があります。お客様のアプリは Android 広告 ID の収集及び転送を行うことが確認されましたので、プライバシーポリシーを掲載して頂く必要があります。
たしかに他のアプリだと必ずありますよね。ただ個人や有志の開発だと忘れがちです。
プライバシーポリシーに関しては、「私が作っているアプリ全てはこのプライバシーポリシーに準拠します」という形にすればそこにリンクを飛ばすなりすればそれだけで済む話なので、公開の予定があるなら先に作っておくのがありだと思いますね。
ちなみに「ドロップシュート」のプライバシーポリシーはこちらになっています。
これで審査が通れば近日再公開されると思うのでまだ遊んでない方はぜひ遊んでみてください!
【雑記】実務始まりました!
入社から約2ヶ月の研修期間を終え、現在SGEの株式会社グレンジでクライアントエンジニアをしているぐっちーです!
配属と意気込みについての記事はこちら
株式会社グレンジ
多彩なダンジョンや様々なコラボをしているなぞるRPG「ポコロンダンジョンズ」
や、絶賛先行テストプレイ中の360度自由自在に飛び回る新感覚の空中対戦アクション「Kick-Flight」
を開発している会社です。
今週から実際に現場に入り、実務をしています。
グレンジには尊敬する先輩方が多く、現在頼りっぱなしな状態ですが、これから半人前の自分から一人前になり先輩方からも頼られるエンジニアとなるために直近1年の目標設定をしました!
1年後の目標はずばり
「企画・技術・UX等全ての面をエンジニア目線でサポートできる」
です!
僕はただ技術があるだけでは良いゲームは作れないと思ってます。
エンジニアならエンジニア目線で、クリエイターならクリエイター目線で一番ベストな状態を考え、それぞれ良いものを合わせる。すなわちプロジェクトチーム全員で一つの最高のものを作ることでようやく良いゲームが誕生すると思います。
実際にそれを達成するには、プロジェクト理解(人・技術・サービス)を完璧にしなければなりません。それをこの1年間で徐々に達成していくことで目標達成に近づくと思います。
なので、そのためにどういう技術や知識を得て、どういう行動していくかの技術目標と行動目標をまずたてました。
▼技術目標
「クライアント設計・実装を理解する」
「見積もりの精度を上げる」
たとえ使ったことのない技術のタスクが来たとしても、設計や実装方法を理解していればざっくりと見積もりはたてられると思います。
なのである程度期間に区切りをつけて月ごとの達成目標をたてることにしました。
- 6〜9月 : 全体の実装や設計の流れを業務と並行しながら把握する
見積もり精度80%目標 - 10〜12月 : 実装者に聞かなくても機能追加や修正に対応できる
見積もり精度95%目標 - 1〜3月 : 重要なタスクがきても対応できる、
クライアント関係の質問を実装や見積もり等なんでも答えられる
見積もり精度100%
▼行動目標
「意見や提案・質問の際誰に聞けばいいか把握している」
「プロジェクトメンバーとの相互理解ができている」
こちらは技術目標を達成するために必要な要素だと思います。全体の設計を理解するためには実装者に分からない部分を質問する必要が出てきます。つまり、全体の設計を把握していくことに比例してここは誰に聞けばいいかということが分かっていくはずだと思います。
そのときに、技術の質問だけをするのではなく、例えばランチに行って交流するついでに技術的な質問もするなど、相互理解も大事にしていこうと思いました。
以上が1年の目標になります!
現状、目標をたてることすらうまくできない部分もあるのでトレーナーさん方と相談しながら細かいところまで具体的に目標をたてたり確認をしています。
それが1年後に「とりあえずぐっちーに聞けば分かると思うよ」と言われるくらいに認められていたら最高です!
業務+αで目標を達成していき、少しずつでも成長を自分でも周りからも実感できるように頑張っていきますのでよろしくお願いします!