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

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

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

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

Unity

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

Q&A

1回答

1173閲覧

Unity 10個の変数をランダムに重複なしで、当たり判定ごとに1個ずつ抽出

mayamaya1020

総合スコア2

C#

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

Unity

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

0グッド

0クリップ

投稿2020/10/07 03:05

実現したいこと

「プレイヤーが特定のオブジェクトに触れたとき、音が鳴る。その音の座標は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回抽出してしまっている点を直さなければいけないです。

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

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

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

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

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

guest

回答1

0

リストに入った10個のデータを乱数により配置をランダムに変えてしまえば、あとはアタマから順に取り出せばそれで済むようになりますね

投稿2020/10/07 03:10

y_waiwai

総合スコア87774

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

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

mayamaya1020

2020/10/07 12:28

Vector3 a = new Vector3(1.0f, 2.0f, 3.0f); Vector3 b = new Vector3(1.0f, 2.0f, 3.0f); Vector3 c = new Vector3(1.0f, 2.0f, 3.0f); Vector3 d = new Vector3(1.0f, 2.0f, 3.0f); Vector3 e = new Vector3(1.0f, 2.0f, 3.0f); Vector3 f = new Vector3(1.0f, 2.0f, 3.0f); Vector3 g = new Vector3(1.0f, 2.0f, 3.0f); Vector3 h = new Vector3(1.0f, 2.0f, 3.0f); Vector3 i = new Vector3(1.0f, 2.0f, 3.0f); Vector3 j = new Vector3(1.0f, 2.0f, 3.0f); Vector3 k = new Vector3(1.0f, 2.0f, 3.0f); このようにしてa~kの座標データを用意したのですが、それを格納する方法。そこから当たり判定があるたびに値を取り出すコードが分かりません。 次段階として、a~kを格納する必要があるのですが、試しに下記のコードを書いてみましたが、エラーが出てしまい。やはり解決することができませんでした。 string[] A; A = {a, b, c, d, e, f, g, h, i, j, k}; 下記エラーが出ております。 Invalid token ',' in class, struct, or interface member declaration Type or namespace definition, or end-of-file expected
y_waiwai

2020/10/07 13:03

それを配列なりリストに入れれば、数値(インデックス)でアクセスできますよ
mayamaya1020

2020/10/08 01:06 編集

配列、リスト等調べなければいけないことは検索して試していますができない状況です。 具体的にどのようなコードを使い、a~kを配列またはリストに入れてランダムに取り出すのか教えていただけませんか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問