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

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

ただいまの
回答率

90.34%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 556

kotakot

score 30

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

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

 shaderのスクリプト

Shader "Custom/sheder"
{   
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM

        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0

        struct Input
        {
            float2 uv_MainTex;
            float3 worldPos;
        };

        fixed4 _Wall1Color;
        fixed4 _Wall11Color;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
          float dist = distance( fixed3(0,0,0), IN.worldPos);
            float val = abs(sin(dist*3.0-_Time*100));
            if( val > 0.98 ){
                o.Albedo = _Wall1Color.rgb;
            } else {
                o.Albedo = _Wall11Color.rgb;
            }


        }
        ENDCG
    }
    FallBack "Diffuse"
}

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

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


public class shiny : MonoBehaviour
{
    //その他
    public int time;
    int kaisuu = 0;
    //オブジェクト
    public GameObject LEVELTEXT;
    public GameObject Genelletor;
    public GameObject toumeiball;
    public GameObject plane;
    public GameObject lightpurhub;
    public RawImage yellowpicture;
    public GameObject leftwall;
    //スクリプト

    void Start()
    {
        StartCoroutine("FuncCoroutine");
    }
    IEnumerator FuncCoroutine()
    {
        while (true)
        {
            kaisuu += 1;
            if (kaisuu == 1)
            {
                LEVELTEXT.GetComponent<Text>().text = "LEVEL" + 1;
            }
            if (kaisuu == 2)
            {
                LEVELTEXT.GetComponent<Text>().text = "LEVEL" + 2;
                this.LEVEL2();
            }
            if (kaisuu == 3)
            {
                LEVELTEXT.GetComponent<Text>().text = "LEVEL" + 3;
                this.LEVEL3();
            }
            if (kaisuu == 4)
            {
                LEVELTEXT.GetComponent<Text>().text = "LEVEL" + 4;
                this.LEVEL4();
            }
            if (kaisuu == 5)
            {
                LEVELTEXT.GetComponent<Text>().text = "LEVEL" + 5;
                this.LEVEL5();
            }


            yield return new WaitForSeconds(time);
        }
    }
    void LEVEL1()
    {
        GetComponent<Renderer>().material.SetColor("_Wall1Color", Color.black);
        GetComponent<Renderer>().material.SetColor("_Wall11Color", Color.blue);
    }
    void LEVEL2()
    {
        Genelletor.GetComponent<balllgeneretor>().ball = toumeiball;
        GetComponent<Renderer>().material.SetColor("_Wall1Color", Color.white);
        GetComponent<Renderer>().material.SetColor("_Wall11Color", Color.yellow);

    }
    void LEVEL3()
    {

    }
    void LEVEL4()
    {

    }
    void LEVEL5()
    {

    }

}

エラーメッセージ

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)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/28 08:50

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

    キャンセル

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る