UnityAssetStoreのハりスゞェネレヌタヌの䜜成方法たたはフルシチョフぞの埩垰方法





この蚘事を曞いた理由は、「フルシチョフ」に関するこの出版物であり、 Unityでのプログラムメッシュ生成に関する興味深いトピックを取り䞊げたした。



私の蚘事は、Unityに長幎取り組んでいる人を察象ずするものではありたせん。Unityの耇雑さに粟通しおいる人にずっお新しいものはないでしょう。 たた、完党に新参者の堎合、ここでは明癜な「困難」が発生する可胜性があり、すべおが゚ディタヌにあるずきに䜕かを発明する必芁があるのはなぜですか。 私たちの聎衆は、Unityで既に䜕かできる開発者に最も適しおいたすが、゚ディタヌでメッシュを動的に倉曎する問題をただ解決しおいたせん。 たた、私たちの䜕人かは、怜査官ずの経隓から利益を埗るかもしれたせん。



著者は、サブゞェクト領域の絶察的な知識を持っおいるず䞻匵しおいたせん。私は自分の蚀葉で、アセットを䜜成するずきに珟れたいく぀かのタスクの解決策を䌝えたいだけです。







䞊蚘の蚘事を読んだ埌、私はすぐにこれがプロゞェクトに必芁なものであるこずに気付きたした。 最初は、゚クスポヌトされたfbxファむルから家を䜜成しおいたした。 もちろん、説明されおいるように1察1で行うのではなく、基本的なアむデアを抌し出しお、すぐにタスクを蚭定したした。実行䞭のゲヌムモヌドに切り替えるこずなく、Unity゚ディタヌで建物を盎接線集および衚瀺したす。 前のアむデアの結果ずしお、すべおの建物の蚭定を1぀のスクリプトに収めるこずが刀明し、その結果、オブゞェクトむンスペクタヌで構造党䜓を1か所で線集するこずが刀明したした。







小さな䜙談



自己皮肉から始めたす。 私たちの小さなチヌムは少し前に、モバむルプラットフォヌム向けのゲヌムの開発を匕き受けたした。 独自のゲヌム゚ンゞンを䜜成するずいう野心的なタスクから始めお、䜜業を開始したした。 他の掻動分野を開発し、ゲヌム゚ンゞンの䜜成に関する本を読んだ私自身の経隓によるず、すべおを玔粋なsi  PureC で曞くこずが決定されたした。 ゚ンゞンのいく぀かの䞻芁な基本サブシステムが実装されたした。最適化されたメモリマネヌゞャ。 グラフィックレンダラヌ。 耇合モデルの䜜成に察するコンポヌネントアプロヌチ ハブでの公開 に基づくオブゞェクトの階局。 LUAを䜜成したゲヌムのスクリプト䜜成機胜に関連付けたした。 SQLiteに基づいたロヌカルデヌタベヌスに、あらゆるものLuaのスクリプトを含むなどを保存する機胜を実装したした。 䞊蚘のすべおを実装し、OpenGLが提䟛するむンタヌフェむスを習埗しおかなり長い時間が経過した埌、残念な結論に達したした。本栌的な゚ンゞンを䜜成できたすが、すぐにできたす。



Unityぞの移行



圓然、独自の゚ンゞンの䜜成ず䞊行しお、ゲヌム業界の成果に興味がありたした。 私たちはアンリアル゚ンゞンに非垞に魅力を感じおいたしたが、モバむルプラットフォヌム甚の30〜45MBの最小限のプロゞェクトはすぐに冷静になり、他の゜リュヌションを探すこずにしたした。



最埌に、Unityで最近詊したした。 Unity C構文は郚分的にマスタヌされおいたしたが、ガベヌゞコレクションシステム GC のおかげで、䜜成されたリ゜ヌスを解攟する必芁が必ずしもないずいう事実に慣れるのはかなり困難でした。



仕事のために遞ばれたトピック



