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

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

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

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

Unity

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

Q&A

解決済

1回答

899閲覧

Unity:特定の3か所からランダムに1か所選択してオブジェクトを生成する方法がわかりません

Imoring

総合スコア4

C#

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

Unity

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

1グッド

0クリップ

投稿2022/09/25 06:26

前提

まだ勉強をし始めたばかりの初心者です。
現在Unityにて2Dの縦画面ランゲームを作成しており、その中で『特定の3か所からランダムで1か所選択してそこに障害物を生成する』ということを行いたいのですが、どのようなコードを書けば実現できるのかがわかりません。
どなたかヒントだけでもいいので教えていただきたいです。
よろしくお願いします。

実現したいこと

x座標は特定の3か所、y座標は常にカメラより上という条件下の3点からランダムで1か所、
また、生成されるタイミングもランダムという仕様でオブジェクトを生成したいです。
また、生成するオブジェクトの種類は1種類です。

試したこと

初心者なりに、空のオブジェクトを3つ設置してそれらのx座標を取得、y座標はカメラの座標を取得してそれにいくらか加算してあげれば、オブジェクトの生成位置候補を指定できるのではないか、というところまでは仮説を立ててみたのですが、それを実現する方法がわかりませんでした。

補足情報(FW/ツールのバージョンなど)

Unity 2021.3.10f1

ganta7188👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

Unityでオブジェクトを生成するInstantiateという関数がありますが、その第2引数が座標となります。
https://www.sejuku.net/blog/48180

出現位置は、空のオブジェクトから取得するよりも、Vector3型配列で宣言するほうが無駄がありません。

【追記】暇だったんで作りました

C#

1 public class Test : MonoBehaviour { 2 [SerializeField] GameObject _prefab; 3 4 // この座標は適当です。画面サイズに合わせて要変更。 5 // float型配列でX座標のみ保存してもいいかも 6 Vector3[] _generatePoint = { 7 new Vector3(-5.0f, 10.0f, 0.0f), 8 new Vector3(0.0f, 10.0f, 0.0f), 9 new Vector3(5.0f, 10.0f, 0.0f) 10 }; 11 12 float _span; 13 float _time = 0.0f; 14 15 private void Awake() { 16 ChangeSpan(); 17 } 18 19 private void Update() { 20 _time += Time.deltaTime; 21 if (_time > _span) { 22 int index = Random.Range(0, 3); // 生成する場所の決定 23 Instantiate(_prefab, (transform.position + _generatePoint[index]), Quaternion.identity); 24 ChangeSpan(); 25 _time = 0.0f; 26 } 27 } 28 29 private void ChangeSpan() { 30 _span = Random.Range(1.0f, 3.0f); // 1秒から3秒おき 31 } 32 }

このスクリプトをプレイヤに貼り付け、生成したいオブジェクトをインスペクターから_prefabに指定してください。
オブジェクトの出現位置は、カメラでなくプレイヤの位置を基準にしています。また、Main Cameraをプレイヤの子にすることでプレイヤを追尾させています。
あなたが前回作った、CarMoveスクリプトを併用しています。
適当なテストしかしてないのでバグがあるかもしれません。

投稿2022/09/25 09:40

編集2022/09/25 11:55
pm_tera

総合スコア133

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

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

Imoring

2022/09/25 13:50

pm_tera様、前回に引き続き今回もご丁寧にありがとうございます。 作っていただいたスクリプトのおかげで大まかに理屈は理解出来たのですが、 _generatePoint[index] の部分で何を行っているのかがよく分かりません。 恐らく最初に宣言したオブジェクト生成位置候補の中から1つをindexを用いて選択してるであろうということは理解できるのですが、なぜ[index]を付けるだけで選択できるのでしょうか。 これは[SerializeField]等と同じような 属性、というものなのでしょうか。 初歩的な質問で大変恐縮なのですが、後学のためにお教えいただけるとありがたいです。 よろしくお願いします。
Imoring

2022/09/28 11:52

なるほど、おかげさまで一つ理解できました。 これのおかげで一つの変数に複数の要素が入れられるんですね。 わざわざ解説のリンクまで貼っていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問