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); } }