MRが楽しい

MRやVRについて学習したことを書き残す

Unityでランダムなベクトルをオブジェクト自身から見た特定ベクトル方向に投射する

本日はUnityの小ネタ枠です。
Unityでランダムなベクトルをオブジェクト自身から見た特定ベクトル方向に投射する方法についてです。

Vector3.Project

Vector3.Projectメソッドは特定ベクトルを別の指定ベクトルに投影します。
これにより特定ベクトルの指定ベクトル方向の移動量を取得することができます。
docs.unity3d.com

以下のランダムなベクトルを自身の正面ベクトルに投射するサンプルスクリプトを作成しました。
・VectorProjectTest.cs

using System.Collections;
using UnityEngine;

public class VectorProjectTest : MonoBehaviour
{
    [ContextMenu("MoveProject")]
    public void MoveProject()
    {
        // ランダムなベクトルを生成する
        Vector3 randomVector = new Vector3(Random.Range(-10f, 10f), Random.Range(-10f, 10f), Random.Range(-10f, 10f));
        
        // オブジェクトの正面ベクトルに投射する
        Vector3 projectVector = Vector3.Project(randomVector, transform.forward);
        
        // ランダムベクトルと投射後のベクトルをデバッグログに表示する
        Debug.Log($"randomVector: {randomVector}, projectVector: {projectVector}");
        
        // 現在の座標から投射したベクトルを足して目標座標を求める
        Vector3 startPosition = transform.position;
        Vector3 targetPosition = startPosition + projectVector;
        
        // コルーチンを使って現在の座標から1秒かけて目標座標に移動する
        StartCoroutine(MoveCoroutine(targetPosition));
    }
    
    private IEnumerator MoveCoroutine(Vector3 targetPosition)
    {
        float elapsedTime = 0;
        Vector3 startPosition = transform.position;
        while (elapsedTime < 1)
        {
            elapsedTime += Time.deltaTime;
            transform.position = Vector3.Lerp(startPosition, targetPosition, elapsedTime);
            yield return null;
        }
    }
}

以下のSphereオブジェクトにスクリプトを設定しました。
結果が分かりやすいように正面ベクトル方向にPlaneオブジェクトを重ねています。

シーンを再生してMoveProjectメソッドを実行します。

以下の通りランダムなベクトルをもとにオブジェクト自身のベクトル方向に沿って移動しました。