さらに䜜業を説明する前に、制限に぀いおすぐに説明したす。Unity5をすぐに勉匷し始めたした。぀たり、すべおの䟋は、Unityの5番目のバヌゞョン、前の4番目、さらに3番目のバヌゞョンで動䜜するはずです。保蚌はできたせん。 私自身の経隓から、バヌゞョン4で出䌚ったレッスン/スクリプトの䞀郚はバヌゞョン5で実行されるこずが刀明し、䞀郚は新しいバヌゞョンに再フォヌマットしお正垞に開始する必芁があり、䞀郚は開始できなかったため、コマンド構文を倉曎する必芁がありたした。 バヌゞョンの䞋䜍互換性に぀いおは䜕も知りたせん小さな远加アセットを公開する前に、Unity 4.5.0で以䞋にリストされたスクリプトを正垞にテストしたした。



ゲヌムを芖芚的に満たすために、呚囲の背景をさたざたな建物で飜和させるこずが決定されたした。 ゚ディタで建物のおおよその倖芳をすぐに芋たいず思いたした。 ゚ディタヌで盎接スクリプトを「実行」できるようにするには、MonoBehaviourから継承したクラスの前に、[ExecuteInEditMode]ずいう行を蚘述する必芁がありたす。 プロゞェクトでMyTest.csスクリプトを䜜成し、次のテンプレヌトに埓っお倉曎したす。



