Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。コピー2020.05.08今回はUnityで毎フレーム実行している処理の実行回数を減らすということをしてみたいと思います。毎フレーム実行すると言えばUpdateメソッドですが、Updateメソッドで何らかの処理をする他のメソッドを呼び出すようにすると1秒間に何十回もそのメソッドが実行されます。呼び出したメソッドの処理が重いものであれば毎フレーム処理を実行するとゲームの処理速度が落ちてしまう事があります。そんなわけで今回はその実行回数を減らすということをしていきます。スポンサーリンクUpdateメソッドで何らかのメソッドを呼んでFPSが落ちるのを確認するFPSを確認する為にシーン上にテキストUIを設置しTextにAssets/StandardAssets/Utility/FPSCounterを取り付けて確認出来るようにしておきます。Updateメソッドで処理が重い別のメソッドを毎回呼び出すようにし、FPSを確認してみます。i.ToString();}}}上のようなスクリプトを作成し、UpdateメソッドでDoSomethingメソッドを毎回呼び出すようにしました。DoSomethingメソッドでは空の文字列に0~4999までの数値を文字列に変換し、concatenatedStringという変数に足す処理をしています。012345・・・・という文字列が作られるという何ら意味のない重い処理です。パソコンによっては、この5000の数値だとUnityまたはパソコンがフリーズする可能性もあるので低い値を設定してください。Updateメソッドが呼ばれる度にDoSomethingメソッドが実行される為FPS(1秒間に実行されるフレーム数)が非常に落ちます。いった重い処理を毎フレーム実行するとゲームの処理落ちが発生するので、マイフレーム実行する必要がない時はこの実行回数を少し減らしたいところです。実行してみると以下のようにFPSが極端に落ちてしまいます。一定時間毎にメソッドを実行するUpdateメソッドで毎回処理を実行すると処理速度が落ちてしまうので、実行する回数を減らしてみます。一定時間毎にメソッドを実行するには、自前で時間を計測してその時間を越えたらメソッドを実行するようにするか、コルーチンで時間を指定してメソッド実行するようにします。コルーチンに関してはUnityでコルーチンを使って定期的に処理をするUnityでコルーチンを使うと定期的に何らかの処理を行える事が出来るようになります。解り辛いけど使い方がわかれば便利かも!?gametukurikata.com2017.03.13を参照してみてください。自前で時間を計測してメソッドを実行まずは自前で時間を計測して一定時間後にメソッドを実行してみます。i.ToString();}}}上のようにマイフレームTime.deltaTimeをelapsedTimeに足していき、timeToDoSomethingの時間以上になったらDoSomethingメソッドを実行するようにします。elapsedTimeは0に初期化するので、またtimeToDoSomethingの時間以上になるまでDoSomethingは実行しません。次にコルーチンを使って一定時間後にメソッドを実行するやり方です。WaitForSeconds(timeToDoSomething);}}}上のようにtomeToDoSomethingで指定した秒数が経過したらStartCoroutineを使ってDoSomethingメソッドを実行するようにします。WaitForSecondsを使ってtimeToDoSomething秒待機した後再び処理を実行しています。これらを実行してみます。timeToDoSomethingを1にして実行すると1秒毎にDoSomethingメソッドが実行され、その時だけFPSが極端に下がります。敵をサーチする機能を別のやり方で作成する以前、敵が主人公を検知したら追いかけるようにする機能を作成しました。Unityで主人公キャラが近づいてきたら追いかける敵キャラを作るUnityで主人公キャラクターが敵キャラクターに近づいたら敵が主人公に近づいてくるようにしたいと思います。gametukurikata.com2016.01.28上の記事では敵の子要素にSearchAreaという空のゲームオブジェクトを作成し、それにSphereColliderを取り付けて主人公を検知するようにしています。主人公を検知する時にOnTriggerStayを使っていたとしたら毎フレーム何らかのコライダが範囲内にいるかどうかを判定します。毎フレーム確認するので処理が重くなりますね。別の記事でRigidbodyを持たないコライダで敵を検知する方法だと処理が重いというコメントを頂きましたので、それについて書いていきます。静的コライダだと処理が重くなる?敵をサーチする機能をあらかじめ取り付けたコライダだけで判断すると処理が遅くなる可能性があります。これはRigidbodyを持たないコライダ(静的コライダ)は本来動く事を想定せず最適化されている為で、動かすとその分余計な処理が必要になる為です。UnityメニューのWindow→Analysis→Profilerで動作を確認してみます。Colliderが判定され、その分余計な処理が増えています。ゲームオブジェクトを動かす事を前提としている場合はRigidbody+IsKinematicをfalse(物理的な作用をする)Rigidbody+IsKinematicをtrue(物理的な作用をしない)にしておくと良いようです。SearchAreaを敵の検知範囲として使用する場合はRigidbodyコンポーネントを取り付けた上でIsKinematicにチェックを入れるといいかも?(ただRigidbody自体が重い処理のようで、逆に付けない方が早いこともあるかもしれません)。ここら辺はUnityマニュアルを参照してください。ゲームオブジェクト同士の衝突をコライダーで処理します。コライダーはゲームオブジェクトに取り付けられ、物理演算に基づく衝突を適用する際のゲームオブジェクトの形状を定義します。コライダーは不可視で、ゲームオブジェクトのメッシュと全く同じ形である必要はありません。メッシュの大まかな近似の方が、ゲームでは効率的で...docs.unity3d.comサーチエリアにコライダを使うよりも一定時間ごとにサーチする相手が指定した範囲内にいるかどうかを判定した方が処理が早くなる可能性があります。別の方法でキャラクターをサーチする方法を作成してみます。自前で時間を計測しキャラクターをサーチする方法まずは自前で時間を計測する方法です。敵のゲームオブジェクトに取り付けます。{checkEnemyZombie.SetState(CheckEnemyZombie.State.Normal);}}}CheckEnemyZombieは敵の行動処理をするスクリプトとして作っていて、SearchCharacter2スクリプトと同じ敵のルートのゲームオブジェクトに取り付けられているとします。zombieCheckIntervalは敵が主人公を検知する間隔時間を設定します。elapsedTimeは経過時間を入れます。searchRadiusは検知する球の半径を設定します。UpdateメソッドでelapsedTimeがzombieCheckIntervalを越えた時にCheckCharacterメソッドを呼び出します。CheckCharacterメソッドではPhysics.OverlapSphereを使って敵の位置から半径searchRadiusの球の範囲内にいるPlayerレイヤーが設定された全てのコライダを取得します。取得したコライダがひとつでもあれば敵の状態とコライダの配列の0番目の敵のTransformを引数として渡し、敵のSetStateメソッドを呼び出して状態を追いかける状態にします。範囲内のPlayerレイヤーを持つゲームオブジェクトのコライダを全て取得する事が出来ますが、追いかけるのは一体だけなので配列の0番目のTransformを渡してそのゲームオブジェクトを追いかけるようにしています。検知した全てのPlayerレイヤーを持つゲームオブジェクトに何らかの処理をさせる場合もforeachを使って実行出来そうですね。コライダがひとつもなければ敵の状態をノーマル状態にします。敵の移動スクリプトや敵の状態を変更する処理はは他の記事に書いてあるのでブログ右上の検索窓で検索し、参照してみてください。主人公にしたキャラクターのCharacterController等のコライダを設定したゲームオブジェクトのレイヤーは必ずPlayerにしておきます(でないと検知出来ません)。Playerレイヤーがない場合は作成し設定します。コルーチンを使ってキャラクターをサーチする方法コルーチンを使った方法もやっていることは同じです。WaitForSeconds(zombieCheckInterval);}}}処理速度を確認キャラクターの子要素にサーチエリアを作り、キネマティックなRigidbodyを取り付けたコライダで判定する場合と、コルーチンなどを使って一定時間ごとに範囲内に敵がいるかどうかを判定する方法でどれだけ処理速度が変わるか確認してみました。上のようになりました。比較してみると全然処理速度が違いますね(^^)/今回の場合は一定時間後にPhysics.OverlapSphereを使ってその範囲内にPlayerレイヤーを持つコライダがいるかどうかで判定していますが、単純に探す相手が決まっている場合はその相手との距離を計算し、一定の距離内にいる場合は追いかけるという方法も出来そうですね。コピーかめくめちゃんをフォローする7Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)関連記事Unity基本情報UnityのReflectionProbeを使って鏡を作ってみるUnityのReflectionProbeを使って鏡を作り、キャラクターを動かして映るかどうかを試していきます。Unity基本情報UnityのAddressablesを使ってサーバーにあるアセットバンドルを使うUnityのAddressablesを使うとアセットの差し替えや追加ダウンロードをする機能などサーバー上にあるアセットバンドルをロードして使用することが出来ます。GCを有効にするとGCを複数フレームに分割して行うことが出来ます。Unity基本情報UnityのRigidbodyのAddForceに加える力とオプションUnityのRigidbodyのAddForceメソッドの第1引数に指定する力と、第2引数に指定するオプションについて見ていき、理解を深めます。Unity基本情報Unityのコンポーネントを一括で取得するUnityのコンポーネントを一括で取得するやり方を記述しています。自身のゲームオブジェクトに設定された同種のコンポーネントを一括で取得する事が出来るようにします。Unityの軸での回転についてサンプルを作成し理解を深めていきます。Blenderのシェイプキーで顔のアニメーションを作成しUnityで使用してみるC#で演算子のオーバーロードを使ってみるホームUnity基本情報スポンサーリンクサイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事に関する質問は送らないでください、返信は期待しないでください(._.))。kamekumechan@gmail.comいずれはSIRENやバイオハザードみたいなアクションゲームを作りたいと思っています。ゲームシナリオが書けないので面白いゲームはなかなか作れません・・・・。(^_^;)名前の由来はカメが好きだからです。プロフィールになってないな・・・・(-.-)Unityをこれから始める人へこれからUnityを使ってみようという方はUnityを使った3Dゲームの作り方(かめくめ)の歩き方Unityを使った3Dゲームの作り方(かめくめ)で、はじめてUnityの学習をする時の当ブログの記事を読む順番を書きました。機能を積み上げていく形になるので便利かも?gametukurikata.com2019.06.21の記事に記載の順番で見て頂くとUnityの基本的な使い方がわかり、簡単なアクションゲームや、TPSゲームの作成までが出来ます。自作タイピングゲームタイピングゲームを作りました。WebGL形式なのでPCのブラウザで遊べます。以下からプレイ出来ます。FinalTypingUnityを使って作成したローマ字入力のタイピングゲームです。gametukurikata.com2022.01.02お知らせ2023/01/24個人的にUnity2022.2.3f1をインストールしました。2022/10/14UnityのIKを使って足の位置と角度を地面に合わせる機能Unityのゲームでキャラクターの両足が別の高さの地面の上にある時にそれぞれの足をそれぞれの地面につけるようにする機能を作成しますgametukurikata.com2016.04.11機能を少し修正しました。2020/09/19コメント欄は閉鎖しました。今までコメントを投稿してくださった方はありがとうございました。(^^)/2018/08/07わたくしに出来る事は既に記事にしてあるので、ブログ右上の検索窓を活用してください。(._.)またブログの最初の方の機能を積み上げていく記事に関しての疑問点は当ブログ記事のスクリプトの説明と寄せられた質問への回答Unityを使った3Dゲームの作り方(かめくめ)の機能積み上げ形式の記事のスクリプトの説明と寄せられた記事の機能についての質問への回答を掲載しています。gametukurikata.com2019.08.01Unityを使い始めたばかりの人がつまづきやすい点を解消するUnityを使い始めたばかりの人が結構な確率で陥る不具合や疑問点を解消していきます。基本的にはブログに寄せられた質問への回答という感じです。gametukurikata.com2018.12.04も参照してみてください。小・中学生によるデジタルコンテンツ開発の全国大会ですuycc.unity3d.jp2022年大会の先行エントリーが開始されているようです。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。記事の内容に質問がある方へUnityを使った3Dゲームの作り方(かめくめ)の歩き方UnityのJavaScriptとC#を読み替えてどちらでも対応出来るようにするホーム検索トップサイドバータイトルとURLをコピーしました。