実現したいこと
「プレイヤーが特定のオブジェクトに触れたとき、音が鳴る。その音の座標は10通り(プレイヤーの周りに存在し、プレイヤーを追従する)あり、そこからランダムで抽出される。音が鳴る工程が10回繰り返されたら終了(音は以後鳴らない)。音の座標は重複はしない。ただし、一度触れたオブジェクトに再度触れても音は鳴らない(もしくは一度触れられたオブジェクトは消滅する)。」
こちらが実現したいことです。
プレイヤーが特定のオブジェクトに触れたら→void OnTriggerEnter(Collider other) を使いました。
↓
[a, b, c, d, e, j, g, h, i, j, k]という10個の文字が格納されたリストから重複なしでランダムに一つ抽出
※a~k はそれぞれ音源の座標が関連付けられている(aは(0, 1, 1)、bは(0, 0 ,1)...等)
座標といってもプレイヤーを追従するため、座標指定しなくても良い?→音源を10個用意し、シーンに配置してプレイヤーの子のオブジェクトとすれば良いか
↓
音が鳴る→同じオブジェクトに再度振れても音はならない。
↓
文字は重複しないので、抽出を10回繰り返して終了。
発生している問題
当たり判定があったときに抽出させたいので
void OnTriggerEnter(Collider other)
内にコードを書く必要があると思うのですが、10個の変数をランダムに重複なしで、当たり判定ごとに1個ずつ抽出。としたいのでどのように書いたらいいのかわかりません。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Speaker : MonoBehaviour 6{ 7 public AudioClip sound; 8 public AudioSource audioSource; 9 10 11 void OnTriggerEnter(Collider other) 12 { 13 audioSource.PlayOneShot(sound); 14 Debug.Log("Hit!"); 15 } 16}
C#
1 2public class Rondom : MonoBehaviour 3{ 4 int start = 1; 5 int end = 10; 6 7 List<int> numbers = new List<int>(); 8 9 void OnTriggerEnter(Collider other) 10 { 11 for (int i = start; i <= end; i++) 12 { 13 numbers.Add(i); 14 } 15 16 while (numbers.Count > 0) 17 { 18 19 int index = Random.Range(0, numbers.Count); 20 21 int ransu = numbers[index]; 22 Debug.Log(ransu); 23 24 numbers.RemoveAt(index); 25 } 26 audioSource.PlayOneShot(sound); 27 Debug.Log("Hit!"); 28 } 29}
試したこと
C#というかプログラミング自体最近始めたばかりなので、細かいことの組み合わせがよく理解できません。
1つ目ののコードは当たり判定を持つオブジェクトにアタッチし、別に作成してある音源(audioSourse)から音が鳴るというものです。
2つ目のコードは作成途中(見当違いのことをしている気もするが…)でakではなく110にしています。ランダムに重複なくという点はクリアしてるようですが、当たり判定が起こったときに10回抽出してしまっている点を直さなければいけないです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/07 12:28
2020/10/07 13:03
2020/10/08 01:06 編集