[過去ログ] 【3Dゲームエンジン】Unity質問スレッド30 [無断転載禁止]©2ch.net (1002レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
767
(4): 2017/08/23(水)06:33 ID:9IfN6Xrm(1) AAS
>>758だけど、みんなありがとう。おかげで多少進展しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {
public int numButtons;
private GameObject[] buttons = new GameObject[25];
// Use this for initialization
void Start () {
this.buttons = GameObject.FindGameObjectsWithTag ("button");
Debug.Log (buttons.Length);
}
}

これをあるシーンに使ったら 一見何も関係なさそうなpublic int numButtons;を入れるとログは27、入れないと0が出ました。
別のシーンで使ったら合ってもなくても0でした。
numbuttonsはスクロールパネル上にボタンのプレハブを大量に並べるときにつくった変数で、インスペクタ上で27で上のどちらのシーン上にも存在しています。
試しに前者のシーンでnumbuttonsに26を設定したらログの27が26になりました。
配列の大きさを決める表現が間違っていたら元も子もないですが、
それにしてもなぜ関係ない変数が干渉してくるのか理解できません。
768: 2017/08/23(水)07:49 ID:TuNmkY+t(1/2) AAS
>>767
デバッガで追っても再現しないし、何言ってんだか意味が分からない
貴方の環境固有の問題としか言い様がない
769
(2): 2017/08/23(水)12:17 ID:0fyfcMVA(2/4) AAS
>>767
まず1つ1つが何をしているのかよく理解することが大事です

buttons.Length

これは確保された実際の配列の数が格納されています。
配列が1つも確保されていないのなら"0"を返し
仮に25個確保されたのなら"25"を返します。

buttons = GameObject.FindGameObjectsWithTag ("button");

これは
画面右上のタグ部分が"button"になってるGameObjectを全部buttonsという配列に格納するものです。
buttonというタグを付けられたGameObjectが2つ存在していれば2つ配列が新規に作成され
1つも存在していなければ配列は作成されません。
つまりbuttons.Lengthの値は"0"です。

private GameObject[] buttons = new GameObject[25]; //←無意味です
this.buttons = GameObject.FindGameObjectsWithTag ("button"); //ここで実際に存在するbuttonの数だけ自動的に配列が再確保されます

上のコードは下と同じです
private GameObject[] buttons;
buttons = GameObject.FindGameObjectsWithTag ("button");

説明が重複しますが
タグにbuttonが指定されているGameObjectが存在していないのならば配列は確保されず
buttons.Lengthの値は"0"です。

numButtonsの値はプログラムのどこにも使用されておらずこれも無意味で必要ありません(結果に影響していません)
771: 769 2017/08/23(水)12:29 ID:0fyfcMVA(3/4) AAS
>>767
using UnityEngine;

using System.Collections;

public class Nichan_767 : MonoBehaviour {

private GameObject[] buttons = new GameObject[25];
// Use this for initialization
void Start() {
Debug.Log("Length=" + buttons.Length); // ?24と表示される
buttons = GameObject.FindGameObjectsWithTag("button");
Debug.Log("Length=" + buttons.Length); // ?0と表示される
}
}

?の時点では
private GameObject[] buttons = new GameObject[25];
で確保した物は存在していますが

?の結果から
buttons = GameObject.FindGameObjectsWithTag("button");
ここで配列を再構築してるのを理解いただけるかと思います。

仮にTag"button"のGameObjectを3つ配置すると?の結果は3に変化します。

このように1行1行の命令が何をしているのか、そして動きの変化を丁寧に見ている事が大切になりますよ。
参考にしてみてください。
782
(3): 2017/08/24(木)07:41 ID:ruQ5JhDH(1/3) AAS
>>767です。
多少進展しました。

public class NewBehaviourScript : MonoBehaviour {
private GameObject[] buttons = new GameObject[25];
// Use this for initialization
void Start () {
this.buttons = GameObject.FindGameObjectsWithTag ("button");
Debug.Log (buttons.Length);
}
}

とりあえずスクリプト全体の変数を見直して、そのあと初めて デバッグしました。25これこれはいらないのですが、あえて残してます。
シーン1では、buttonsの要素数が25になった後、buttonタグを有したオブジェクトが入り27になりました。
教えてもらった挙動の通りで、こちらは多分解決しました。
これをシーン2で試したら要素数25の後 、this.buttons = GameObject.FindGameObjectsWithTag ("button"); の処理で0になりました。

そこでFindGameObjectsWithTag でbuttonタグをもったゲームオブジェクトを見つけられていないと考えました。
そこで30個ほどbuttonタグをつけたオブジェクトを作ってみたら、加えたオブジェクトの数と等しい要素数がthis.buttons = GameObject.FindGameObjectsWithTag ("button"); の処理で反映されました。
buttonタグをもったオブジェクトはアクティブで、タグ名もbuttonで、タグマネージャにもbuttonタグはあります。

シーン1では上手くいってるだけに、シーン2にはどこかしら不具合があるはずなんだと思いますが、何を考えるべきだとおもいますか?
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.048s