MRが楽しい

MRやVRについて学習したことを書き残す

Unityで面ごとにUVを設定したオブジェクトを作成する その2(折り返しで面ごとにテクスチャを設定する)

本日は Unity の調査枠です。
Unity で面ごとにUVを設定したオブジェクトを作成する方法について確認したので記事に残します。

前回記事

本記事は以下の前回記事の続きになります。
以下の記事で紹介した Unity で面ごとにUVを設定したオブジェクトを作成する手順の別パターンの確認になります。
bluebirdofoz.hatenablog.com

折り返しで面ごとにテクスチャを設定する

UV座標の設定を面ごとに折り返して設定することでも、面ごとのテクスチャ設定が行えます。
こちらの方法であれば前回の手法と異なり、以下の通り頂点の数も増やす必要はありません。
・UVMakeTest3.cs

sing System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class UVMakeTest3 : MonoBehaviour
{
    public Material setMaterial;

    void Start()
    {
        // メッシュを作成
        Mesh mesh = new Mesh();

        // 頂点リストを作成
        List<Vector3> vertices = new List<Vector3>
        {
            new Vector3(0.5f, 0.0f, -0.5f),
            new Vector3(1.0f, 0.0f, -1.0f),
            new Vector3(-0.5f, 0.0f, -0.5f),
            new Vector3(-1.0f, 0.0f, -1.0f),
            new Vector3(-0.5f, 0.0f, 0.5f),
            new Vector3(-1.0f, 0.0f, 1.0f),
            new Vector3(0.5f, 0.0f, 0.5f),
            new Vector3(1.0f, 0.0f, 1.0f),
        };

        // UV座標リストを作成
        List<Vector2> uvs = new List<Vector2>
        {
            // UV座標を折り返すように割り当てていく
            new Vector2(0.0f, 0.0f),
            new Vector2(0.0f, 1.0f),
            new Vector2(1.0f, 0.0f),
            new Vector2(1.0f, 1.0f),
            new Vector2(0.0f, 0.0f),
            new Vector2(0.0f, 1.0f),
            new Vector2(1.0f, 0.0f),
            new Vector2(1.0f, 1.0f),
        };
        
        // 面を構成するインデックスリストを作成
        List<int> triangles = new List<int> {
            0, 1, 2,
            3, 2, 1,
            2, 3, 4,
            5, 4, 3,
            4, 5, 6,
            7, 6, 5,
            6, 7, 0,
            1, 0, 7,
        };

        // メッシュに頂点を登録する
        mesh.SetVertices(vertices);

        // メッシュにUV座標を登録する
        mesh.SetUVs(0, uvs);

        // メッシュに面を構成するインデックスリストを登録する
        mesh.SetTriangles(triangles, 0);

        // 作成したメッシュをメッシュフィルターに設定する
        MeshFilter meshFilter = this.AddComponent<MeshFilter>();
        meshFilter.mesh = mesh;
        
        // マテリアルを設定する
        MeshRenderer meshRenderer = this.AddComponent<MeshRenderer>();
        meshRenderer.material = setMaterial;
    }
}

実行結果は以下の通りです。
面を分けていた前回記事と異なり、こちらはUVを折り返しているため、一部の面でテクスチャが反転するという問題が発生します。

左右対称なテクスチャであればこちらの方法で問題ありませんが、もし左右非対称なテクスチャを利用する場合は前回記事の手法を参照してください。