Unity で四角形を Transform から操作できるようにする

Grow Up Monsters でチュートリアルを作成するにあたり、フィールドを指し示すために四角形の枠を自由に取り扱える必要があった。しかしながら、Unity では枠線を作成するためには LineRenderer を用いて実装する必要があり、これは Transform から操作しても回転や移動などが反映されない。そこで、Transform のデータを反映するスクリプトを紹介させていただく。

1.通常の LineRenderer

通常の LineRenderer では赤枠の部分をいくら操作したとしても描画した線データには一切の影響を与えず青枠の部分に依存している。このままでは、毎回線の移動や回転拡大などを行うたびに再計算を行い青枠の位置データを更新しなければならない。

通常の LineRenderer

2.紹介する LineRenderer のスクリプト

今回、紹介させていただく LineRender のスクリプトは通常の LineRenderer とは異なり、青枠で設定したデータに対して赤枠の設定を反映するスクリプトとなっている。実際のスクリプトについては以下の通り。内容としては起動時にラインを構成するために基準となる初期のポイントを保存し、Awake と Update の処理内で Transform で設定した値を基準となるポイント郡対して反映するという内容である。

[cce_csharp]using UnityEngine;

public class LineManager : MonoBehaviour
{
    /// < summary>
    /// 基準となるポイント郡
    /// < /summary>
    private Vector3[] Points;
    /// < summary>
    /// Line形状の初期化
    /// < /summary>
    private void Awake()
    {
        Debug.Log("Init::Start");
        LineRenderer line = GetComponent< LineRenderer>();
        Points = new Vector3[line.positionCount];
        for (int i = 0; i <  line.positionCount; i++)
        {
            Points[i] = line.GetPosition(i);
            Vector3 point = transform.localToWorldMatrix * new Vector4(Points[i].x, Points[i].y, Points[i].z, 1);
            line.SetPosition(i, point);
        }
        Debug.Log("Init::End");
    }
    /// < summary>
    /// 更新処理
    /// < /summary>
    void Update()
    {
        LineRenderer line = GetComponent< LineRenderer>();
        for (int i = 0; i <  line.positionCount; i++)
        {
            Vector3 point = transform.localToWorldMatrix * new Vector4(Points[i].x, Points[i].y, Points[i].z, 1);
            line.SetPosition(i, point);
        }
    }
}[/cce_csharp]

3.本スクリプトの使用方法

本スクリプトを使用するには以下の手順で行うことができる。

  • 本スクリプトを LineRender が追加されている GameObject に対して追加し、Prefab に登録する
  • Prefab をメインのスクリプト上で生成し Transform の値を設定する。

サンプルとして以下にメインのスクリプトを記載させていただく。内容としては LineManager を追加した Prefab を Instantiate で生成し、その後ラインに対して回転する角度を与えるというものである。

[cce_csharp]using UnityEngine;

public class Sample : MonoBehaviour
{
    /// < summary>
    /// LineManager を追加した Prefab
    /// < /summary>
    [SerializeField]
    LineManager manager;
    /// < summary>
    /// 開始処理
    /// < /summary>
    void Start()
    {
        LineManager line = Instantiate(manager) as LineManager;
        // Y軸で 30° 回転する
        line.transform.localRotation = Quaternion.Euler(0, 30, 0);
    }
}
[/cce_csharp]

これによって以下のように任意の角度任意のサイズ任意の位置に移動できる、LineRenderer として扱うことができるようになる。

Transform の設定を反映したライン
%d人のブロガーが「いいね」をつけました。