のらくるノートゲーム開発UnityC#【Unity】MonoBehaviourのUpdateに頼らないクラス設計ゲーム開発2019.02.10MonoBehaviourって便利ですよね。C#のスクリプト用意して、MonoBehaviourを継承したクラスを作ってGameObjectにアタッチするだけでUnityの様々なイベントを利用できるようになります。derives.docs.unity3d.comしかし、便利さの裏にはパフォーマンスの犠牲が隠れていることもあります。前にUnity公式のブログでUpdateイベントについて興味深い記事が紹介されました。https://blogs.unity3d.com/jp/2015/12/23/1k-update-calls/blogs.unity3d.comMonoBehaviourを継承したクラスに、StartやUpdateなどマジックメソッドが定義されていると、Unityは所定のリストに情報をキャッシュし、ゲーム中は単にイテレーションしてメソッドを呼んでいきます。UnityはC++で実装されていますが、スクリプトはC#なので、C++とC#の間で呼び出しのオーバーヘッドがあります。動かす分には便利ですが、数が多いと無視できないコストになってきます。MonoBehaviourのスクリプトはロード順に処理されるので、実行順序はランダムです。→こちらの記事で紹介しました。複雑なゲームになってくると、プレイヤーが動いた後、敵が動いて、各オブジェクトの状態に応じてAIが思考して~というようにUpdateが呼び出される順番が非常に重要になってきます。MonoBehaviourを継承したEnemyクラスがあるとしましょう。EnemyManagerクラスもあるとしましょう。敵の制御ロジックを書く}}EnemyクラスはMonoBehaviourを継承しますが、StartやUpdateを定義しません。代わりにInitとManagedUpdateを定義して、外から呼び出せるように作っておきます。_enemies){enemy.ManagedUpdate();}}}EnemyManagerは、CreateEnemyでInstantiateしたEnemyクラスを敵リストに追加します。ManagedUpdateは、作成されたEnemyのManagedUpdateを順番に呼び出します。Update(){_enemyManager.ManagedUpdate();}}最後にシーンを制御するクラスのUpdateでEnemyManagerのManagedUpdateを呼びます。うまく設計すると、MonoBehaviourのUpdateはシーンを制御するクラスに1つあれば事足ります。この方法のメリットは、実行順序を制御できること、C++とC#の間の呼び出しのオーバーヘッドが最低限になることです。Enemyの出現数が予め決まっているならLinkedListである必要もありません。Listの方が高速ですし、最初にまとめてInstantiateしておき、実行時はGameObjectをSetActiveでOn/Offするだけにした方がパフォーマンスは良いです。ここはゲーム内容でケースbyケースですが、Managerがいれば最適化もしやすくなります。これはUnityに限らずゲームではよくある作り方です。Unityはゲーム作りに便利なコンポーネントが大量に用意された描画エンジンだと思ってしまえば、ゲーム自体の作り方は昔から大きく変わりません。何か複数のオブジェクトを管理するためのマネージャクラスを作る場合には、このように実行順序の制御とパフォーマンスの最適化を意識した設計にすることができます。ManagedUpdateを呼び出す実装の手間と、呼び忘れるリスクもあるので、そこは一長一短です。作るものに合わせて、MonoBehaviourに任せた方が良い場合と、自分でUpdateを制御した方が良い場合を見極めて設計していきましょう。【Unity】悩まないC#コーディングルールコーディングルールって決めるのも面倒ですし、人数が多いと守っていくのも大変ですよね。経験豊富なプログラマは自分のスタイルを持ってるので、踏み入ると宗教論争に発展しかねません。【Unity】スクリプトの文字化けに対処するUnity上で新しく作成したスクリプトをVisualStudioで編集すると、スクリプトのプレビューが文字化けするようになってしまいました。これまで特に意識したことはなかったですが、Unityのバージョンで挙動が異なるかもしれません。【Unity】Dropdownのスクロールを選択した位置にあわせるuGUIのDropdownを使うとドロップダウンリストを簡単に作れます。ツールやメニュー画面に便利なアイテムですが、とても使いにくい点が1つあります。Studioの超簡単インストール方法(Windows)久しぶりに自作アプリをメンテナンスすることになったのですが、PCを買い替えてからAndroidまわりの開発環境を用意してなかったのでメモしておきます。色んな人がインストール方法を丁寧に説明してくれていますが、まずインストーラをダウゲーム開発どんどん使いたいC#の文字列補間式C#は文字列操作が最高にやりやすい言語だと思いませんか?C++のようにマルチバイト文字列、ワイド文字列を気にすることもややこしいプラットフォーム依存を深く考えることもなく、stringはstringです。【Unity】partialクラスがブレークポイントで止まらない?巨大に膨らんだキャラクタークラスが10,000行あったら...そっと閉じたくなるでしょう。複数人で触れば競合するリスクも増えます。そこでpartialを使うと少しだけ幸せになれます。UnityのC#でもpartialクラスは使えま【Unity】どのシーンから起動しても共通の初期化を呼び出したい【Unity】リリース時にDebug.Logを出力しないようにするホームゲーム開発スポンサーリンクプロフィールnoracleフリーランスプログラマノラネコのような生き方を目指しています。noracle.タイトルとURLをコピーしました。