質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3997閲覧

Unity Sprite 取得方法とマテリアルの作成

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2018/01/17 21:06

編集2018/01/17 21:08

以下のコードでは、12行目のVector2[,] blockUVsで座標を指定してMultiple Spriteを取得しているのですが、別のマテリアルを使いたいと思っているので、なにか良い方法はないでしょうか?どのようにコードを書けばいいのかを知りたいです。
マップチップのように、画像がいくつもある状態になっています。
イメージ説明
これとは別の一枚だけテクスチャが貼ってある状態のマテリアルを使おうとしていますが、どう書けばいいのかが分かりません。複数のテクスチャを用いて、Sprite Atlasを作り、それをマテリアルにする方法もあれば教えてもらいたいです。
回答よろしくお願いします。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class CreateQuads : MonoBehaviour { 6 7 public Material cubeMaterial; 8 public BlockType bType; 9 10 enum Cubeside { BOTTOM,TOP,LEFT,RIGHT,FRONT,BACK}; 11 public enum BlockType { GRASS, DIRT, STONE }; 12 Vector2[,] blockUVs = 13 { 14 {new Vector2(0.125f,0.375f),new Vector2(0.1875f,0.375f),new Vector2(0.125f,0.4375f),new Vector2(0.1875f,0.4375f) }, 15 {new Vector2(0.1875f,0.9375f),new Vector2(0.25f,0.9375f),new Vector2(0.1875f,1.0f),new Vector2(0.25f,1.0f) }, 16 {new Vector2(0.125f,0.9375f),new Vector2(0.1875f,0.9375f),new Vector2(0.125f,1.0f),new Vector2(0.1875f,1.0f) }, 17 {new Vector2(0,0.875f),new Vector2(0.0625f,0.875f),new Vector2(0,0.9375f),new Vector2(0.0625f,0.9375f) }, 18 19}; 20 21void CreateQuad(Cubeside side) 22 { 23 Mesh mesh = new Mesh(); 24 mesh.name = "ScriptMesh"; 25 26 Vector3[] vertices = new Vector3[4]; 27 Vector3[] normals = new Vector3[4]; 28 Vector2[] uvs = new Vector2[4]; 29 int[] triangels = new int[6]; 30 31 Vector2 uv00; //= new Vector2(0f, 0f); 32 Vector2 uv10; //= new Vector2(1f, 0f); 33 Vector2 uv01; //= new Vector2(0f, 1f); 34 Vector2 uv11; //= new Vector2(1f, 1f); 35 36 if(bType == BlockType.GRASS && side == Cubeside.TOP) 37 { 38 uv00 = blockUVs[0, 0]; 39 uv10 = blockUVs[0, 1]; 40 uv01 = blockUVs[0, 2]; 41 uv11 = blockUVs[0, 3]; 42 }else if(bType == BlockType.GRASS && side == Cubeside.BOTTOM) 43 { 44 uv00 = blockUVs[(int)(BlockType.DIRT + 1), 0]; 45 uv10 = blockUVs[(int)(BlockType.DIRT + 1), 1]; 46 uv01 = blockUVs[(int)(BlockType.DIRT + 1), 2]; 47 uv11 = blockUVs[(int)(BlockType.DIRT + 1), 3]; 48 } 49 else 50 { 51 uv00 = blockUVs[(int)(bType + 1), 0]; 52 uv10 = blockUVs[(int)(bType + 1), 1]; 53 uv01 = blockUVs[(int)(bType + 1), 2]; 54 uv11 = blockUVs[(int)(bType + 1), 3]; 55 } 56 57 Vector3 p0 = new Vector3(-0.5f,-0.5f,0.5f); 58 Vector3 p1 = new Vector3(0.5f, -0.5f,0.5f); 59 Vector3 p2 = new Vector3(0.5f, -0.5f,-0.5f); 60 Vector3 p3 = new Vector3(-0.5f, -0.5f,-0.5f); 61 Vector3 p4 = new Vector3(-0.5f, 0.5f, 0.5f); 62 Vector3 p5 = new Vector3(0.5f, 0.5f, 0.5f); 63 Vector3 p6 = new Vector3(0.5f, 0.5f, -0.5f); 64 Vector3 p7 = new Vector3(-0.5f, 0.5f, -0.5f); 65 66 switch (side) 67 { 68 case Cubeside.BOTTOM: 69 vertices = new Vector3[] { p0, p1, p2, p3 }; 70 normals = new Vector3[] { Vector3.down, Vector3.down, Vector3.down, Vector3.down }; 71 uvs = new Vector2[] { uv11, uv01, uv00, uv10 }; 72 triangels = new int[] { 3, 1, 0, 3, 2, 1 }; 73 break; 74 case Cubeside.TOP: 75 vertices = new Vector3[] { p7, p6, p5, p4 }; 76 normals = new Vector3[] { Vector3.up, Vector3.up, Vector3.up, Vector3.up }; 77 uvs = new Vector2[] { uv11, uv01, uv00, uv10 }; 78 triangels = new int[] { 3, 1, 0, 3, 2, 1 }; 79 break; 80 case Cubeside.LEFT: 81 vertices = new Vector3[] { p7, p4, p0, p3 }; 82 normals = new Vector3[] { Vector3.left, Vector3.left, Vector3.left, Vector3.left }; 83 uvs = new Vector2[] { uv11, uv01, uv00, uv10 }; 84 triangels = new int[] { 3, 1, 0, 3, 2, 1 }; 85 break; 86 case Cubeside.FRONT: 87 vertices = new Vector3[] { p4, p5, p1, p0 }; 88 normals = new Vector3[] { Vector3.forward, Vector3.forward, Vector3.forward, Vector3.forward }; 89 uvs = new Vector2[] { uv11, uv01, uv00, uv10 }; 90 triangels = new int[] { 3, 1, 0, 3, 2, 1 }; 91 break; 92 case Cubeside.BACK: 93 vertices = new Vector3[] { p6, p7, p3, p2 }; 94 normals = new Vector3[] { Vector3.back, Vector3.back, Vector3.back, Vector3.back }; 95 uvs = new Vector2[] { uv11, uv01, uv00, uv10 }; 96 triangels = new int[] { 3, 1, 0, 3, 2, 1 }; 97 break; 98 case Cubeside.RIGHT: 99 vertices = new Vector3[] { p5, p6, p2, p1 }; 100 normals = new Vector3[] { Vector3.right, Vector3.right, Vector3.right, Vector3.right }; 101 uvs = new Vector2[] { uv11, uv01, uv00, uv10 }; 102 triangels = new int[] { 3, 1, 0, 3, 2, 1 }; 103 break; 104 } 105 106 //vertices = new Vector3[] { p4, p5, p1, p0 }; 107 //normals = new Vector3[] {Vector3.forward, 108 // Vector3.forward, 109 // Vector3.forward, 110 // Vector3.forward}; 111 112 //uvs = new Vector2[] { uv11, uv01, uv00, uv10 }; 113 //triangels = new int[] { 3, 1, 0, 3, 2, 1 }; 114 115 mesh.vertices = vertices; 116 mesh.normals = normals; 117 mesh.uv = uvs; 118 mesh.triangles = triangels; 119 120 mesh.RecalculateBounds(); 121 122 GameObject quad = new GameObject("quad"); 123 quad.transform.parent = this.gameObject.transform; 124 MeshFilter meshFilter = (MeshFilter)quad.AddComponent(typeof(MeshFilter)); 125 meshFilter.mesh = mesh; 126 MeshRenderer renderer = quad.AddComponent(typeof(MeshRenderer)) as MeshRenderer; 127 renderer.material = cubeMaterial; 128 } 129 130 void CombineQuads() 131 { 132 MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(); 133 CombineInstance[] combine = new CombineInstance[meshFilters.Length]; 134 int i = 0; 135 while (i < meshFilters.Length) 136 { 137 combine[i].mesh = meshFilters[i].sharedMesh; 138 combine[i].transform = meshFilters[i].transform.localToWorldMatrix; 139 i++; 140 } 141 MeshFilter mf = (MeshFilter)this.gameObject.AddComponent(typeof(MeshFilter)); 142 mf.mesh = new Mesh(); 143 144 mf.mesh.CombineMeshes(combine); 145 146 MeshRenderer renderer = this.gameObject.AddComponent(typeof(MeshRenderer)) as MeshRenderer; 147 renderer.material = cubeMaterial; 148 149 foreach (Transform quad in this.transform) 150 Destroy(quad.gameObject); 151 } 152 153 void CreateCube() 154 { 155 CreateQuad(Cubeside.FRONT); 156 CreateQuad(Cubeside.BACK); 157 CreateQuad(Cubeside.TOP); 158 CreateQuad(Cubeside.BOTTOM); 159 CreateQuad(Cubeside.LEFT); 160 CreateQuad(Cubeside.RIGHT); 161 CombineQuads(); 162 163 } 164 165 // Use this for initialization 166 void Start () { 167 CreateCube(); 168 } 169 170 // Update is called once per frame 171 void Update () { 172 173 } 174} 175

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

一番手っ取り早い方法は、マテリアルを複数作って差し替えることです。

  1. 今cubeMaterialに設定されているマテリアルを複製。(Projectパネル上で選択→Ctrl+D)
  2. 複製したマテリアルのテクスチャを変更。
  3. CreateQuadsコンポーネントのcubeMaterialに複製したマテリアルを設定。

もし「スクリプト内でどのマテリアルを使うか動的に決定したい」ということなら、マテリアルの配列を使うと便利です。

  1. ソースコード内のpublic Material cubeMaterial;private Material cubeMaterial;に変更。
  2. 次の行にpublic Material[] cubeMaterials;を追記。
  3. renderer.material = cubeMaterial;より前のいずれかの部分でcubeMaterial = cubeMaterials[0];のような要領で、使用するマテリアルを決めるソースコードを書く(決める方法はお好みで)。
  4. ヒエラルキーから、cubeMaterialsに使用したいマテリアルを全て設定する。(複製方法は上記参照)

マテリアルは同じでテクスチャだけ入れ替えたい場合、以下の方法で可能です。

  1. ソースコード内のpublic Material cubeMaterial;の次の行にpublic Texture[] cubeTextures;を追記。
  2. renderer.material = cubeMaterial;より前のいずれかの部分でcubeMaterial.mainTexture = cubeTextures[0];のような要領で、使用するテクスチャを決めるソースコードを書く(決める方法はお好みで)。
  3. ヒエラルキーから、cubeTexturesに使用したいテクスチャを全て設定する。

複数のテクスチャを用いて、Sprite Atlasを作り

Unity2017使っているなら、そのままSpriteAtlasを使えばいいかと思います。
Spriteをパックする新しい仕組み、SpriteAtlasを使ってみた【Unity】 - (:3[kanのメモ帳]
ただ「SpriteAtlasから使用したいSprite取り出し→マテリアルに設定」になるので、「元画像Aのテクスチャと元画像Bのテクスチャを同時使用したい」場合はちょっと面倒になりそうです。

どうせやるならSprite Atlas作るよりも、画像素材自体を結合してしまった方が早くて簡単だと思います。

投稿2018/01/18 01:44

sakura_hana

総合スコア11425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/18 10:55

回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問