🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity

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

Q&A

解決済

1回答

2315閲覧

同じクラスで宣言した変数が未割り当てのローカル変数と判断される。

Grass_64

総合スコア4

Unity

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

0グッド

0クリップ

投稿2021/03/06 09:32

先日は皆様のおかげで、スクリプトから画像を貼り付けることができました。
ありがとうございました。
イメージいただくのは対戦格闘ゲームのキャラクターセレクト画面です。
メインプログラム「C_sel」から
ユーザーが選択しているキャラクターの番号「pushcntone」を取ってきて、
2DObjectのSpriteに指定された画像を貼る、という流れになります。

条件分岐のSwitchを使って
カットペーストで貼り付けのスクリプトを繰り返す。
>同一の変数を使わないでくださいエラー
>じゃぁ別名にするか
>変数の宣言位置をクラス頭にすれば良いのかな?
という過程を経て、一旦動くようになっているのですが、その過程の中で、なんでだろう、
と思うことがあったので、ご教授頂けたらと思います。

Unity

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Char : MonoBehaviour 6{ 7 public C_sel c_sel; //C_sel.csの関数を使うんだよ。 8 bool reDraw; //描画処理をするかどうか、受け取るのだよ 9 int pcOne; //C_sel内のpushcntone(プレイヤー選択キャラ番号の受け子) 10 11 //君の立ち位置がわからない!!!// 12 string BASE_TEXTURE = null;// 13 14 15 // Start is called before the first frame update 16 void Start() 17 { 18 c_sel = GameObject.Find("GameObject").GetComponent<C_sel>(); 19 reDraw = c_sel.ReDraw;//描画条件を受け取るTrueのとき描画 20 pcOne = c_sel.pushcntone;//選択しているキャラクタ番号を受け取る 21 } 22 23 // Update is called once per frame 24 void Update() 25 { 26 reDraw = c_sel.ReDraw;//描画条件を受け取るTrueのとき描画 27 pcOne = c_sel.pushcntone;//選択しているキャラクタ番号を受け取る 28   string BASE_TEXTURE;//アセットの位置データを受け取る器 29 Sprite sprites;//画像データを受け取る器 30 GameObject target;//書き込み対象を記憶 31 SpriteRenderer spriteOb;書き込み対象 32 33 if (reDraw == true) 34 { 35 //描画条件発生 36 switch (pcOne) 37 { 38 case 0: 39 Debug.Log("条件0"); 40 BASE_TEXTURE = "Textures/DTAC001"; 41  //ここから4行のスクリプトは一緒 42 sprites = Resources.Load<Sprite>(BASE_TEXTURE); 43            target = GameObject.Find("Char"); // 44 spriteOb = target.GetComponent<SpriteRenderer>(); // 45 spriteOb.sprite = sprites; // 46 break; 47 case 1: 48 Debug.Log("条件1"); 49 BASE_TEXTURE = "Textures/DTAC002"; 50 //ここから4行のスクリプトは一緒 51 sprites = Resources.Load<Sprite>(BASE_TEXTURE); // 52 target = GameObject.Find("Char"); // 53 spriteOb = target.GetComponent<SpriteRenderer>(); // 54 spriteOb.sprite = sprites; // 55 break; 56 case 2: 57 Debug.Log("条件2"); 58 BASE_TEXTURE = "Textures/DTAC003"; 59 sprites = Resources.Load<Sprite>(BASE_TEXTURE); 60 target = GameObject.Find("Char"); 61 spriteOb = target.GetComponent<SpriteRenderer>(); 62 spriteOb.sprite = sprites; 63 break; 64 case 3: 65 Debug.Log("条件3"); 66 BASE_TEXTURE = "Textures/DTAC004"; 67 sprites = Resources.Load<Sprite>(BASE_TEXTURE); 68 target = GameObject.Find("Char"); 69 spriteOb = target.GetComponent<SpriteRenderer>(); 70 spriteOb.sprite = sprites; 71 break; 72 } 73 /* 74       本音はここでまとめて描画した方が、スクリプトもスッキリすると思うのですが 75       ここだと「BASE_TEXTURE」が未割り当てのローカル変数と判断されてしまいます。 76 sprites = Resources.Load<Sprite>(BASE_TEXTURE); 77 Debug.Log("sprites :" + sprites); 78 target = GameObject.Find("Char"); 79 spriteOb = target.GetComponent<SpriteRenderer>(); 80 spriteOb.sprite = sprites; 81 */ 82 83 reDraw = false;//描画処理終了 84 c_sel.ReDraw = reDraw; 85 86 } 87 } 88 89} 90

大雑把に
他のスクリプトでもどんどん使うなら public をつける(本当はもっと色々ありますが)
今回みたいにvoid Update()の中でなら、
普通に使えるという認識だったのですが違ったのでしょうか。

配列で、ファイル名を持ってくる、とか
バラバラの画像をまとめて一つにする、とか
考えないといけないですね。
がんばります!

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

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

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

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

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

guest

回答1

0

ベストアンサー

ここだと「BASE_TEXTURE」が未割り当てのローカル変数と判断されてしまいます。

メソッドローカルにstring BASE_TEXTURE;がありますので、そちらを指していると解釈されます。

投稿2021/03/06 09:36

編集2021/03/06 09:37
maisumakun

総合スコア145970

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

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

Grass_64

2021/03/06 10:02

ありがとうございます! どちらを先に作ったか覚えていないですが、 最序盤で作ったstring BASE_TEXTURE;を わざわざvoid Update()でstring BASE_TEXTURE;を加えてしまったから、 おかしくなっちゃったんですね。 無闇に追加しないように気をつけます。助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問