中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

【Unity】CUBEの6面にそれぞれ異なるテクスチャを貼り付ける

デフォルトで用意されているCUBEにテクスチャを貼り付けると
上下が反転してしまう面が存在してしまいます。
また、面毎に異なるテクスチャを貼り付けることも出来ないので
これを解決するために、自作でCUBEを作成してみました。
【customCube】というGameObjectを作成し
面として【Quad】を6面に貼り付けます。
順番としては
【正面】【右面】【左面】【背面】【上面】【下面】
の順番になっています。
貼り付けるテクスチャはローカルパスからそれぞれ読み込んでいます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class test : MonoBehaviour
{
    private float[,] SURFACE_POS = new float[,] { { 0f, 0f, -0.5f }, { 0.5f, 0f, 0f }, { -0.5f, 0f, 0f }, { 0f, 0f, 0.5f }, { 0f, 0.5f, 0f }, { 0f, -0.5f, 0f } };
    private float[,] SURFACE_ROT = new float[,] { { 0f, 0f, 0f }, { 0f, 270f, 0f }, { 0f, 90f, 0f }, { 0f, 180f, 0f }, { 90f, 0f, 0f }, { 270f, 0f, 0f } };
    // Start is called before the first frame update
    void Start()
    {
        GameObject customCube = new GameObject();
        for (int i = 0; i < 6; i++)
        {
            // 貼り付けるテクスチャを読み込み
            Texture2D tex = new Texture2D(1, 1);
            tex.LoadImage(LoadBytes(@"C:\work\" + (i + 1).ToString() + ".png"));

            // CUBEの面を設定
            GameObject tmpQuad = GameObject.CreatePrimitive(PrimitiveType.Quad);
            tmpQuad.transform.position = new Vector3(SURFACE_POS[i, 0], SURFACE_POS[i, 1], SURFACE_POS[i, 2]);
            tmpQuad.transform.rotation = Quaternion.Euler(SURFACE_ROT[i, 0], SURFACE_ROT[i, 1], SURFACE_ROT[i, 2]);
            tmpQuad.transform.localScale = new Vector3(1, 1, 1);
            tmpQuad.GetComponent<Renderer>().material.mainTexture = tex;
            tmpQuad.transform.parent = customCube.transform;
            tmpQuad.GetComponent<MeshCollider>().convex = true;
            Shader shader = Shader.Find("Transparent/Diffuse");
            tmpQuad.GetComponent<Renderer>().material.shader = shader;
        }
            
    }

    byte[] LoadBytes(string path)
    {
        FileStream fs = new FileStream(path, FileMode.Open);
        BinaryReader bin = new BinaryReader(fs);
        byte[] result = bin.ReadBytes((int)bin.BaseStream.Length);
        bin.Close();
        return result;
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}


実行結果は下図のようになります。

f:id:tsu--kun:20190628193052p:plain