MaterialのTiling(タイリング)を操作する
About
MaterialをAssetsから生成し、オブジェクトに適用してInspectorビューからそのTiling(タイリング・繰り返し)やOffset(開始点)を編集する、という手順がUnity上で行う一般的なオブジェクトの生成法です。例えば壁面を生成する場合などには、Cubeに適当な壁面テクスチャを当てたMaterialを適用します。
しかしながら壁面などの物体を動的に生成する場合、そのサイズは一定とは限りません(もしかしたら高さは一定かもしれませんが)。例えば幅が1メートルの標準的な壁面と、幅が2mの壁面を用意するとします。1メートルの壁面を3メートルに拡大して追加すると、テクスチャも伸びてしまい、外観に差が出ます。
そこでスクリプトによって動的にTilingを変更することが考えられます。
How To
GameObjectに適用済みのMaterialを取得する場合には、GameObject.render.materialにアクセスします。Materialクラスは様々なパラメータを操作する機能を実装しているので、詳細は公式のリファレンスを確認してください。
MaterialクラスにはInspectorビューで表記されるようなTilingと名前が付けられたフィールド(プロパティ)が存在しないことに注意します。同等の機能は、Material.mainTextureScaleによって設定します。値はVector2で設定しますが、そのXとYがそれぞれTilingのXとYに対応します。
GameObject gameObject; gameObject.renderer.material.mainTextureScale = new Vector2(1, 1); //gameObject.renderer.material.mainTextureScale = new Vector2(2, 1); //gameObject.renderer.material.mainTextureScale = new Vector2(2, 2);
(1,1)を初期状態として、左の図が(2,1)、右の図が(2,2)です。
参照先に注意する
[A : GameObjectに適用済みのマテリアルを参照してmainTextureScaleを変更する場合]と、[B : (あるマテリアルを用意して、そのマテリアルのmainTextureScaleを変更する場合]とでは挙動が異なるので注意する必要があります。
Material sampleMaterial; GameObject gameObject; … gameObject.renderer.material = sampleMaterial; … //[A] gameObject.renderer.material.mainTextureScale = new Vector2(2, 1); //[B] sampleMaterial.mainTextureScale = new Vector2(2, 1);
[A]の場合には、対象のGameObjectのMaterial(外観)のみが変更されます。一方で[B]の場合には、同じMaterial(ここではsampleMaterial)を参照する全てのGameObjectの外観が変更されます。個別に変更したい場合と、一斉に変更したい場合とで、シチュエーションによって実装方法を切り替えていく必要があります。
パフォーマンスについては検討していませんが、オブジェクトごとに変更が適用される場合には、Materialのデータが複製されている可能性が高いですよね。メモリ消費量などについては十分気を付ける必要があるかもしれません。