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

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

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

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

Unity

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

Q&A

1回答

975閲覧

unityでオブジェクトの透明度の変更

shiroshiro_me

総合スコア19

C#

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

Unity

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

0グッド

0クリップ

投稿2018/12/08 04:28

unityで、prefabのサイズと透明度をC#スクリプトによって任意に変化させたものを出現させるプログラムを実装したいのですが、透明度を変更して表示させるプログラムがうまくいきません。

http://d.hatena.ne.jp/toburau/20170731/1501518531

を参考にプログラムを書きました。以下がそのプログラムです。
cntが大きければ大きいほどサイズは大きく、透明度は高くなるようにしています。
出現させるprefab側にChangeSizeを適用し、putBallLによってオブジェクトのサイズと透明度を設定し配置しています。
objL.GetComponent<ChangeSize>().changeAlpha(cnt);の行を追加するとprefabが配置されなくなりました。
何が原因であると考えられますか?

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class ChangeSize : MonoBehaviour { 7 8 private float size; 9 private float alpha = 0.27f; 10 private Renderer renderer; 11 private Color color; 12 13 // Use this for initialization 14 void Start () { 15 color = renderer.material.color; 16 } 17 18 // Update is called once per frame 19 void Update () { 20 21 } 22 23 public void changeSize(int cnt, float uTime) 24 { 25 size = cnt * uTime; 26 transform.localScale = new Vector3(size, size, size); 27 } 28 public void changeAlpha(float cnt) 29 { 30 color.a = alpha - cnt * 0.004f; 31 renderer.material.color = color; 32 } 33} 34

C#

1public void putBallL(int cnt, Vector3 pos) 2 { 3 if (cnt == 0) return; 4 if (cnt > 40) cnt = 40; 5 objL.GetComponent<ChangeSize>().changeSize(cnt, updateTime); 6 objL.GetComponent<ChangeSize>().changeAlpha(cnt); 7 Instantiate(objL, pos, Quaternion.identity); 8 }

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

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

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

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

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

guest

回答1

0

rendererがNullだからです。(リンク先のコードが間違っています)

ChangeSizeクラス内の変数rendererに代入している部分がどこにも無いのでこれはNull。
Nullにあるmaterialにアクセスしようとしていますが、そんなもの存在しないのでエラーになり、以後のコードも実行されずプレハブの生成もされません。(本当はChangeSizeのStartでも同じエラーが起こっています)

ChangeSizeクラスStartメソッド内のcolor = renderer.material.color;の上の行に
renderer = GetComponent<Renderer>();とでも追加すれば動くと思います。

投稿2018/12/08 05:09

sakura_hana

総合スコア11425

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

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

shiroshiro_me

2018/12/08 06:37

ご回答ありがとうございます。 ご指摘のように行を追加しましたが動きませんでした。
sakura_hana

2018/12/08 07:21

エラーは出ていますか? 出ているならコピペして質問に追記してください。
shiroshiro_me

2018/12/10 01:54

すいません。エラーについて書くのを忘れていました。 UnassignedReferenceException: The variable renderer of ChangeSize has not been assigned. You probably need to assign the renderer variable of the ChangeSize script in the inspector. このようなエラーが出ています。
sakura_hana

2018/12/10 02:36

エラー文にある通り、rendererの参照が取れていないですね。 ChangeSizeクラスが付いているオブジェクト自身にRendererが付いていないっぽいですね。 (renderer = GetComponent<Renderer>(); は自分自身に付いたRendererコンポーネントを取得する命令なので) もし同じオブジェクトに付いていない(=違うオブジェクトに付いている)場合、 1.private Renderer renderer; → public Renderer renderer; に変更 2.renderer = GetComponent<Renderer>(); は削除 3.インスペクタからRenderer変数に目的のオブジェクトをアタッチ という手順を踏めば動くと思います。 2階層以上の親子構造のあるプレハブだと3番が分かりにくい場合があるので、出来なかったら調べるか再コメントください。
shiroshiro_me

2018/12/10 04:07

すいません、意味がよく分からないです... sphereのprefabにChangeSizeをつけており、それがhierarchyにあるオブジェクトについているputBallによって透明度とサイズを変えて配置されるように実装しようとしています。 このエラーはそのsphereのprefabにRendererがついていないことによるエラー、ということでしょうか? それはMesh Rendererとは別なのでしょうか?
sakura_hana

2018/12/10 04:49

順を追って話すと、shiroshiro_meさんが書いた最初のコードは 常にrendererが空っぽの状態になっています。 「renderer.material.color = color;」が呼ばれる前のどこかで「renderer = 〜;」という形で参照を渡さないと使えません。 なので私は最初Startメソッド内で「renderer = GetComponent<Renderer>();」すれば動くと回答しました。 これは「このソースが付いたオブジェクトに付いたRendererを取得」というコードです。 (「〜Renderer」というコンポーネント各種が対象になります。つまりsphereのprefabにMesh Rendererが付いていれば取得出来るはず) ですがこれもエラーになるのは、Startメソッドが呼ばれる前にchangeAlphaメソッドが呼ばれてるからです。(ここを私が見落としてた) objL.GetComponent<ChangeSize>().changeAlpha(cnt); Instantiate(objL, pos, Quaternion.identity); putBallLではこういう順番で呼んでて、Startは「そのオブジェクトがシーン上に生成された時に呼ばれる」ので、 「changeAlphaが呼ばれてから(Instantiateされて)Startが呼ばれる」 という順番で動きます。 これだとchangeAlphaのタイミングでは「renderer = GetComponent<Renderer>();」されていないので相変わらず動かないわけです。 なので対処方法としては、changeAlphaメソッドの先頭に renderer = GetComponent<Renderer>(); color = renderer.material.color; と追加すればとりあえず動くと思います。 (この場合はStartメソッド内の「color = renderer.material.color;」は消していいと思います)
shiroshiro_me

2018/12/10 08:27

Not allowed to access Renderer.material on prefab object. Use Renderer.sharedMaterial instead UnityEngine.Renderer:get_material() ChangeSize:changeAlpha(Single) (at Assets/StudyProject/Scripts/ChangeSize.cs:31) GazePlot:putBallL(Int32, Vector3) (at Assets/StudyProject/Scripts/GazePlot.cs:100) GazePlot:Start() (at Assets/StudyProject/Scripts/GazePlot.cs:61) NullReferenceException: Object reference not set to an instance of an object ChangeSize.changeAlpha (Single cnt) (at Assets/StudyProject/Scripts/ChangeSize.cs:31) GazePlot.putBallL (Int32 cnt, Vector3 pos) (at Assets/StudyProject/Scripts/GazePlot.cs:100) GazePlot.Start () (at Assets/StudyProject/Scripts/GazePlot.cs:61) startメソッド内のcolorとrendererを消しchangeAlphaメソッドの先頭に renderer = GetComponent<Renderer>(); color = renderer.material.color; を追加すると以上のエラーが出ました。ChangeSizeの30行目31行目に追加しています。 GazePlot.cs:61ではputballメソッドを、 GazePlot.cs:100ではobjL.GetComponent<ChangeSize>().changeAlpha(cnt); を呼び出しています。
sakura_hana

2018/12/10 09:07

生成していないオブジェクトのMaterialは操作出来ないぜってことですね。 エラー文に書いてある通り renderer.material.color = color; は renderer.sharedMaterial.color = color; かなと思います。 ただこれをやると、多分objLを元に作ったオブジェクトが全部同じ色になります。 これだと困る場合、普通はobjLではなくobjLを元に作ったオブジェクトの方を制御します。 putBallLの中身を if (cnt == 0) return; if (cnt > 40) cnt = 40; GameObject obj = Instantiate(objL, pos, Quaternion.identity); obj.GetComponent<ChangeSize>().changeSize(cnt, updateTime); obj.GetComponent<ChangeSize>().changeAlpha(cnt); こうすると、生成前(objL)ではなく生成後(obj)の値を変更する形になります。 ただ、わざとこうしていない、objLの方を変更しないといけないのだとしたら私にはこれ以上は分からないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問