ID3/Assets/Path.cs
2026-03-19 02:02:28 +03:00

100 lines
2.7 KiB
C#

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Path : MonoBehaviour
{
public List<GameObject> nodes;
List<PathSegment> segments;
void Start()
{
segments = GetSegments();
}
public List<PathSegment> GetSegments()
{
List<PathSegment> segments = new List<PathSegment>();
int i;
for (i = 0; i < nodes.Count - 1; i++)
{
Vector3 src = nodes[i].transform.position;
Vector3 dst = nodes[i + 1].transform.position;
PathSegment segment = new PathSegment(src, dst);
segments.Add(segment);
}
return segments;
}
public float GetParam(Vector3 position, float lastParam)
{
float param = 0f;
PathSegment currentSegment = null;
float tempParam = 0f;
foreach (PathSegment ps in segments)
{
tempParam += Vector3.Distance(ps.a, ps.b);
if (lastParam <= tempParam)
{
currentSegment = ps;
break;
}
}
if (currentSegment == null)
return 0f;
Vector3 currPos = position - currentSegment.a;
Vector3 segmentDirection = currentSegment.b - currentSegment.a;
segmentDirection.Normalize();
Vector3 pointinSegment = Vector3.Project(currPos, segmentDirection);
param = tempParam - Vector3.Distance(currentSegment.a, currentSegment.b);
param += pointinSegment.magnitude;
return param;
}
public Vector3 GetPosition(float param)
{
Vector3 position = Vector3.zero;
PathSegment currentSegment = null;
float tempParam = 0f;
foreach (PathSegment ps in segments)
{
tempParam += Vector3.Distance(ps.a, ps.b);
if (param <= tempParam)
{
currentSegment = ps;
break;
}
}
if (currentSegment == null)
return Vector3.zero;
Vector3 segmentDirection = currentSegment.b - currentSegment.a;
segmentDirection.Normalize();
tempParam -= Vector3.Distance(currentSegment.a, currentSegment.b);
tempParam = param - tempParam;
position = currentSegment.a + segmentDirection * tempParam;
return position;
}
void OnDrawGizmos()
{
Vector3 direction;
Color tmp = Gizmos.color;
Gizmos.color = Color.magenta;
int i;
for (i = 0; i < nodes.Count - 1; i++)
{
Vector3 src = nodes[i].transform.position;
Vector3 dst = nodes[i + 1].transform.position;
direction = dst - src;
Gizmos.DrawRay(src, direction);
}
Gizmos.color = tmp;
}
}