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

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

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

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

Unity

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

Q&A

解決済

1回答

2665閲覧

unityでshaderの色を別のC#スクリプトで変えれない。

kotakot

総合スコア36

C#

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

Unity

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

0グッド

0クリップ

投稿2018/11/27 14:33

編集2018/11/27 15:17

unityでレベルが上がると色が変わるというものをプログラムしたいのですがネットをみてその通りにしても、色が変わらないうえに、エラーメッセージすら出ません

訂正
LEVEL1の時はエラーメッセージは出ませんが、LEVEL2の時は下のようなエラーメッセージがでます。

shaderのスクリプト

C#

1Shader "Custom/sheder" 2{ 3 SubShader 4 { 5 Tags { "RenderType"="Opaque" } 6 LOD 200 7 8 CGPROGRAM 9 10 #pragma surface surf Standard fullforwardshadows 11 #pragma target 3.0 12 13 struct Input 14 { 15 float2 uv_MainTex; 16 float3 worldPos; 17 }; 18 19 fixed4 _Wall1Color; 20 fixed4 _Wall11Color; 21 22 void surf (Input IN, inout SurfaceOutputStandard o) 23 { 24 float dist = distance( fixed3(0,0,0), IN.worldPos); 25 float val = abs(sin(dist*3.0-_Time*100)); 26 if( val > 0.98 ){ 27 o.Albedo = _Wall1Color.rgb; 28 } else { 29 o.Albedo = _Wall11Color.rgb; 30 } 31 32 33 } 34 ENDCG 35 } 36 FallBack "Diffuse" 37} 38

###shaderの色を変えるスクリプト

C#

1using Coffee.UIExtensions; 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6 7 8public class shiny : MonoBehaviour 9{ 10 //その他 11 public int time; 12 int kaisuu = 0; 13 //オブジェクト 14 public GameObject LEVELTEXT; 15 public GameObject Genelletor; 16 public GameObject toumeiball; 17 public GameObject plane; 18 public GameObject lightpurhub; 19 public RawImage yellowpicture; 20 public GameObject leftwall; 21 //スクリプト 22 23 void Start() 24 { 25 StartCoroutine("FuncCoroutine"); 26 } 27 IEnumerator FuncCoroutine() 28 { 29 while (true) 30 { 31 kaisuu += 1; 32 if (kaisuu == 1) 33 { 34 LEVELTEXT.GetComponent<Text>().text = "LEVEL" + 1; 35 } 36 if (kaisuu == 2) 37 { 38 LEVELTEXT.GetComponent<Text>().text = "LEVEL" + 2; 39 this.LEVEL2(); 40 } 41 if (kaisuu == 3) 42 { 43 LEVELTEXT.GetComponent<Text>().text = "LEVEL" + 3; 44 this.LEVEL3(); 45 } 46 if (kaisuu == 4) 47 { 48 LEVELTEXT.GetComponent<Text>().text = "LEVEL" + 4; 49 this.LEVEL4(); 50 } 51 if (kaisuu == 5) 52 { 53 LEVELTEXT.GetComponent<Text>().text = "LEVEL" + 5; 54 this.LEVEL5(); 55 } 56 57 58 yield return new WaitForSeconds(time); 59 } 60 } 61 void LEVEL1() 62 { 63 GetComponent<Renderer>().material.SetColor("_Wall1Color", Color.black); 64 GetComponent<Renderer>().material.SetColor("_Wall11Color", Color.blue); 65 } 66 void LEVEL2() 67 { 68 Genelletor.GetComponent<balllgeneretor>().ball = toumeiball; 69 GetComponent<Renderer>().material.SetColor("_Wall1Color", Color.white); 70 GetComponent<Renderer>().material.SetColor("_Wall11Color", Color.yellow); 71 72 } 73 void LEVEL3() 74 { 75 76 } 77 void LEVEL4() 78 { 79 80 } 81 void LEVEL5() 82 { 83 84 } 85 86}

###エラーメッセージ

You probably need to add a Renderer to the game object "GameObject". Or your script needs to check if the component is attached before using it. UnityEngine.Renderer.get_material () (at C:/buildslave/unity/build/Runtime/Export/GraphicsRenderers.bindings.cs:129) shiny.LEVEL2 () (at Assets/script/shiny.cs:69) shiny+<FuncCoroutine>d__10.MoveNext () (at Assets/script/shiny.cs:39) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at C:/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)

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

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

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

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

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

guest

回答1

0

ベストアンサー

LEVEL1で色が変わらない不具合について
これは多分、レベル1の時のLEVEL1の実行し忘れではないでしょうか?

C#

1 // 省略 2 if (kaisuu == 1) 3 { 4 LEVELTEXT.GetComponent<Text>().text = "LEVEL" + 1; 5 this.LEVEL1(); // これを追加 6 } 7 // 省略

LEVEL2の時のエラーについて
どうやらレンダラーが見つからないようですね...
色を変えたいオブジェクトというのは、そのshinyスクリプトがアタッチされたオブジェクトということでいいでしょうか(leftwallその他ではなく)?
もしshinyを付けたオブジェクト自身はレンダラーを持っておらず、その子オブジェクトがレンダラーを持っている場合はGetComponentでは見つからないはずです。GetComponentInChildrenを使うか...

C#

1 // 省略 2 void LEVEL1() 3 { 4 // 自身だけでなく、子からもRendererを探すように変更 5 // もし複数のレンダラーがあっても、そのうちどれか一つしか取得してくれない点にご注意ください 6 GetComponentInChildren<Renderer>().material.SetColor("_Wall1Color", Color.black); 7 GetComponentInChildren<Renderer>().material.SetColor("_Wall11Color", Color.blue); 8 } 9 // 省略

あるいは、子オブジェクトがいくつもあって、それらすべての色を変えたいのでしたら、GetComponentsInChildrenを試してみてはいかがでしょう。

C#

1 // 省略 2 void LEVEL1() 3 { 4 // 自身、または子からRendererをすべて取得する形に変更 5 // メソッド名が「GetComponents...」という風に、複数形に変わっている点にご注意ください 6 foreach (var renderer in GetComponentsInChildren<Renderer>()) 7 { 8 renderer.material.SetColor("_Wall1Color", Color.black); 9 renderer.material.SetColor("_Wall11Color", Color.blue); 10 } 11 } 12 // 省略

投稿2018/11/27 21:22

Bongo

総合スコア10807

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

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

kotakot

2018/11/27 23:50

なるほど! ありがとうございます。 うまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問