床のPlaneオブジェクトの表面上の点をランダムに取得してみました。移動・回転・拡大をしても常にPlaneの表面を追跡します。
オブジェクトを配置
シーンに床用のPlaneと位置を設定するCubeを配置しました。
Planeはワールドの原点にあり、スクリプトが付いています。
そのスクリプトにCubeがアタッチされています。
スクリプト
スクリプトでは、RandomクラスのinsideUnitCircleで、半径1の円の中の点をランダムに取得します。5をかけると半径5の円になります。
using UnityEngine;
public class RandomPosition2 : MonoBehaviour
{
// シーンのオブジェクト
[SerializeField] Transform obj;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
// 左クリック
if(Input.GetMouseButtonDown(0))
{
// 半径5円の内部のランダムな点
Vector3 pos = Random.insideUnitCircle * 5f;
// y軸とz軸を入れ替える
pos.z = pos.y;
pos.y = 0f;
// 床(Plane)のローカル空間からワールド空間へ変換
pos = transform.TransformPoint(pos);
// シーンのオブジェクトの位置を変える
obj.transform.position = pos;
}
}
}
Vector2をVector3の変数に入れると、円はxy平面上にあります。真上へ向けたPlane上にしたいので、yの値をzに入れて、yの値を0にしました。
// y軸とz軸を入れ替える
pos.z = pos.y;
pos.y = 0f;
Transform.TransformPointメソッドを使って、その座標をPlaneのローカルからワールド空間に変換しました。
// 床(Plane)のローカル空間からワールド空間へ変換
pos = transform.TransformPoint(pos);
// シーンのオブジェクトの位置を変える
obj.transform.position = pos;
すると、CubeはPlaneの移動・回転・拡大についてきます。
スケールが偏っていても問題ありません。