前提・実現したいこと
Unityにて、gameObjectのmaterialのSpine/SkeletonTintCustom.shaderという、
シェーダーファイルの引数の色を変更しようとしているのですが、
下記エラーが発生してしまい改善できず困っております。
発生している問題・エラーメッセージ
Not allowed to access Renderer.material on prefab object. Use Renderer.sharedMaterial instead UnityEngine.Renderer:get_material()
該当のソースコード
csharp
1 2if (c.GetComponent<Renderer>().material.shader.name == "Spine/SkeletonTintCustom") 3 { 4 c.GetComponent<Renderer>().material.SetColor("_Color", new Color(1f, 1f, 1f)); 5 c.GetComponent<Renderer>().material.SetColor("_Black", new Color(0.6f, 0.2f, 0.2f)); //ちょっと明るく 6 }
c.GetComponent<Renderer>().material.SetColor("_Color", new Color(1f, 1f, 1f))
この部分で該当のエラーがでます。
追記メソッド全文
csharp
1 2 void ChangeMarkingObject(GameObject c, MarkingType type = MarkingType.Default) 3 { 4 // if (c.GetComponent<Renderer>()) 5 // { 6 7 switch (type) 8 { 9 // UnityEngine.Renderer:get_material(); 10 11 case MarkingType.Removal: // 除去&選択時用? 12 Debug.Log("aaaaa" + c.gameObject.name); 13 14 15 16 // c.GetComponent<Renderer>().material.shader = Shader.Find("Spine/SkeletonTintCustomTintCustom"); 17 if (c.GetComponent<Renderer>().material.shader.name == "Spine/SkeletonTintCustom") 18 { 19 c.GetComponent<Renderer>().material.SetColor("_Color", new Color(1f, 1f, 1f)); 20 c.GetComponent<Renderer>().material.SetColor("_Black", new Color(0.6f, 0.2f, 0.2f)); //ちょっと明るく 21 } 22 23 break; 24 case MarkingType.Lift: // 持ち上げた時用 25 if (c.GetComponent<Renderer>().material.shader.name == "Spine/SkeletonTintCustom") 26 { 27 c.GetComponent<Renderer>().material.SetColor("_Color", new Color(1f, 1f, 1f)); 28 c.GetComponent<Renderer>().material.SetColor("_Black", new Color(0.4f, 0.4f, 0.4f)); //ちょっと明るく 29 30 } 31 32 break; 33 case MarkingType.CantPut: // 移動時にそこにおけない時 34 if (c.GetComponent<Renderer>().material.shader.name == "Spine/SkeletonTintCustom") 35 { 36 c.GetComponent<Renderer>().material.SetColor("_Color", new Color(1f, 0.6f, 0.6f)); 37 c.GetComponent<Renderer>().material.SetColor("_Black", new Color(0.3f, 0.2f, 0.2f)); //ちょっと明るく 38 } 39 break; 40 case MarkingType.Put: // 元々の 41 // シェーダーを元に戻す 42 if (c.GetComponent<Renderer>().material.shader.name == "Spine/SkeletonTintCustom") 43 { 44 // c.GetComponent<Renderer>().material.shader = Shader.Find("Spine/SkeletonTintCustom"); 45 c.GetComponent<Renderer>().material.SetColor("_Color", new Color(1f, 1f, 1f)); 46 c.GetComponent<Renderer>().material.SetColor("_Black", new Color(0f, 0f, 0f)); 47 48 } 49 50 break; 51 case MarkingType.Default: // 元々の 52 53 // シェーダーを元に戻す 54 if (c.GetComponent<Renderer>().material.shader.name == "Spine/SkeletonTintCustom") 55 { 56 c.GetComponent<Renderer>().material.SetColor("_Color", new Color(1f, 1f, 1f)); 57 c.GetComponent<Renderer>().material.SetColor("_Black", new Color(0f, 0f, 0f)); 58 } 59 break; 60 default: 61 break; 62 } 63 // } 64 65 } 66 67 68
試したこと
・materialとsharedMaterialをifで条件にしても同じエラー
・new Materialで作りなおし、こちらだと対応可能ですが、既に配置されたgameobjectを対象に切り替えたいため、
色以外にもtexture等を貼り直す必要があり、作業が膨大になるため避けたいです。
Material material = new Material(Shader.Find("Spine/SkeletonTintCustom")); material.SetColor("_Color", new Color(1f, 1f, 1f)); material.SetColor("_Color", new Color(0.6f, 0.2f, 0.2f)); c.GetComponent<Renderer>().material = material;
・下記記事同様に、インスタンス化すると回避できましたが、やりたい事が既存のgameobjectに対して適用したいため、(RPGのマップのようなオブジェクト1つ1つに、このshaderが適用されているイメージです。)
https://answers.unity.com/questions/1372065/not-allowed-to-access-renderermaterial-on-prefab-o-1.html
追記
・エラーがでる対象のオブジェクトは、同じようにインスタンス化して作るようにしてみたのですが、material名の後ろに(instance)が付与されていました。こちらの違いがエラーになる原因のようです。。
補足情報(FW/ツールのバージョンなど)
・Unity2017 1.1f1
・MacOS Sierra 10.12.5
回答1件
あなたの回答
tips
プレビュー