🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

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

Q&A

3回答

5675閲覧

Unityでランダムに重複せずオブジェクトを配置する方法

kassi

総合スコア3

C#

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

Unity

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

0グッド

0クリップ

投稿2021/01/12 10:55

現在ランダムにオブジェクトを配置するはができました。
しかしそのオブジェクトが重複してしまいます。どうすれば重複しないようになるのでしょうか?

何か足りなところがございましたら、コメントいただけますと幸いです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class GameManager : MonoBehaviour { 6 7 public GameObject kugi; 8 9 public float xMinPosition;//-2.5 10 public float xMaxPosition;//1.7 11 public float yMinPosition;//-3 12 public float yMaxPosition;//2.5 13 public float zMinPosition;//0 14 public float zMaxPosition;//0 15 16 // Use this for initialization 17 void Start () { 18 19 for (int i = 0; i <= 4; i++) { 20 GameObject UnmovableBox = Instantiate (kugi); 21 UnmovableBox.transform.position = GetRandomPosition (); 22 } 23 } 24 // Update is called once per frame 25 void Update () { 26 27 } 28 private Vector3 GetRandomPosition(){ 29 30 float x = Random.Range (xMinPosition, xMaxPosition); 31 float y = Random.Range (yMinPosition, yMaxPosition); 32 float z = Random.Range (zMinPosition, zMaxPosition); 33 34 return new Vector3 (x, y, z); 35 } 36} 37

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

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

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

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

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

guest

回答3

0

求めている条件による所があるかと思います。

方法の一つとしてのコードを提示します。

using System.Collections.Generic; // リスト使いますのでジェネリックもいります using System.Linq; // リンクも使います void Start() { var list = new List<Vector3>(); // まずリストを生成します float socialDistance = 1.0f; // 生成物のソーシャルディスタンスを設定します for (int i=0;i < 10;i++) // とりあえず10個作ろうかな { var position = GetRandomPosition(); // メソッドは省きます、流用しました // リスト全体からGetRandomPositionの値のソーシャルディスタンス内のオブジェクトがいるか探します if (list.Where(_ => Vector3.Distance(position, _) < socialDistance).Any()) { // 密なのでやり直し(continue)、なんとなく10個は生成したいのでマイナスします、当然ですが10個作れない状況になったら無限ループになりますので注意 i--; continue; } // オブジェクトは球でも作っときましょうか、生成ついでに位置も代入しときます GameObject.CreatePrimitive(PrimitiveType.Sphere).transform.position = position;   list.Add(position); // 判定に必要あ生成位置をリストに追加します } }

方法はいくらでもあると思います。

もしかするとコード部分の意味は分からないかもしれませんが、コメントで何をしているか?は理解できるように書いたつもりです。

投稿2021/01/13 10:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

Physics.OverlapBox を使えば指定範囲に既にオブジェクトが配置されているかを確認できると思います。

GameObject kugiには予めColliderコンポーネントを追加しておく必要があります。

OverlapBoxで指定範囲にオブジェクトが無ければ重複せずに配置できると判断して指定箇所にInstantiateを実行すれば所望の動作になると思います。

投稿2021/01/23 02:55

tor4kichi

総合スコア769

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

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

0

複製するオブジェクトにcolliderがあるのであれば、生成前にRayで確認するのが良いかと。

もしないのであれば、重い処理ですが生成時に全てのオブジェクトとの距離を測ったりする必要があると思います。

投稿2021/01/12 15:18

PinoMatcha

総合スコア368

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

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

kassi

2021/01/12 22:00

コメントありがとうございます。 Rayについて自分なりに調べてみましたが、どうすれば自分のしたいことに応用できるのかがわかりませんでした。 可能でしたらもう少し説明して頂けますと幸いです。
PinoMatcha

2021/01/13 03:39

生成する座標があると思います。 GetRandomPosition()で返ってくるやつですかね? そこのポジションの真上から下に向けてRayを放ち衝突判定の有無を確かめれば生成したいポジションにオブジェクトが既にあるかどうかを判定できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問