1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Unity(C#)】TrailRendererの頂点座標を取得する方法

Last updated at Posted at 2020-03-22

##TraliRenderer
TrailRendererを使えば簡単なお絵描き機能がサクッと実装できます。

【参考リンク】:【Unity(C#)】ハンドトラッキングで簡易版VRお絵かきアプリ

今回はTrailRendererの頂点座標を取得していきます。

最終的には頂点座標をシリアライズしてJson形式で保存、
セーブデータとして外部リソースに保存したのち、
デシリアライズしてロード、、、までやります。

##デモ
今回行ったデモはこちらです。

PaintTest.gif

中央のボタンを押すと、各TrailRendererの頂点にオブジェクトが生成されます。

##コード


using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// お絵描き機能 適当なオブジェクトにアタッチ
/// </summary>
public class Paint : MonoBehaviour
{
    [SerializeField] private Transform _paintObjParent;

    [SerializeField] private GameObject _paintObjPrefab;

    [SerializeField] private GameObject _vertCube;
    
    private GameObject _tmpPaintObj;
    
    private void Update()
    {
        //スクリーン座標をワールド座標に変換
        Vector3 worldClickPos = Camera.main.ScreenToWorldPoint(Input.mousePosition +  Camera.main.transform.forward);
        
        //マウス押した瞬間
        if (Input.GetMouseButtonDown(0))
        {
            _tmpPaintObj = Instantiate(_paintObjPrefab, worldClickPos, Quaternion.identity);
            _tmpPaintObj.transform.parent = _paintObjParent;
        }

        //マウス押し続けている間
        if (Input.GetMouseButton(0))
        {
            _tmpPaintObj.transform.position = worldClickPos;
        }
    }

    /// <summary>
    /// 全てのTrailRendererの全頂点を取得 Buttonに登録
    /// </summary>
    public void GetVert()
    {             
        foreach (Transform child in _paintObjParent.transform)
        {
            TrailRenderer tr = child.GetComponent<TrailRenderer>();
            int posCount = tr.positionCount;
            Vector3[] posArray = new Vector3[posCount];

            //全ての頂点を取ってくる
            int vertCount =  tr.GetPositions(posArray);
                        
            //描画した頂点座標を確認
            for (int i = 0; i < vertCount; i++)
            {
                Debug.Log(posArray[i]);
                Instantiate(_vertCube, posArray[i], Quaternion.identity);
            }
        }
    }
}

今回の記事内においては本質ではないので詳細には触れませんが、
クリック時にTrailRederer付きゲームオブジェクトを生成しています。

そのせいで、Listを使って若干複雑になっていますが、
下記リンク内で詰まっていた、
消しゴム機能(Undo,Redo)の実装時に役立ちます。
Save,Load時に活用します。

【参考リンク】:【Unity(C#)】ハンドトラッキングで簡易版VRお絵かきアプリ
##GetPositions

TrailRendererコンポーネントに実装された、
GetPositionsメソッドを使用して頂点を取得しています。
引数に頂点座標分の数だけ要素が存在する配列を渡してあげれば、
すべての頂点を取得できます。

##まとめ

今回の頂点の取得により、TrailRendererのシリアライズの準備が整いました。

次回はシリアライズから、デシリアライズまで一気に進めようと思います。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?