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

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

【Unity】動的に3Dオブジェクトを作成し、ローカルから読み込んだテクスチャを貼りつけるスクリプト

1.概要

Unityではオブジェクトを作成するとき
エディタ上で作業をすることが多いと思います。

ですが、スクリプトから動的に作成する必要がある場面もあります。
ここではで動的に3Dオブジェクト(Quad)を作成し、
更にローカルパスから画像を選択し、それをテクスチャとして貼り付けています。

開発環境:Unity 2018.3.8f1 (64-bit)
開発言語:C#

2.準備する

まずは適当なプロジェクトを作成します。
作成したら【Hieraechy】を右クリックし
【Create Empty】で空のゲームオブジェクトを作ります。
f:id:tsu--kun:20190924103731p:plain


【GameObject】が出来るのでこれに
【Inspector】から【New script】を追加します。
今回は【makeQuad】という名前で追加しました。
f:id:tsu--kun:20190924103746p:plain


これで準備は完了です。

3.スクリプト

先程作成した【makeQuad】を下記のように変更します。

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

public class makeQuad : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        // ローカルパスから画像を読み込みbyte型へ変換
        FileStream fs = new FileStream(@"C:\test\test.png", FileMode.Open);
        BinaryReader bin = new BinaryReader(fs);
        byte[] result = bin.ReadBytes((int)bin.BaseStream.Length);
        bin.Close();

        // テクスチャを読み込み
        Texture2D tex = new Texture2D(1, 1);
        tex.LoadImage(result);

        // 3Dオブジェクトを作成しテクスチャ貼り付け
        GameObject tmpQuad = GameObject.CreatePrimitive(PrimitiveType.Quad);
        tmpQuad.transform.position = new Vector3(0, 0, 0);
        tmpQuad.transform.rotation = Quaternion.Euler(0, 0, 0);
        tmpQuad.transform.localScale = new Vector3(1, 1, 1);
        tmpQuad.GetComponent<Renderer>().material.mainTexture = tex;
    }

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

4.結果

結果は下図のとおりになりました。
f:id:tsu--kun:20190924103800p:plain


Quadがスクリプトから生成されて
更にテクスチャを貼ることが出来ました。