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

投稿者: | 2020-03-19


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

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

片方を変形します。

4種類作りました。

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

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

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

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

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

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

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

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

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

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

スクリプトで差し替える

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

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5.  
  6. public class GameScript : MonoBehaviour
  7. {
  8. public Image image;
  9. public GameObject noodle;
  10. public Text text;
  11.  
  12. public Mesh noodle1;
  13. public Mesh noodle2;
  14. public Mesh noodle3;
  15. public Mesh noodle4;
  16.  
  17. public Texture img1;
  18. public Texture img2;
  19. public Texture img3;
  20. public Texture img4;
  21.  
  22.  
  23. MeshFilter meshFilter;
  24. MeshRenderer meshRenderer;
  25.  
  26. // Start is called before the first frame update
  27. void Start()
  28. {
  29. meshFilter = noodle.GetComponent<MeshFilter>();
  30. meshRenderer = noodle.GetComponent<MeshRenderer>();
  31. }
  32.  
  33. // Update is called once per frame
  34. void Update()
  35. {
  36. if (image.fillAmount > 0.5f)
  37. {
  38. image.color = Color.green;
  39. meshFilter.mesh = noodle1;
  40. meshRenderer.material.SetTexture("_BaseMap", img1);
  41. }
  42. else if (image.fillAmount > 0.2f)
  43. {
  44.  
  45. image.color = new Color(1f, 0.67f, 0f);
  46.  
  47. meshFilter.mesh = noodle2;
  48. meshRenderer.material.SetTexture("_BaseMap", img2);
  49.  
  50. }
  51. else if(image.fillAmount > 0f)
  52. {
  53.  
  54. image.color = Color.red;
  55. meshFilter.mesh = noodle3;
  56. meshRenderer.material.SetTexture("_BaseMap", img3);
  57. }
  58. else
  59. {
  60.  
  61. meshFilter.mesh = noodle4;
  62. meshRenderer.material.SetTexture("_BaseMap", img4);
  63. }
  64.  
  65.  
  66. if (Input.GetMouseButton(0))
  67. {
  68. if (image.fillAmount != 1f)
  69. {
  70. text.text = "[注入中...]";
  71. }
  72.  
  73. image.fillAmount += Time.deltaTime;
  74.  
  75. }
  76. }
  77. }

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

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

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

コメントを残す

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