[Unity] LineRendererの座標

LineRenderを使っている時に、何故か自分が描きたい位置から線がずれてしまいました。
その原因と解決策を記しておきます。

Positionsは初期状態ではローカル座標

原因は、ワールド座標のつもりで設定していたPositionsが実はローカル座標だったことでした。

解決策1 UseWorldSpaceをOnにする

LineRendererにはUseWorldSpaceというオプションがあります。
このオプションがオンの場合、LineRendererはワールド座標を使用し、オフの場合はオブジェクトのローカル座標に基づいて描画されます。

解決策2 オブジェクトの座標を(0, 0, 0)にする

当然といえば当然ですが、LineRendererがアタッチされたオブジェクトの座標を(0, 0, 0)とすれば、自ずとローカル座標とワールド座標が一致し、設定したPositions通りに描画してくれます。

具体例

画像やスクリプトを用いて具体例を示します。

座標(0, 0, 0)から(1, 1, 0)まで赤い線を引きたいです。DrawLineスクリプトをC#で書いて、Lineという空のオブジェクトにLineRendererとDrawLineスクリプトをアタッチします。

C#
using UnityEngine;

public class DrawLine : MonoBehaviour
{
    private LineRenderer lineRenderer;

    void Start()
    {
        // LineRendererコンポーネントを取得
        lineRenderer = GetComponent<LineRenderer>();

        // 頂点の数を設定(2つの点を結ぶので2)
        lineRenderer.positionCount = 2;

        // 線の開始位置 (0, 0, 0) と終了位置 (1, 1, 0) を設定
        lineRenderer.SetPosition(0, new Vector3(0, 0, 0));  // 開始点
        lineRenderer.SetPosition(1, new Vector3(1, 1, 0));  // 終了点
    }
}
C#

分かりやすいように(0, 0, 0)にOriginという赤い原点を用意し、実行してみます。

Positionsの座標は合っているのに全然違う位置に生成されてしまいます。なぜなら親であるLineの座標が(1.8, 1.52, 0)なんてことになっているからです。

UseWorldSpaceにチェックを入れて実行します。

きちんと(0, 0, 0)から(1, 1, 0)まで線を引いてくれました。

UseWorldSpaceのチェックを外し、Lineの座標を(0, 0, 0)に設定してみます。

上手く引けました。

最後に

分かってしまえば簡単なことですが、知らないと何が原因で座標がずれているか分からず、色んな要素を確認して結構手間取ってしまいました。

コメント

タイトルとURLをコピーしました