最近はリリース直前のゲームプロジェクトでUnity(80%)やらphp(10%)やらバッチ(5%)やらエクセルマクロ(5%)やらを触っています。リリース直前ということで申請までになんとかしなきゃいけないタスク一覧みたいなのがあるんですが、その中にスクロールビューを軽くするというタスクがありました。まあ最近のスマホゲームなんかだと友達一覧やらプレゼント一覧やらクエスト一覧やらとにかく縦横にずら~っと表示する情報が多いわけです。そこがとにかく重いと。対応方法はいくつかあるんですが、今日はそのあたりについてまとめて書いてみようと思います。(「いやいや違うよ」とか「こっちの方がオススメだよ」といった方法があればコメントお待ちしてます!重い原因まずスクロールビューを重くしている原因を整理してみます。のを使わせてもらってます)Unityのスクロールビューはデフォルトでマスクのコンポーネントがついているのでこういう見た目ですが、マスクをオフにするとこんな見た目になります。マスクで見た目上は画像が消えていても、裏で描画の処理は走っちゃってます。(ちなみに表示の負荷だけでいうとマスクをしているときの方がかかります)と重くなってしまう原因の代表的なものとしてはこの2つが考えられます。無限スクロールやデータ駆動のスクロールを提供するアセットです。いうわけで特定のRectに入っているかどうかを確認するscript指定した範囲内に入ったタイミングと出たタイミングで処理を走るようなComponentを作りました。https://forum.unity3d.com/threads/test-if-ui-element-is-visible-on-screen.276549/#post-2978773)使う側の例としては下記のような感じです。falseだったら(指定した範囲外に描画しようとしていたら)描画をオフにしたり処理が重いスクリプトをオフってあげればいいと思います。ここでは試しに色を変えています。log");}}}たとえばこんなコンポーネントが100個着いていたとして(わかりやすくするためにこんな処理にしてます)、描画範囲外にでたらこのscriptをオフにしてあげるようにします。entered);}これでProfilerの処理がBeforeAfterこんな感じになります。fpsが改善されてますね。描画している部分以外は非アクティブにしているので、当然軽くなります。「とにかく急遽スクロールを軽くしてくれ」と言われたらこの方法がおすすめです。注意点この実装方法はいくつか注意点がありますスクロールさせる要素が多すぎると重いスクロールする項目があまりにも多いと、ViewRectObserveComponentの処理で結局重くなってしまいます。ViewRectObserveComponentはUpdateで常に監視しているので、スクロールさせる要素が多いと結局重くなってしまいますHierarchy上の階層が深いと重いrectTransform.GetWorldCornersって呼んで字のごとくWorld座標を取得しているんですね。階層が深ければ深いほどWorld座標を計算する負荷が大きくなります。できれば指定した階層から相対的に位置をチェックするとかができればいいんですが、そこは今のところ未対応です結局スクロールはデータ駆動が一番さんざん色々言っといてあれですが、スクロールビューのパフォーマンスを最適化するのに一番良い方法はデータ駆動のスクロールビューに切り替えることです。おすすめはこちらのEnhancedScrollerです。2017」...2016-12-15複数ボタンがスクロールする画面を作るときに便利な「MultiButtonScroller」をリリース...リリースしましたUnityAssetStoreに自作アセットの第2段をリリ...2016-07-16GameObjectの文字列プロパティについて今日もスクリプト最適化のTipsについて。cocokyoro.hateblo.jp...2016-06-15UnityのVector3.DIstance()よりもVector3.sqrMagnitudeを使い...タイトルの通りです。はてなブログPro会社でもプライベートでもゲームアプリを作ってる6年目エンジニアです。(2)はてなブログをはじめよう!cocokyoroさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。