using UnityEngine; [ExecuteInEditMode] public class MyTest : MonoBehaviour {     //   ,     //      //   }
      
      





むンスペクタヌのフィヌルドを倉曎するず、スクリプトメ゜ッド実装されおいる堎合Updateが呌び出されたす。 ゲヌム甚に収集されたスクリプトのサむズを節玄するために、このメ゜ッドは#if UNITY_EDITOR ... #endifディレクティブのペアで「゚スケヌプ」できたす。したがっお、むンスペクタヌで盎接倉曎できるスクリプトのおおよそのテンプレヌトがコンポヌネントに察しお衚瀺されたす。



 using UnityEngine; [ExecuteInEditMode] public class MyTest : MonoBehaviour {    public int i=10; #if UNITY_EDITOR    void Update () {        Debug.Log ("Update");    } #endif }
      
      





このスクリプトをステヌゞ䞊の任意のコンポヌネントに添付し、むンスペクタヌのiフィヌルドの倀を倉曎するず、コン゜ヌルはすぐに「曎新」を衚瀺しより正確には「曎新」メッセヌゞの数が増加したす、残りの時間はスクリプトがパブリックフィヌルドの倉曎を「埅機」したす。



このスクリプトを䜿甚しおシヌンに倚数のコンポヌネントがある堎合、シヌンの速床が著しく䜎䞋するこずに泚意しおください。 これを取り陀くには、むンスペクタヌの倉曎プロセッサヌを特別な゚ディタヌフォルダヌのスクリプトに移動する必芁がありたす。 このフォルダヌの内容は、完成したプロゞェクトに分類されたせん。 Editorフォルダヌず、その䞭にスクリプトMyTestInspector.csを䜜成したしょう。



 using UnityEngine; using UnityEditor; using System.Collections; [CustomEditor(typeof(MyTest))] public class MyTestInspector : Editor {    //       public override void OnInspectorGUI()    {        //           DrawDefaultInspector ();        //            MyTest mt = target as MyTest;        //  ,        //            mt.DoRefresh();    } }
      
      





倉曎されたMyTestスクリプトを芋おみたしょう。



 using UnityEngine; [ExecuteInEditMode] public class MyTest : MonoBehaviour {    public int i=10;    public void DoRefresh () {        Debug.Log ("Update");    } }
      
      





より䟿利な䜜業のためのむンスペクタヌのセットアップ



公匏情報ずグヌグルを研究した埌、たず、むンスペクタヌのパブリックプロパティの再描画ずスクリプト内の適切な方法による倉曎ぞの察応を提䟛するバリアントを決定したしたが、その埌、線集甚の゜ヌスデヌタを、倱わずに操䜜しやすい盞互接続されたデヌタ構造に分割するこずにしたした建物を構築するための玄130の同時衚瀺蚭定。 その埌、「個人怜査官」の必芁性はなくなりたした。 ただし、コンポヌネントを䜜成および線集する堎合は、今埌このアプロヌチに戻りたいず考えおいたす。 誰かが興味を持っおいるなら、私はリンクを䞎えるこずができたす ここずここ



むンタヌフェむス䜜成の埮劙な点



たずえば、型intたたはfloatのパブリック倉数を通垞䜜成するず、次のようになりたす。



 public int iterator=2; public float dx=0.5f;
      
      





むンスペクタヌでは、単玔な線集フィヌルドずしお衚瀺されたすが、䜜業䞭にこれらの倀を頻繁に倉曎するため、マりスカヌ゜ルを垞にフィヌルドに移動し、互いにほずんど意味のない意味のある数字を入力し、受け取った倉曎を確認するのは非垞に退屈です。異なるアプロヌチがはるかに䟿利です。 倉数䞊蚘の行の盎前にフィヌルドを宣蚀する堎合、入力された倀の有効な範囲を瀺したす。



 [Range(-10, 10)] public int iterator=2; [Range(0.0f, 1.0f)] public float dx=0.5f;
      
      





倉数の前にこのような远加を行った埌、むンスペクタヌでスラむダヌを動かしお倀をスムヌズに、たたは突然倉曎するだけで十分です。



スクリプト内のすべおのフィヌルドを同時に衚瀺しないようにするために、玄130個のフィヌルドがありたす。互いに匷く関連する倀を1぀のクラスにグルヌプ化しお、このクラスをスクリプト内のパブリックフィヌルドずしお宣蚀するこずができたす。 クラスの別々のむンスタンスでフィヌルドの倉曎を保存し、むンスペクタヌでフィヌルドを衚瀺できるようにするには、クラスを宣蚀する前に[System.Serializable]の行を蚘述する必芁がありたす䞊蚘の行。



 [System.Serializable] public class LeftRightSide {    [Range(0, 100)]    public int leftSide=3;    [Range(0, 100)]    public int rightSide=20; }
      
      





このクラスをスクリプトでパブリックフィヌルドずしお宣蚀するず、䞊蚘のクラスのコンテンツを線集するためのフィヌルドの非衚瀺/展開可胜なブロックがむンスペクタヌに衚瀺されたす。 さたざたなクラスを互いに階局的にネストするこずができ、垞識によっおのみ制限されたす。 このような単玔な手法により、たず関連デヌタをグルヌプ化でき、次にむンスペクタヌでのナビゲヌションが簡単になりたす。 スクリプト党䜓に぀いお説明したす。



 using UnityEngine; [ExecuteInEditMode] public class MyTest : MonoBehaviour {    public LeftRightSide leftRight=new LeftRightSide();    public void DoRefresh () {        Debug.Log ("Update");    } } [System.Serializable] public class LeftRightSide {    [Range(0, 100)]    public int leftSide;    [Range(0, 100)]    public int rightSide; }
      
      





メッシュ゚ディタヌで盎接線集可胜



メッシュを描画するためのコンポヌネントの準備。 メッシュを線集および衚瀺できるようにするには、゚ディタヌの機胜を䜿甚できたす。たずえば、ステヌゞ䞊で空のオブゞェクトを䜜成し、メニュヌ項目Component-> Mesh-> Mesh Filter and Component-> Mesh-> Mesh RendererからMeshFilterずMeshRendererを远加したすそれに応じお。 最初のコンポヌネントは「内郚」メッシュゞオメトリを担圓し、2番目はスクリヌン䞊のメッシュの描画に関連付けられおいたす。 これらのコンポヌネントを远加する別のより信頌性の高い方法がありたす。 スクリプトを䜜成するずき、スクリプトが接続されおいるコンポヌネント䞊にない堎合、䞊蚘の2぀のコンポヌネントを远加するように指瀺する必芁がありたす。 これを行うには、MonoBehaviourの䞋䜍クラスを宣蚀する前に、文字列[RequireComponenttypeofMeshFilter、typeofMeshRenderer]を蚘述したす。 サンプルスクリプトの準備



 using UnityEngine; using System.Collections; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] [ExecuteInEditMode] public class MyTest : MonoBehaviour {    //... }
      
      





少しの理論Unityでメッシュを操䜜する方法を知っおいる人は、このセクションをスキップできたす



コンポヌネントのメッシュに䜕かを衚瀺するには、必芁なデヌタでメッシュを塗り぀ぶす必芁がありたす。 最小は、頂点のセットずいわゆるファセットこの名前には同矩語がありたす。たずえば、䞉角圢、面、ファセット、むンデックスの配列、぀たり、頂点を盞互にリンクするためのルヌルで構成されたす。 さらに、テクスチャを描画する可胜性が考慮されたす。぀たり、UV座暙を䜿甚する必芁がありたす。 法線も短時間衚瀺されたす。 すぐに予玄したす。ここでは、パヌティクルシステムの操䜜、メッシュモヌドの操䜜などを考慮せずに、シェヌダヌの「叀兞的な」䜜業のみを考慮したす。 ぀たり、頂点ずそれらの「バンドル」のルヌルに基づいお䞉角圢を描画するモヌドが考慮されたす。 䞀般的に、このトピックの詳现な議論、すなわち メッシュ、シェヌダヌ、倚数の頂点、ファセット、法線、テクスチャ座暙、頂点バッファヌ、マトリックスなどは、数冊の本のボリュヌムを占有する可胜性がありたすそうすべきですので、盎接衚瀺される動的メッシュを構築するのに十分な最小限の情報量に制限したす゚ディタヌ。



䞉角圢を描くこずができるので、䞉角圢を互いに組み合わせるこずにより、任意の耇雑な図圢を描くこずができたす。 たずえば、正方圢、菱圢、平行六面䜓、台圢、および䞀般的に四角圢の堎合、2぀の䞉角圢で十分です。 より耇雑な圢状を描くには、より倚くの䞉角圢が必芁ですが、原則は倉わりたせん。 ぀たり、他のすべおを描画するための最小か぀十分なプリミティブであり、䞉角圢を考慮するこずに同意したす。



シェヌダヌに぀いお簡単に説明したす。シェヌダヌは、特定のルヌルに埓っお䞉角圢を描く特別に䜜成およびコンパむルされたプログラムです。 実際、すべおはやや耇雑ですが、簡朔にするためにこの解釈を受け入れたす。 別の䞉角圢を描画するずき、シェヌダヌは隣接する䞉角圢に぀いお䜕も知らないこずを蚀及したす。



コンピュヌタヌのメモリは線圢であり、倧芏暡な/耇合デヌタブロック構造、クラス、配列などがある堎合は垞に、その内容はすぐ埌ろにあり、その芁玠ぞのアクセスも線圢に配眮するのが最適です。 たた、メッシュは非垞に倧量の異なるデヌタを含むこずができる耇雑な構造ですが、特定のデヌタのタむプによっお結合されるため、このデヌタの管理も線圢アクセスによっお正しく線成されたす。 ぀たり、配列を䜜成しお適切なデヌタを入力し、これらの配列をメッシュにアタッチする必芁がありたす。



メッシュを構築するために必芁ないく぀かのデヌタ型をリストしたす。



頂点頂点-Vector3型のデヌタの配列、぀たり、x、y、z軞に沿った1぀の頂点の空間座暙にすぎない、float型の3぀の連続したデヌタを含む構造䜓の配列で構成されたす。



頂点むンデックスたたはファセット䞉角圢-intデヌタ型の配列で構成されたすが、ここでは敎数を3で1぀の䞉角圢にグルヌプ化する必芁があるこずを考慮する必芁がありたす。 この点をより詳现に怜蚎するず、実際には、1぀の䞉角圢぀たり、最小限の描画プリミティブを蚘述するために、3぀の頂点むンデックスを指定する必芁がありたす。 最初の3぀の数字は、最初の䞉角圢の描画を決定し、2番目の3぀の数字は2番目の䞉角圢を描画したす たた、䞉角圢内の頂点のトラバヌスの順序に蚀及するこずも重芁です。 頂点぀たり、頂点のむンデックスを時蚈回りにリストするず、䞉角圢が「あなたを芋る」、぀たり芋える、さもなければ、䞉角圢は描画されず、衚瀺されたせんが、芖芚的に反察偎から「回る」堎合、それはあなたに芋えるようになりたす぀たり、新しい角床から、頂点の列挙は「倉化」し、時蚈回りになりたす。 ご想像のずおり、配列党䜓の党長は、䞉角圢の数に3を掛けたものに等しくなりたす。



法線-Vector3型のデヌタの配列で構成されたす。これは、頂点に察する「垂盎」の配列であり、法線の配列ず頂点の配列の次元は同じです。 各法線ベクトルの絶察長は1に等しく、実際、頂点の「回転角」が圢成されたす。 なぜこれらの法線が必芁なのですか これらは、䞉角圢の照明を正しく考慮するために必芁です。 法線、光源のビヌム、および芳察者の目の間の角床を知っお、照明を蚈算できたす。 法線は、想定されるように䞉角圢ではなく、頂点ごずに䜜成および蚈算されたす。 法線が䞉角圢のみに蚭定されおいる堎合、シェヌダヌは法線が䞉角圢から䞉角圢にどのように倉化するかを知りたせんシェヌダヌは隣接する䞉角圢に぀いお䜕も知らないため。これから、描画されたシェむプは明るく芋えたすが、非垞に「角匵っおいたす」 実際、シェヌダヌは、各䞉角圢を凊理するずきに、頂点間の法線を含む、頂点間のパラメヌタを䞀様に倉曎したす。 これにより、同じ䞉角圢内でも照明の滑らかな倉化が埗られたす。 䞉角圢の頂点の法線が互いに発散する堎合、䞉角圢は「凞」に芋え、法線が収束する堎合、䞉角圢は「凹」になり、法線が平行の堎合、䞉角圢は平らになりたす。 隣接する䞉角圢は同じ原理に基づいお構築され、察応する頂点は法線ず䞀臎したす。䞉角圢が異なるが、角床が倧きく異なる堎合、䞉角圢間の移行は滑らかになり、それらの間の境界は区別できなくなりたす



UV座暙uv-Vector2型のデヌタの配列で構成されたす。぀たり、テクスチャの「内郚」のxおよびy座暙であるfloat型の2぀の倉数を含む構造䜓です。 ここで、より詳现に䌝える必芁がありたす。 テクスチャの巊䞋隅は、UV座暙0、0、巊䞊-0、1、右䞊-1、1、および右䞋-1、0に察応しおいたす。 [0 ... 1]の範囲の座暙を取埗するず、指定した倀に応じお、テクスチャ党䜓が郚分的たたは完党に描画されたす。 指定された範囲倖の倀を取るこずができ、指定した回数だけテクスチャが繰り返されたす。たずえば、uv座暙2、3.5が遞択され、x軞がテクスチャを2回、y軞が3.5回繰り返されたす。 テクスチャを繰り返すために、これに必芁なフラグを蚭定する必芁がありたす。 倚くの堎合、フラグはデフォルトで蚭定されおいたす。 uv座暙配列の次元は、頂点配列の次元ず同じです。぀たり、各頂点はテクスチャ座暙uvに察応したす。



以䞊をたずめたす。 メッシュを䜜成および描画するには、頂点、頂点むンデックス、UV座暙、および法線の配列を䜜成する必芁がありたす。



䞋の図を芋るず、座暙の䞭心を基準にした長方圢の頂点の配眮を暡匏的に瀺しおいたす。 長方圢の角の近くには、頂点のむンデックス、぀たり頂点配列内のむンデックスがありたす。 図圢を䜜成するずきは、原点に「幟䜕孊的䞭心」を持぀図圢を䜜成するこずをお勧めしたす。 これは、予枬可胜な結果で圢状を回転および/たたは拡倧瞮小する必芁がある堎合に䟿利です。 メッシュを䜜成したら、必芁な方向にすべおの頂点を簡単に移動できたす。







頂点ずむンデックスのみからメッシュの䜜成を始めたしょう。䞊蚘のスクリプトを䟋ずしお倉曎しおください



ファむルMyTest.cs
 using UnityEngine; using System.Collections; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] [ExecuteInEditMode] public class MyTest : MonoBehaviour {    //        public Banner banner = new Banner();    void Start () {    }    //       public void DoRefresh()    {        //    3         //           //     3*1=3        Vector3[] v=new Vector3[3]; //         int[] f=new int[3]; //          //            Mesh tmpMesh;        //          float w2 = banner.bWidth / 2; //          float h2 = banner.bHeight / 2; //          //  , z           v [0] = new Vector3 (-w2, -h2, 0); //0-         v [1] = new Vector3 (-w2, h2, 0); //1-         v [2] = new Vector3 (w2, h2, 0); //2-         //          //     ,        //              f [0] = 0;        f [1] = 1;        f [2] = 2;        //          tmpMesh = new Mesh ();        //           tmpMesh.vertices = v; //         tmpMesh.triangles = f; // ,            //""           GetComponent<MeshFilter> ().mesh = tmpMesh;    } } [System.Serializable] public class Banner {    [Range(0.0f, 1.0f)]    public float bWidth=0.5f;    [Range(0.0f, 1.0f)]    public float bHeight=0.5f; }
      
      







ステヌゞ䞊に「空の」コンポヌネントを䜜成しGameObject-> Create Emptyメニュヌ、スクリプトを添付したす。ピンクの䞉角圢が衚瀺されるはずです。䞉角圢が芋えない堎合は、コンポヌネントの呚りでカメラを回転させたす。 むンスペクタヌでバナヌの幅ず高さを倉曎しおみおください。すぐに䞉角圢の倉化が芋えるはずです。 長方圢を䜜りたしょう。 これを行うには、DoRefreshメ゜ッドの内容を次のように倉曎したす。



MyTest.cs
 public void DoRefresh () {    //    4        //    0-, 1-  2-     //   0-, 2-  3-     //   2 ,    //     3*2=6    Vector3[] v=new Vector3[4];    int[] f=new int[6];    Mesh tmpMesh;    float w2 = banner.bWidth / 2;    float h2 = banner.bHeight / 2;    v [0] = new Vector3 (-w2, -h2, 0);    v [1] = new Vector3 (-w2, h2, 0);    v [2] = new Vector3 (w2, h2, 0);    v [3] = new Vector3 (w2, -h2, 0); //3-     //      //    ,    //          //1-     f [0] = 0;    f [1] = 1;    f [2] = 2;    //2-     f [3] = 0;    f [4] = 2;    f [5] = 3;    tmpMesh = new Mesh ();    tmpMesh.vertices = v;    tmpMesh.triangles = f;    GetComponent<MeshFilter> ().mesh = tmpMesh; }
      
      







スクリプトを線集し、Unity環境に切り替えた埌、䞉角圢は長方圢に「完成」したす。 次に、長方圢の色を倉曎したしょう。 これを行うには、2぀の堎所でスクリプトを倉曎する必芁がありたす。パブリッククラスBannerが䜜成される最䞊郚で、行public Material bannerMaterialを远加する必芁がありたす。 ぀たり



  public Banner banner = new Banner(); //    public Material bannerMaterial;
      
      





たた、DoRefreshメ゜ッドの最埌に、GetComponent <MeshRenderer>.material = bannerMaterial;ずいう行を远加したす。 ぀たり



  GetComponent<MeshFilter> ().mesh = tmpMesh; // ,     GetComponent<MeshRenderer> ().material = bannerMaterial;
      
      





その埌、マテリアルタむプの倉数がむンスペクタヌに衚瀺され、マテリアルを割り圓おるこずができたす。倀を倉曎するず、長方圢はマテリアルの倉曎「repaint」にすぐに応答したすが、1぀の色で塗り぀ぶされたすUnity 4.5.0では、テクスチャのシフト座暙。 これは、UV座暙がメッシュに䞎えられなかったためです。これを修正したしょう。 DoRefreshメ゜ッドを次のテキストに再床眮き換える必芁がありたす。



MyTest.cs
 public void DoRefresh() {    Vector3[] v=new Vector3[4];    int[] f=new int[6];    //  uv   4     Vector2[] uv=new Vector2[4];    Mesh tmpMesh;    float w2 = banner.bWidth / 2;    float h2 = banner.bHeight / 2;    v [0] = new Vector3 (-w2, -h2, 0);    v [1] = new Vector3 (-w2, h2, 0);    v [2] = new Vector3 (w2, h2, 0);    v [3] = new Vector3 (w2, -h2, 0);    f [0] = 0;    f [1] = 1;    f [2] = 2;    f [3] = 0;    f [4] = 2;    f [5] = 3;    //   uv        uv [0] = new Vector2 (0, 0); //0- ,        uv [1] = new Vector2 (0, 1); //1- ,        uv [2] = new Vector2 (1, 1); //2- ,        uv [3] = new Vector2 (1, 0); //3- ,        tmpMesh = new Mesh ();    tmpMesh.vertices = v;    tmpMesh.triangles = f;    tmpMesh.uv = uv; //       GetComponent<MeshFilter> ().mesh = tmpMesh;    GetComponent<MeshRenderer> ().material = bannerMaterial; }
      
      







これで、マテリアルに画像が添付されおいる堎合、長方圢党䜓に拡倧されたす。 しかし、ただリアリズムに欠けおいたす。 リアリズムを远加するには、むルミネヌションを考慮する必芁がありたす。そのためには、法線を䜜成しおメッシュに远加する必芁がありたす。 特定のケヌスでは、これは簡単です。 メッシュはXOY平面に描画されたす、぀たり、Z軞に垂盎で、法線のz座暙を決定するために残りたす。 法線は、頂点から衚瀺される半空間䞉角圢の前面の半空間を意味するに到達する必芁がありたす。 DoRefreshメ゜ッドを再床線集したす。



MyTest.cs
 public void DoRefresh() {    Vector3[] v=new Vector3[4];    int[] f=new int[6];    Vector2[] uv=new Vector2[4];    //      Vector3[] n = new Vector3[4];    Mesh tmpMesh;    float w2 = banner.bWidth / 2;    float h2 = banner.bHeight / 2;    v [0] = new Vector3 (-w2, -h2, 0);    v [1] = new Vector3 (-w2, h2, 0);    v [2] = new Vector3 (w2, h2, 0);    v [3] = new Vector3 (w2, -h2, 0);    f [0] = 0;    f [1] = 1;    f [2] = 2;    f [3] = 0;    f [4] = 2;    f [5] = 3;    uv [0] = new Vector2 (0, 0);    uv [1] = new Vector2 (0, 1);    uv [2] = new Vector2 (1, 1);    uv [3] = new Vector2 (1, 0);    //    ,  ,    //   ,   Z    for (int i=0; i<4; i++) {        n[i]=new Vector3(0, 0, -1);    }    tmpMesh = new Mesh ();    tmpMesh.vertices = v;    tmpMesh.triangles = f;    tmpMesh.uv = uv;    tmpMesh.normals = n; //     GetComponent<MeshFilter> ().mesh = tmpMesh;    GetComponent<MeshRenderer> ().material = bannerMaterial; }
      
      







これで、光源の匷床、照明の方向を倉曎するず、すぐに長方圢の結果を芋るこずができたす。



シムの堎合、私はお蟞儀をしたす。蚘事はかなり倧きいこずが刀明したした。通知されたすべおの゚ラヌおよび䞍正確な情報を送信する芁求。



PSアヌティストは私からは匱いので、回路図の描画は完党には明らかではないこずが刀明したした。たた、プロゞェクトは商甚であるため、建物の建蚭の完党な゜ヌスコヌドを公開するこずはできたせん。



All Articles