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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

830閲覧

メソッドで取得した子オブジェクトの配列を使いたい

YDK

総合スコア63

C#

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/12/24 10:47

ゲーム制作でチュートリアルを作っているのですが、説明文を表示する看板があって
プレイヤーが看板に近づいたらコルーチンで説明文を表示するScriptを作っていて
SignBoardとExpranationの中身を配列に入れて取得しているのですが、
子オブジェクトの一番目の要素にはアクセスできるのですが二番目以降はアクセスできません
IndexOutOfRangeExceptionとでます。
イメージ説明

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class TutorialManager : MonoBehaviour 7{ 8 /// <summary> 主人公 </summary> 9 private GameObject player = default; 10 /// <summary> signBoardの親オブジェクト </summary> 11 private GameObject signParent; 12 /// <summary> 説明文を表示する看板 </summary> 13 private GameObject[] signBoard = default; 14 /// <summary> signBoardの要素番号 </summary> 15 private int value = 0; 16 /// <summary> expranationの親オブジェクト </summary> 17 private GameObject explainParent; 18 /// <summary> 表示する説明文 </summary> 19 private GameObject[] expranation = default; 20 /// <summary> 説明文が表示されるまでの主人公と看板の距離 </summary> 21 private const float range = 5.0f; 22 /// <summary> 説明文を表示するときに出す背景 </summary> 23 private Image background = default; 24 25 private void Start() 26 { 27 player = GameObject.FindWithTag("Player"); 28 background = GameObject.Find("Background").GetComponent<Image>(); 29 GetAllChildObject(signParent, "SignBoard", ref signBoard, "Sign_Board"); 30 GetAllChildObject(explainParent, "Expranation", ref expranation, "Expranation"); 31 } 32 33 private void Update() 34 { 35 DistanceToTheCharacter(); 36 } 37 38 /// <summary> 39 /// 指定したオブジェクトの子オブジェクトを取得 40 /// </summary> 41 /// <param name="parent">親オブジェクト</param> 42 /// <param name="parentName">親オブジェクトの名前</param> 43 /// <param name="child">子オブジェクト</param> 44 /// <param name="childName">子オブジェクトの名前</param> 45 private void GetAllChildObject(GameObject parent, string parentName, ref GameObject[] child, string childName) 46 { 47 parent = GameObject.Find(parentName); 48 child = new GameObject[parent.transform.childCount]; 49 50 for (int i = 0; i < child.Length; i++) 51 { 52 child[i] = parent.transform.Find($"{childName} ({i + 1})").gameObject; 53 } 54 } 55 56 /// <summary> 57 /// キャラクターと看板の距離を比較 58 /// </summary> 59 private void DistanceToTheCharacter() 60 { 61 float playerPos = player.transform.position.x; 62 Debug.Log(playerPos); 63 **float boardPos = signBoard[value].transform.localPosition.x;** 64 Debug.Log(boardPos); 65 float distance = Mathf.Abs(boardPos - playerPos); 66 Debug.Log(distance); 67 68 if (distance <= range) 69 { 70 StartCoroutine(ExpranationDisPlay()); 71 } 72 } 73 74 /// <summary> 75 /// 説明文を表示するときのフェードイン 76 /// </summary> 77 /// <returns></returns> 78 private IEnumerator ExpranationDisPlay() 79 { 80 var size = 0.0f; 81 var speed = 0.05f; 82 background.enabled = true; 83 84 while (size <= 1.0f) 85 { 86 expranation[value].transform.localScale = Vector2.Lerp(new Vector2(0, 0), new Vector2(1, 1), size); 87 size += speed; 88 yield return null; 89 } 90 91 yield return new WaitUntil(() => Input.GetMouseButtonDown(0)); 92 93 while (size >= 0) 94 { 95 expranation[value].transform.localScale = Vector2.Lerp(new Vector2(0, 0), new Vector2(1, 1), size); 96 size -= speed; 97 yield return null; 98 } 99 100 background.enabled = false; 101 expranation[value].gameObject.SetActive(false); 102 value++; 103 } 104}

float boardPos = signBoard[value].transform.localPosition.x;
の部分でコルーチンの中身で表示処理後、valueの値を加算するとエラーが出ます。
valueの部分を1,2,3...など直接値を入れるとエラーはでず、正常に処理されます。
おそらくvalueの値がコルーチンの処理で想定とは違う値になっているのだと思います。
ですが、なぜそのようなことが起きるのか分かりません。
どなたかわかる方がいましたら回答お願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

条件を満たしている間、ExpranationDisPlay()が何度も実行されているためですね

C#

1 bool test = false; 2 private IEnumerator ExpranationDisPlay() 3 if (test) { yield break; } 4 test = true; 5 ~~~ 省略 ~~~ 6 value++; 7 test = false; 8 {

適当ですがとりあえずこんな感じに変えたら大丈夫だと思います

投稿2020/12/24 12:26

lazh

総合スコア300

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

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

YDK

2020/12/24 13:41

回答ありがとうございます。 Updateで呼ぶとマイフレーム呼び出されるから値の加算はフラグ管理などする 必要があったことを忘れてました。 簡潔で分かりやすかったです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問