前提
unityで、「Heso」というタグが付いたオブジェクトに衝突したら抽選を行うが、抽選を実行中に衝突が起きれば抽選回数をストックで表示させ、一回の抽選が終わればストックを消費して抽選を行う。抽選結果を画像を出力する関数で出力するというプログラムを作成したいです。しかし3つほど要件通りにいかないことがあります。
1つ目は、ストックの増減を表現することができないことです。ストックを配列に格納しておき、カウントの数を要素数としてストックを呼び出します。衝突すればストックのカウントを増やし、抽選関数を実行待ちの間も増え、実行するときにカウントを減らすという仕組みにすれば衝突回数分ストックを貯められるかと思いましたが、ストックが表示されません。
2つ目は、球が衝突するたびに呼び出されるはずなのですが、画像変更の関数が1つ目と同じように一回しか呼び出されないことです。画像変更関数は画像をフォルダから取得して配列に格納し、配列からランダムな要素数の画像を選択し、出力するという関数です。
3つ目は、画像変更関数が呼び出されてもimg1しか変化しないことです。
もしよろしければご教授お願いいたします。
実現したいこと
・抽選待ちの間に衝突が起これば衝突回数分ストックが表示される
・衝突回数分ストックがたまり抽選関数、画像変更関数が何度も呼び出される
・img1~img3までを時間差で変化させる動作をしてくれる
発生している問題・エラーメッセージ
該当のソースコード
C#
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;using UnityEngine.Video; public class Lottery : MonoBehaviour { public GameObject[] stocks = new GameObject[8]; public RawImage img1; public RawImage img2; public RawImage img3; public List<Texture> texture_list = new List<Texture>(); int count = 0; void Start() { //Stockを非表示にする for (int i = 1; i< 8; i++) { stocks[i-1] = GameObject.Find("AllStock").transform.Find("Stock" + i).gameObject; stocks[i - 1].SetActive(false); } img1 = GameObject.Find("RawImage1").GetComponent<RawImage>(); img2 = GameObject.Find("RawImage2").GetComponent<RawImage>(); img3 = GameObject.Find("RawImage3").GetComponent<RawImage>(); read_img(7); } public void read_img(int n) { Texture tmp; for (int i = 1; i < n + 1; i++) { tmp = Resources.Load("img/" + i) as Texture; texture_list.Add(tmp); } } //衝突検知 IEnumerator OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "Heso") { //Stockを格納した配列を呼び出すカウント count++; Destroy(collision.gameObject); //衝突回数分のStockを表示させたい if (count >= 0) { GetAnswer(); yield return new WaitForSeconds(4.0f); stocks[count].SetActive(true); } if(count == 7) { count = 7; } } } //抽選関数 void GetAnswer() { count--; int idAnswer = 0; idAnswer = Random.Range(0, 99); //当たり if (idAnswer == 1) { StartCoroutine("ChangeImage2"); } //はずれ else if (idAnswer == 2) { StartCoroutine("ChangeImage2"); } else if (idAnswer == 3) { StartCoroutine("ChangeImage2"); } else if (idAnswer == 4) { StartCoroutine("ChangeImage2"); } else if (idAnswer == 5) { StartCoroutine("ChangeImage2"); } else if (idAnswer == 6) { StartCoroutine("ChangeImage2"); } else { StartCoroutine("ChangeImage1"); } } //画像変更関数1 IEnumerator ChangeImage1() { int imgNum1 = Random.Range(1, texture_list.Count); int imgNum2 = Random.Range(1, texture_list.Count); int imgNum3 = Random.Range(1, texture_list.Count); if (imgNum1 == imgNum2) { imgNum1 = 1; imgNum2 = 2; } img1.texture = texture_list[imgNum1]; yield return new WaitForSeconds(1.0f); img2.texture = texture_list[imgNum2]; yield return new WaitForSeconds(1.0f); img3.texture = texture_list[imgNum3]; } //画像変更関数2 IEnumerator ChangeImage2() { int imgNum1 = Random.Range(1, texture_list.Count); int imgNum2 = imgNum1; int imgNum3 = Random.Range(1, texture_list.Count); img1.texture = texture_list[imgNum1]; yield return new WaitForSeconds(1.0f); img2.texture = texture_list[imgNum2]; yield return new WaitForSeconds(1.0f); img3.texture = texture_list[imgNum3]; }}
試したこと
画像変更関数はコルーチンを搭載してから調子が悪くなったのでyield return new WaitForSecondsをコメントアウトしてみたら時間差は表現できなくなったが画像は要件通り変化した。
0 コメント