Unity IndieのオクルージョンカリングとLOD

良い一日! 趣味として、Unityエンジンを選択します。 趣味は明らかに非営利であるため、Proバージョンの特別な必要性は感じません。 もちろん、ProはIndieよりもきれいですが、たとえばAndroid / iOSの開発の場合は、2番目で十分です。 1つを除いて-最適化および関連ツール。



エンジンによって作成された拡散クランベリーには、1.5〜2000個の三角形があります。 ハイポリロック/タイプライターは、平均的な携帯電話で画像を統合失調症にし、ロダンの思想家のポーズで美しいウォーターシェーダーが長時間フリーズします。 そのようなオブジェクトの3つがフレームに表示されると、すべてがひどくバギーになり、速度が低下することは明らかです。



Proには、 オクルージョンカリングと呼ばれる非常に必要なものがあります。 簡単に説明すると、カメラの視野に入るオブジェクト(カットの下のスクリーンショット)のみが描画されます。 私は再びProのコストを見て、頭の後ろをひっかいて、気分を害し、最初に見て、松葉杖を書きました。



オクルージョンカリングなし:



画像



OcclusionCullingの場合:



画像



賢い人々が思いついたものの良い例: Simple LOD Manager 。 一番下の行は、オブジェクトに近づくと、低ポリゴンモデル(キューブ)が高ポリゴンモデル(詳細な建物など)に置き換えられることです。 もちろん、Update()でループを使用するのは良くありませんが、このアイデアは尊敬に値します。



私のニーズは、描画範囲が狭いことに非常に満足しており、低ポリゴンモデルは必要ありません。 重いオブジェクトの-ネイティブの木だけなので、私は少し考えを短くしました。 プレーヤーに近づくにつれて重いオブジェクトを描画してみませんか?



出力には、目的のオブジェクトに掛かるスクリプトがあり、パラメーターはDistanceだけです。 コードはシンプルで、テストシーンで使用できます。



public var distance = 100f; private var meshRnd: MeshRenderer; private var _collider: BoxCollider; function Awake() { meshRnd = gameObject.GetComponentInParent(MeshRenderer); _collider = gameObject.AddComponent(BoxCollider); _collider.isTrigger = true; _collider.size = Vector3(distance, distance, distance); } function OnTriggerEnter (player : Collider) { if(player.tag=="Player") meshRnd.enabled = true; } function OnTriggerExit (player: Collider) { if(player.tag=="Player") meshRnd.enabled = false; }
      
      





モデルの描画を担当するオブジェクトのMeshRendererコンポーネントをキャッチします。 コライダーを作成します(この場合は距離のエッジを持つボックスです)。これをトリガーにします。 Playerタグを持っている人がコライダーに侵入した場合、彼は動作してモデルを描画します。



ウィンドウ>レイアウト> 2 x 3モードで距離を選択するのが最も便利です。



開始する前に、スクリプトがハングしているオブジェクトのMeshRendererを非アクティブ化します。



がんばって。



All Articles