[過去ログ] 【3Dゲームエンジン】Unity質問スレッド30 [無断転載禁止]©2ch.net (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
756(1): 2017/08/22(火)15:01 ID:yLOjxir+(1) AAS
 >>754 
 アセットを買えばシンプルなゲームは簡単にできますよ 
757: 2017/08/22(火)18:35 ID:HwsyuWNo(2/2) AAS
 >>756 
 お、アセットおじさん保守ボランティアご苦労様です! 
758(2): 2017/08/22(火)23:41 ID:ZYqSKZvD(1) AAS
 質問です。 
  
 using System.Collections; 
 using System.Collections.Generic; 
 using UnityEngine; 
  
 public class NewBehaviourScript : MonoBehaviour { 
  GameObject[] button; 
  public int numButtons; 
  // Use this for initialization 
  void Start () { 
   button = GameObject.FindGameObjectsWithTag ("button"); 
   for (int i = 0; i < numButtons; i++) { 
    Debug.Log (button [i]); 
   } 
  } 
 } 
  
 これでindexoutofrangeexceptionが出るのですが、配列で宣言してるので理解できません。 
 ほかのシーンではこれとほとんど同じスクリプトが動いてます。 
759: 2017/08/22(火)23:46 ID:TRTD1zzi(1) AAS
 理解出来ないならそれで終了だよ 
760: 2017/08/23(水)00:20 ID:0fyfcMVA(1/4) AAS
 >>758 
 実際に取得できたbuttonの配列数とnumButtonsの値が不一致なんだと思います。 
  
 例えばbuttonが2個しかないのに 
 numButtons = 4 
 のように設定しているとforループで 
 button[0] //大丈夫 
 button[1] //大丈夫 
 button[2] //indexoutofrangeexception 
 button[3] //indexoutofrangeexception 
  
 と用意されていない配列まで呼び出そうとし 
 「indexoutofrangeexception(存在しない配列番号を指定しています)エラーなりますよ。 
  
 for (int i = 0; i < numButtons; i++)  
 ではなく 
 for (int i = 0; i < button.Length; i++)  
 の方が確実です 
761: 2017/08/23(水)00:21 ID:f4UC00rn(1) AAS
 配列と非配列が同居。 
762: 2017/08/23(水)01:23 ID:AOtX330Z(1) AAS
 なんでDebug.Logは使えるのにbutton.lengthをLogに出そうと思わなかったのか? 
763: 2017/08/23(水)01:36 ID:3WNWlazc(1) AAS
 配列作った時に何個作ったのか記録されてる数見ないと、 
 作った数とintが一致する訳ないよね 
 理解出来ないじゃなくて、配列を理解してないんだよ 
764: 2017/08/23(水)01:41 ID:atYfWrEx(1) AAS
 ちゃんとnumButtonと命名してるのに自動で入れてくれないUnityが悪い 
765: 2017/08/23(水)02:20 ID:iWkNM0se(1) AAS
 ウディタに移行しようかな 
766: 2017/08/23(水)02:51 ID:61qz+tvb(1) AAS
 高級言語が無理なら諦めるのも手 
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の値はプログラムのどこにも使用されておらずこれも無意味で必要ありません(結果に影響していません) 
770: 2017/08/23(水)12:17 ID:ouhFnsS+(1/2) AAS
 そもそもnumButtonsというpublic変数の存在意図がわからん 
 どこで値を入れてるの? 
 エディタ画面で手で直接いれてるの? 
 numButtonsをforループでしか使ってないなら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行の命令が何をしているのか、そして動きの変化を丁寧に見ている事が大切になりますよ。 
 参考にしてみてください。 
772: 769 2017/08/23(水)12:30 ID:0fyfcMVA(4/4) AAS
 訂正: 
 ?の結果は"24"ではなく"25"です。 
773: 2017/08/23(水)12:45 ID:ouhFnsS+(2/2) AAS
 numButtonsはボタン大量に並べるときにも使ってるのかな 
 buttonタグのついたボタンの個数とnumButtonsの数が一致してるならいまいち原因がわからん 
 FindGamesObjectWithTagで取得された要素数がbuttonタグのついた要素数と一致してないのか? 
774: 2017/08/23(水)12:52 ID:TuNmkY+t(2/2) AAS
 画像リンク
 
 
 デバッガでアタッチすればプロセスの中身全部見れる訳で 
  
 第一確保したメモリを他の領域が侵食して勝手に書き換えてたら、 
 そりゃ唯のバッファオーバーフローじゃん 
  
 出来てるやれてる解ってるって、勝手な予想や思い込みを捨てて 
 メモリの中身がどうなってるか逐一確認しなきゃ分かる訳ないよ 
 そこが可笑しい 
775: 2017/08/23(水)13:09 ID:MTXdrtmX(1) AAS
 C#の絵本でも読んどけ 
776: 名無し@キムチ 2017/08/23(水)18:33 ID:CUIL1+3U(1) AAS
 >>742 
 ※ キムチに餌をやらないでください  
  
 当方にとって最大の餌といえば、やはりUnityそのものですね。 
 あと、BlenderやMakeHumanも非常に大きな餌であり、MakeClothesもちょっぴりの餌です。 
 またこのスレでの餌といえば、困った時に質問して有効な回答が得られることでしょうね。 
 その餌をやらないでくれ、ということは当方が有効な回答を得た場合何か困ることがあるのですか? 
 もしかして>>742は当方が知ってるヒトだったりしますか? 
777: 2017/08/23(水)23:05 ID:t1wRCclf(1) AAS
 アセットを買えばいいと思いますよ 
 無理にスクリプトを扱う必要はありません 
778(1): 2017/08/24(木)00:00 ID:zcnJsAO1(1/2) AAS
 おすすめの解説サイトか書籍を教えてください。 
 Unityは初めてで、プログラミングの経験はある程度あります。 
779(1): 2017/08/24(木)00:35 ID:OjzkpEBe(1) AAS
 オススメはUnreal Engineです 
 Unityなど速攻アンインストールしましょう 
780: ダーク王鍬大使 ◆SoVpkB15jY  2017/08/24(木)00:47 ID:2Q8VoCoW(1) AAS
 そういえばツクール2000のYADOTポジションのホームページってまだないんでふね(^^ 
 あってもいい気がしまふが(^^ 
781: 2017/08/24(木)01:59 ID:zcnJsAO1(2/2) AAS
 >>779 
 どうしてですか?unityだめなんですか? 
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にはどこかしら不具合があるはずなんだと思いますが、何を考えるべきだとおもいますか? 
783: 2017/08/24(木)12:18 ID:XR5K+uMT(1/2) AAS
 >>782 
 シーン2にbuttonタグのオブジェクトを配置していないから0になるのだと思いますが。 
  
 シーン2にbuttonタグのオブジェクトが配置してあるのに取得できないのですか? 
 それとも 
 シーン1にあるボタンをシーン2のスクリプトから取得したいという事ですか? 
784: 2017/08/24(木)13:05 ID:lkGi/EQe(1) AAS
 よくわからんけど 
 this.buttons = GameObject.FindGameObjectsWithTag ("button"); 
 この記述は正しいの? 
 エラーの原因な気がするが 
785: 2017/08/24(木)13:12 ID:r02jaxxe(1) AAS
 あちこちに、デバッグ文を書いて、 
 どの関数が呼ばれたか・呼ばれていないのか、を確認すれば? 
  
 究極を言えば、1行ずつ、デバッグして確かめるべき 
上下前次1-新書関写板覧索設栞歴
あと 217 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.018s