MRが楽しい

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

Unityでオブジェクトをオブジェクト自身から見たベクトル方向に移動する

本日はUnityの小ネタ枠です。
Unityでオブジェクトをオブジェクト自身から見たベクトル方向に移動する方法についてです。

Transform.up/right/forward

Transform.up/right/forwardはオブジェクト自身から見た上下左右前後ろ方向のワールド座標のベクトルを返します。
docs.unity3d.com
docs.unity3d.com
docs.unity3d.com

以下のサンプルスクリプトを作成しました。
・VectorUpTest.cs

using System.Collections;
using UnityEngine;

public class VectorUpTest : MonoBehaviour
{
    [ContextMenu("MoveUp")]
    public void MoveUp()
    {
        Vector3 startPosition = transform.position;
        Vector3 targetPosition = startPosition + transform.up;
        
        // コルーチンを使って現在の座標から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;
        }
    }
}

以下の通りオブジェクトの回転に合わせてオブジェクト自身から見た上方向に移動します。


任意のベクトル方向に移動させる

上下左右前後ろ方向ではなく任意の方向に移動させたい場合は、オブジェクト自身のtransform.rotationをベクトルに掛け合わせます。
docs.unity3d.com

以下のサンプルスクリプトを作成しました。
・VectorRelativePositionTest.cs

using System.Collections;
using UnityEngine;

public class VectorRelativePositionTest : MonoBehaviour
{
    [ContextMenu("MoveRelativePosition")]
    public void MoveRelativePosition()
    {
        Vector3 moveVector = new Vector3(1, 1, 0);
        
        Vector3 startPosition = transform.position;
        Vector3 targetPosition = startPosition + transform.rotation * moveVector;
        
        // コルーチンを使って現在の座標から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;
        }
    }
}

以下の通りオブジェクトの回転に合わせてオブジェクト自身から見た任意のベクトル方向に移動します。