【Unity】重ならないようにランダムにオブジェクトを配置する – Unityの使い方|初心者からわかりやすく 您所在的位置:网站首页 caj文件打印出来都是半截 【Unity】重ならないようにランダムにオブジェクトを配置する – Unityの使い方|初心者からわかりやすく

【Unity】重ならないようにランダムにオブジェクトを配置する – Unityの使い方|初心者からわかりやすく

#【Unity】重ならないようにランダムにオブジェクトを配置する – Unityの使い方|初心者からわかりやすく| 来源: 网络整理| 查看: 265

スクリプトでアイテムが重ならないようにランダムに配置してみました。

ランダムの位置を設定

Random.insideUnitCircleメソッドは、半径1の円の内部のランダムな位置を返します。その位置に値をかけると半径を伸縮できます。

戻り値の型はVector2なので、これをVector3の変数に入れてY軸とZ軸を入れ替えることで、床に沿った位置にしています。

// ランダムの位置 Vector3 pos = Random.insideUnitCircle * 5; pos.z = pos.y; pos.y = 0.5f; アイテムをインスタンス化

この位置を使ってアイテムをインスタンス化すると、互いに重なることがあります。

これを回避するために、Physics.CheckBoxメソッドを使って、アイテムを配置したいところにボックスを作り、それが他のアイテムと重ならないときだけアイテムをインスタンス化しました。

重なりを確認

Physics.CheckBoxメソッドの第1引数にはボックスの中心、第2引数にはボックスサイズの半分を渡します。

このボックスが他のコライダーと重ならないときにtrueを返します。

// ボックスサイズの半分 Vector3 halfExtents = new Vector3(0.5f, 0.5f, 0.5f); // --- // 10回試す for (int n = 0; n

他のアイテムと重なるときは位置を変えて再度ボックスを作っています。これを10回ずつ試すことにしました。

ボックスが床を無視してほしいので、アイテムのプレハブにレイヤーを設定して、第4引数にレイヤーマスクを入れています。

作られるアイテムの数に偏りができましたが、アイテム同士が重ならなくなりました。

using System.Collections.Generic; using UnityEngine; public class PlaceItemsTest : MonoBehaviour { // アイテムのプレハブ [SerializeField] GameObject item; // アイテムを作る数 [SerializeField] int itemCount = 30; // アイテムのインスタンス List items = new List(); // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { // 左クリック if (Input.GetMouseButtonDown(0)) { // アイテムを全削除 foreach(var i in items) { Destroy(i); } items.Clear(); // ボックスサイズの半分 Vector3 halfExtents = new Vector3(0.5f, 0.5f, 0.5f); // アイテムを作る for (int i = 0; i FacebooktwitterHatena 関連記事: 【Unity】アイテムをランダムに配置する 【Unity】変形したPlaneの表面上のランダムな点を取得する 【Unity】一人称視点でオブジェクトを持ち上げて投げる 【Unity】レイの当たった場所を掴む


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有