【Unity】変形したPlaneの表面上のランダムな点を取得する

投稿者: | 2021-06-04

床の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の移動・回転・拡大についてきます。

移動
拡大・回転

スケールが偏っていても問題ありません。

Zのみ拡大

コメントを残す

メールアドレスが公開されることはありません。