using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
///
/// ·Îº¿ÀÇ À̵¿ °æ·Î(Path)¸¦ 3D °ø°£ »ó¿¡ ½Ã°¢ÀûÀ¸·Î ±×·ÁÁÖ´Â ºä(View) Ŭ·¡½º
/// UnityÀÇ LineRenderer ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇÏ¿© Á¡°ú Á¡ »çÀ̸¦ ¼±À¸·Î ¿¬°á
///
// ÀÚµ¿À¸·Î LineRenderer ÄÄÆ÷³ÍÆ® Ãß°¡
[RequireComponent(typeof(LineRenderer))]
public class PathLineView : MonoBehaviour
{
private LineRenderer lineRenderer;
void Awake()
{
lineRenderer = GetComponent();
// Line Renderer ±âº» ¼³Á¤
lineRenderer.startWidth = 0.01f;
lineRenderer.endWidth = 0.01f;
lineRenderer.material = new Material(Shader.Find("Legacy Shaders/Particles/Alpha Blended Premultiply"));
lineRenderer.startColor = Color.cyan;
lineRenderer.endColor = Color.cyan;
}
private Vector3 ConvertRobotDataToVector3(RobotData pose)
{
float x = Convert.ToSingle(pose.x / -1000.0); // mm -> m
float y = Convert.ToSingle(pose.z / 1000.0); // Robot Z(mm) -> Unity Y(m)
float z = Convert.ToSingle(pose.y / -1000.0); // Robot Y(mm) -> Unity Z(m)
return new Vector3(x, y, z);
}
///
/// ÇÁ·Î±×·¥ÀÇ ¸ðµç Æ÷ÀÎÆ®¸¦ ¼ø¼´ë·Î ÀÕ´Â ¼±À» ±×¸²
///
public void DrawPath(List poses)
{
if (poses == null || poses.Count < 2)
{
lineRenderer.positionCount = 0; // Æ÷ÀÎÆ®°¡ 2°³ ¹Ì¸¸ÀÌ¸é ¼±À» Áö¿ò
return;
}
// LINQÀÇ Select¸¦ »ç¿ëÇÏ¿© ¸®½ºÆ®ÀÇ ¸ðµç RobotData¸¦ Vector3 ¹è¿·Î º¯È¯
Vector3[] positions = poses.Select(ConvertRobotDataToVector3).ToArray();
// LineRenderer¿¡ Á¤Á¡ °³¼ö¿Í À§Ä¡ ¹è¿ Àü´Þ
lineRenderer.positionCount = positions.Length;
lineRenderer.SetPositions(positions);
}
///
/// ƯÁ¤ Æ÷ÀÎÆ®¸¦ µå·¡±×ÇÏ¿© ¼öÁ¤ ÁßÀÏ ¶§, °æ·Î¸¦ ½Ç½Ã°£À¸·Î °»½ÅÇÏ¿© ±×¸²
/// (µ¿Àû °æ·Î ¹Ì¸®º¸±â¿ë)
///
/// ±âÁ¸ Æ÷ÀÎÆ® ¸®½ºÆ®
/// ÇöÀç ¼öÁ¤(µå·¡±×) ÁßÀÎ Æ÷ÀÎÆ®ÀÇ À妽º
/// ¼öÁ¤ ÁßÀÎ Æ÷ÀÎÆ®ÀÇ ½Ç½Ã°£ Àӽà ÁÂÇ¥
public void DrawPath(List poses, int modifiedIndex, RobotData tempPose)
{
// À¯È¿¼º °Ë»ç: À妽º°¡ ¹üÀ§¸¦ ¹þ¾î³ª¸é ±âÁ¸ °æ·Î´ë·Î ±×¸®±â
if (poses == null || poses.Count < 2 ||
modifiedIndex < 0 || modifiedIndex >= poses.Count)
{
DrawPath(poses);
return;
}
// 1. ±âÁ¸ Æ÷ÀÎÆ®µéÀ» ¸ðµÎ Vector3 ¹è¿·Î º¯È¯
Vector3[] positions = poses.Select(ConvertRobotDataToVector3).ToArray();
// 2. ¼öÁ¤ ÁßÀÎ À妽ºÀÇ ÁÂÇ¥¸¸ µå·¡±× ÁßÀÎ Àӽà ÁÂÇ¥(tempPose)·Î µ¤¾î¾²±â
// -> ¿øº» µ¥ÀÌÅÍ(List)¸¦ °Çµå¸®Áö ¾Ê°íµµ ½Ã°¢ÀûÀ¸·Î¸¸ °æ·Î°¡ ¹Ù²ï °ÍÀ» º¸¿©ÁÙ ¼ö ÀÖÀ½
positions[modifiedIndex] = ConvertRobotDataToVector3(tempPose);
// 3. °»½ÅµÈ ÁÂÇ¥ ¹è¿·Î ¼± ±×¸®±â
lineRenderer.positionCount = positions.Length;
lineRenderer.SetPositions(positions);
}
}