【Unity】モデルをスクリプトで差し替える方法

投稿者: | 2020-03-19


スクリプトで、同じオブジェクトのモデルとマテリアルを差し替えてみます。

Blenderで料理のメッシュを作ってコピーしました。

片方を変形します。

4種類作りました。

これらを別々にUV展開して色を付けます。

Unityにもってきてシーンに配置します。

一番量が多いものだけをProjectにドラッグアンドドロップしてプレハブ化しました。

それ以外はシーンから削除します。

インポートしたアセットを開くと、4種類のメッシュがあります。

画像もインポートしました。

メッシュの1つを、シーン上に残っているオブジェクトのMeshFilterコンポーネントのMeshにドラッグアンドドロップします。

また、新規マテリアルを付けて、Base Mapにこのメッシュに対応する画像をドラッグアンドドロップします。

すると、オブジェクトのモデルと色が変わりました。

他のメッシュやテクスチャも同じ様にアタッチできます。

スクリプトで差し替える

前の記事の方法でゲージを作って、その値によってモデルとテクスチャを差し替えてみます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameScript : MonoBehaviour
{
    public Image image;
    public GameObject noodle;
    public Text text;

    public Mesh noodle1;
    public Mesh noodle2;
    public Mesh noodle3;
    public Mesh noodle4;

    public Texture img1;
    public Texture img2;
    public Texture img3;
    public Texture img4;


    MeshFilter meshFilter;
    MeshRenderer meshRenderer;

    // Start is called before the first frame update
    void Start()
    {
        meshFilter = noodle.GetComponent<MeshFilter>();
        meshRenderer = noodle.GetComponent<MeshRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        if (image.fillAmount > 0.5f)
        {
            image.color = Color.green;
            meshFilter.mesh = noodle1;
            meshRenderer.material.SetTexture("_BaseMap", img1);
        }
        else if (image.fillAmount > 0.2f)
        {

            image.color = new Color(1f, 0.67f, 0f);

            meshFilter.mesh = noodle2;
            meshRenderer.material.SetTexture("_BaseMap", img2);

        }
        else if(image.fillAmount > 0f)
        {

            image.color = Color.red;
            meshFilter.mesh = noodle3;
            meshRenderer.material.SetTexture("_BaseMap", img3);
        }
        else
        {

            meshFilter.mesh = noodle4;
            meshRenderer.material.SetTexture("_BaseMap", img4);
        }


        if (Input.GetMouseButton(0))
        {
            if (image.fillAmount != 1f)
            {
                text.text = "[注入中...]";
            }

            image.fillAmount += Time.deltaTime;         

        }
    }
}

ゲージのFill Amountの0f~1fの値に合わせてメッシュとテクスチャを、MeshFilterコンポーネントとMeshRendererコンポーネントに入れます。

プレイヤーに付けたスクリプトからレイを飛ばして、近くで皿に当たるときに「E」を押すとゲージが減って、マウスの左クリックを押すとゲージが増えます。

ゲージのCanvasは、Render ModeをWorld Spaceにして、3Dで表示しています。

コメントを残す

メールアドレスが公開されることはありません。