まず範囲からランダムに座標をとって、その上からRayCastを飛ばして床にぶつかればアイテムを配置すると言う形がシンプルに実現可能だと思います。
RayCastとはある場所からある場所まで図形を飛ばして、衝突したものを返すメソッドです。
ランダムな範囲はこちらのメソッドで取れます。
https://docs.unity3d.com/ja/current/ScriptReference/Random.Range.html
RayCastは
https://docs.unity3d.com/ja/current/ScriptReference/Physics.SphereCast.html
c#
1//障害物にぶつからずアイテムを作成できる場所を返すメソッド
2
3//pos = 指定する範囲の中心
4//width = 範囲の幅
5//height = 範囲の高さ
6//ground = 地面のオブジェクト
7Vector3 randomItemDropPos(Vector3 pos, float width, float height, GameObject ground){
8
9 while(true){
10 Vector3 itemPos = new Vector3(Random.Range(-width, width), 0, Random.Range(-height, height)) + pos; //ランダムに取得したItemの座標
11 float topSpace = 10f;
12 Vector3 = itemPos + Vector3(0, topSpace, 0); //上空から
13 float itemSize = 0.5f; //このサイズの球体とぶつからなければ何も障害物はないとしてアイテムを置く
14 RayCastHit hit; //衝突した場合このオブジェクトに衝突した物体の情報が入る
15 //上空からアイテムを置く候補の場所まで球体を飛ばして衝突したらtrue
16 if(Physics.SphereCast(p1, itemSize, Vector3.down, out hit, topSpace)){
17 //衝突したものが地面ならアイテムを置ける
18 //それ以外とぶつかれば座標をランダムに取得する所からやりなおし。
19 if(hit.collider == ground){
20 return itemPos;
21 }
22 }
23}
イメージとしてはこんな感じで配置する座標を取得できると思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。