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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

432閲覧

[Unity3D] キャラクタのマテリアルを全部変更する方法スクリプト

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2021/08/22 04:03

提示コードの/////コメント部内部ですがキャラクタのマテリアルを全部透明のマテリアルに変更しているのですが提示画像にある通り一部しか透明なマテリアルに変更されていません。この場合どうすれば全部のマテリアルを透明に出来るのでしょうか?

イメージ説明

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.Linq; 5public class Player_Avoidance : MonoBehaviour 6{ 7 [SerializeField] private float avoidanceMoveRotate = 0.0f; 8 9 10 Player_Status status; 11 public bool onAvoidance {private set; get; } //回避中かどうか? 12 private GameObject afterImage; 13 private GameObject tracking; 14 15 private GameObject avoidanceParticle; 16 public bool onAfterImage {set; get; } 17 private bool onAfterImageAnimation = false; 18 19 private float moveAngle; 20 private float avoidanceRotateSpeed = 5f; 21 private Vector3 avoidanceRotateVector; 22 private CharacterController cc; 23 24 25 private List<List<Material>> defaultMaterial; //元のマテリアル 26 private Material avoidanceMaterial; 27 28 // Start is called before the first frame update 29 void Start() 30 { 31 defaultMaterial = new List<List<Material>>(); //既定のマテリアル 32 33 cc = GetComponent<CharacterController>(); 34 avoidanceParticle = Resources.Load("Prefabs/Effect/Player/After_Image_Particle") as GameObject; 35 status = GetComponent<Player_Status>(); 36 37///////////////////////////////////////////////////////////////////////////////////////////////////////////// 38 avoidanceMaterial = Resources.Load("Materials/avoidance") as Material; //回避マテリアル 39 40 41 42 43 foreach(Transform t in transform.Find("Mesh_SD_unitychan").transform) 44 { 45 defaultMaterial.Add(new List<Material>()); 46 foreach(Material m in t.GetComponent<Renderer>().materials) 47 { 48 defaultMaterial.Last().Add(m); 49 } 50 } 51 52 53 54 ChangeAvoidanceMaterial(); // 55////////////////////////////////////////////////////////////////////////////////////////////////////////////// 56 } 57 58///////////////////////////////////////////////////////////////////////////////////////////////////////////// 59 //回避マテリアルに変更 60 private void ChangeAvoidanceMaterial() 61 { 62 /* 63 for(int i = 0; i < transform.Find("Mesh_SD_unitychan").transform.Find("_body").GetComponent<Renderer>().materials.Length; i++) 64 { 65 transform.Find("Mesh_SD_unitychan").transform.Find("_body").GetComponent<Renderer>().material = avoidanceMaterial; 66 } 67 */ 68 69 70 /* 71 foreach (Transform t in transform.Find("Mesh_SD_unitychan").transform) 72 { 73 foreach(Material m in t.GetComponent<Renderer>().materials) 74 { 75 Destroy(m); 76 77 } 78 } 79 */ 80 81 foreach (Transform t in transform.Find("Mesh_SD_unitychan").transform) 82 { 83 t.GetComponent<Renderer>().material = avoidanceMaterial; 84 } 85 86 87// t.GetComponent<Renderer>().material = avoidanceMaterial; 88 89 } 90////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 91 92 //既定のマテリアルに変更 93 private void ChangeDefaultMaterial() 94 { 95 int x = 0; 96 foreach (Transform t in transform.Find("Mesh_SD_unitychan").transform) 97 { 98 for(int i = 0; i < t.GetComponent<Renderer>().materials.Length; i++) 99 { 100 t.GetComponent<Renderer>().materials[i] = defaultMaterial[x][i]; 101 102 } 103 x++; 104 } 105 } 106 107 108 109 110 111 112 113 // Update is called once per frame 114 void Update() 115 { 116 Staging(); 117 118 119 120 121 122 123 if (Input.GetKey(KeyCode.F)) 124 { 125 if (status.magicPoint > 0) 126 { 127 status.magicPoint += -(status.magicPointUser * Time.deltaTime); 128 129 onAvoidance = true; 130 } 131 else 132 { 133 onAvoidance = false; 134 } 135 } 136 else 137 { 138 status.magicPoint += (int)(status.magicPointRecovery * Time.deltaTime); 139 140 onAvoidance = false; 141 } 142 143 } 144 145 private void OnTriggerEnter(Collider collision) 146 { 147 148 if (collision.gameObject.tag == "Enemy_Bullet") 149 { 150 151 if (onAvoidance == true) 152 { 153 154 155 156 } 157 else 158 { 159 status.hitPoint += -collision.gameObject.GetComponent<Enemy_Bullet>().damage; 160 } 161 } 162 } 163 164 165 166 void Staging() 167 { 168 169 //パーティクル 170 if (onAfterImage == true) 171 { 172 foreach (Transform g in tracking.transform) 173 { 174 GameObject gg = Instantiate(g.gameObject); 175 gg.gameObject.GetComponent<ParticleSystem>().Play(); 176 gg.transform.position = transform.position; 177 gg.transform.rotation = transform.rotation * Quaternion.Euler(-90, 0, 0); 178 } 179 180 //Debug.Log(Camera.main.transform.right); 181 //transform.position += Camera.main.transform.right * 1000; 182 183 avoidanceRotateVector = transform.right.normalized; 184 onAfterImageAnimation = true; 185 onAfterImage = false; 186 } 187 188 //回避ローテーション 189 if (onAfterImageAnimation == true) 190 { 191 192 Vector3 newDirection = Vector3.RotateTowards(transform.forward.normalized, avoidanceRotateVector, avoidanceRotateSpeed * Time.deltaTime, 0.0f); 193 194 195 cc.enabled = false; 196 transform.rotation = Quaternion.LookRotation(newDirection); 197 cc.enabled = true; 198 199 if (MatchAngle_Y(newDirection, avoidanceRotateVector) == true) 200 { 201 onAfterImageAnimation = false; 202 avoidanceMoveRotate = 0; 203 } 204 205 } 206 } 207 208 //Y軸でAがBの方向を同じかどうか? 209 protected bool MatchAngle_Y(Vector3 a, Vector3 b) 210 { 211 a.y = 0; 212 b.y = 0; 213 214 if (Vector3.Angle(a, b) < 1) 215 { 216 return true; 217 } 218 else 219 { 220 return false; 221 } 222 223 } 224 225} 226

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下の3点が十分に考慮されていないですね。

  1. Renderer に複数のマテリアルが割り当てられているケース
  2. Renderer が Skinned Mesh Renderer であるケース
  3. 顔のメッシュは Mesh_SD_unitychan の下にはない

手作業でマテリアルの入れ替えをやってみれば、プログラムのおかしいところはわかるはずです。

コード

csharp

1using System.Collections.Generic; 2using UnityEngine; 3 4/// <summary> 5/// m_parent で指定したオブジェクトの子オブジェクト(直下のみ)の Renderer のマテリアルを m_mat に入れ替える。 6/// 子オブジェクトから Renderer を検索するのは再帰呼び出しはしないので、一つ下の子オブジェクトのマテリアルしか入れ替えない。 7/// </summary> 8public class SwapMaterials : MonoBehaviour 9{ 10 /// <summary>メッシュを置換したいオブジェクトの親オブジェクト</summary> 11 [SerializeField] Transform m_parent = default; 12 /// <summary>このマテリアルに置換する</summary> 13 [SerializeField] Material m_mat = default; 14 Dictionary<Renderer, Material[]> m_originalMatData = new Dictionary<Renderer, Material[]>(); 15 16 void Start() 17 { 18 Init(); 19 } 20 21 void Init() 22 { 23 foreach (Transform t in m_parent) 24 { 25 Renderer r = t.GetComponent<Renderer>(); 26 27 if (r) 28 { 29 m_originalMatData.Add(r, r.materials); 30 } 31 } 32 } 33 34 public void Swap() 35 { 36 foreach (Transform t in m_parent) 37 { 38 Renderer r = t.GetComponent<Renderer>(); 39 40 if (r) 41 { 42 int n = r.materials.Length; 43 Material[] mats = new Material[n]; 44 45 for (int i = 0; i < n; i++) 46 { 47 mats[i] = m_mat; 48 } 49 50 r.materials = mats; 51 } 52 } 53 } 54 55 public void Revert() 56 { 57 foreach (Transform t in m_parent) 58 { 59 Renderer r = t.GetComponent<Renderer>(); 60 61 if (r) 62 { 63 r.materials = m_originalMatData[r]; 64 } 65 } 66 } 67}

動いている様子
イメージ説明

unitypackage(モデルは含みません)

投稿2021/08/22 06:14

bboydaisuke

総合スコア5277

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問