ゲーム制作でチュートリアルを作っているのですが、説明文を表示する看板があって
プレイヤーが看板に近づいたらコルーチンで説明文を表示する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の値がコルーチンの処理で想定とは違う値になっているのだと思います。
ですが、なぜそのようなことが起きるのか分かりません。
どなたかわかる方がいましたら回答お願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/24 13:41