統合グラフィック カードの最適化
シェーダ: ShaderLab と固定関数シェーダ

サンプル - ビルボード平面の作成

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Sumbission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

Unityは Plane および Quad プリミティブ オブジェクトにより平面を表現できます(詳細については プリミティブ オブジェクト ページを参照して下さい)。しかし,最小限の平面メッシュを作成できる方法を理解するのは便利なことであり,最小の平面は 4つの頂点により二つの三角形とその角から構成されます。

最初に頂点配列セットします。平面が X および Y 軸にあるとして,幅と高さをパラメータ変数により決定できるようにします。頂点は,左下,右下,左上,右上の順に提供します。

var vertices: Vector3[] = new Vector3[4];

vertices[0] = new Vector3(0, 0, 0);
vertices[1] = new Vector3(width, 0, 0);
vertices[2] = new Vector3(0, height, 0);
vertices[3] = new Vector3(width, height, 0);

mesh.vertices = vertices;

(メッシュデータ プロパティは裏でコードを実行するため,データを独自の配列の中でセットアップしてそれからこれをプロパティに割り当てるほうが,このプロパティの配列を要素ごとにアクセスするよりも効率的です。)

次は三角形の順番です。2つの三角形が必要であり,各々3つの整数から定義され,三角形の配列は合計6つの要素を持つことになります。角を定義する際に時計回りに並べるルールからすると,左下の三角形は 0 ,2 ,1 を頂点のインデックスとして,右上の三角形は 2 , 3 , 1を使用します。

var tri: int[] = new int[6];

//  Lower left triangle.
tri[0] = 0;
tri[1] = 2;
tri[2] = 1;

//  Upper right triangle.   
tri[3] = 2;
tri[4] = 3;
tri[5] = 1;

mesh.triangles = tri;

頂点と三角形だけのメッシュでセットアップしたメッシュはエディターで見れるようになりますが,法線で正しくシェーディングしないと見栄えは悪くなります。平面の法線は非常に簡単です - それらは同一のものであり,平面のローカル座標で負の Z 方向に向きます。法線を追加すると平面は正しくシェーディングされますが,シーンにライトがないと効果が見られないことを忘れないで下さい。

var normals: Vector3[] = new Vector3[4];

normals[0] = -Vector3.forward;
normals[1] = -Vector3.forward;
normals[2] = -Vector3.forward;
normals[3] = -Vector3.forward;

mesh.normals = normals;

最後に,メッシュにテクスチャ座標を追加することでマテリアルを正しく表示します。平面に渡って画像全体を表示すると仮定すると, UV 値はテクスチャの角に対応して すべて 0 または 1となります。

var uv: Vector2[] = new Vector2[4];

uv[0] = new Vector2(0, 0);
uv[1] = new Vector2(1, 0);
uv[2] = new Vector2(0, 1);
uv[3] = new Vector2(1, 1);

mesh.uv = uv;

スクリプト全体は次のような形かもしれません:-

var width: float;
var height: float;

function Start() {  
    var mf: MeshFilter = GetComponent(MeshFilter);
    var mesh = new Mesh();
    mf.mesh = mesh;
    
    var vertices: Vector3[] = new Vector3[4];
    
    vertices[0] = new Vector3(0, 0, 0);
    vertices[1] = new Vector3(width, 0, 0);
    vertices[2] = new Vector3(0, height, 0);
    vertices[3] = new Vector3(width, height, 0);
    
    mesh.vertices = vertices;
    
    var tri: int[] = new int[6];

    tri[0] = 0;
    tri[1] = 2;
    tri[2] = 1;
    
    tri[3] = 2;
    tri[4] = 3;
    tri[5] = 1;
    
    mesh.triangles = tri;
    
    var normals: Vector3[] = new Vector3[4];
    
    normals[0] = -Vector3.forward;
    normals[1] = -Vector3.forward;
    normals[2] = -Vector3.forward;
    normals[3] = -Vector3.forward;
    
    mesh.normals = normals;
    
    var uv: Vector2[] = new Vector2[4];

    uv[0] = new Vector2(0, 0);
    uv[1] = new Vector2(1, 0);
    uv[2] = new Vector2(0, 1);
    uv[3] = new Vector2(1, 1);
    
    mesh.uv = uv;
}

もしコードが一回 Start 関数で実行されるとメッシュはゲームを通して同じとなることに留意して下さい。一方で, Update 関数の中にコードを入れてメッシュを毎フレーム変更することも容易です(ただし,これは CPU オーバーヘッドを著しく増加させます)。

統合グラフィック カードの最適化
シェーダ: ShaderLab と固定関数シェーダ