##TraliRenderer
TrailRendererを使えば簡単なお絵描き機能がサクッと実装できます。
【参考リンク】:【Unity(C#)】ハンドトラッキングで簡易版VRお絵かきアプリ
今回はTrailRendererの頂点座標を取得していきます。
最終的には頂点座標をシリアライズしてJson形式で保存、
セーブデータとして外部リソースに保存したのち、
デシリアライズしてロード、、、までやります。
##デモ
今回行ったデモはこちらです。
中央のボタンを押すと、各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のシリアライズの準備が整いました。
次回はシリアライズから、デシリアライズまで一気に進めようと思います。