You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.9 KiB
C#
62 lines
1.9 KiB
C#
using UnityEngine;
|
|
using System.Collections.Generic;
|
|
using DG.Tweening;
|
|
|
|
public class HurdleSpawner : MonoBehaviour
|
|
{
|
|
[Header("Setup")]
|
|
public DOTweenPath pathSource;
|
|
public GameObject hurdlePrefab;
|
|
public int numberOfHurdles = 10;
|
|
public float offsetFromGround = 0f;
|
|
|
|
[Header("Debug")]
|
|
public List<GameObject> spawnedHurdles = new();
|
|
|
|
[ContextMenu("Spawn Hurdles")]
|
|
public void SpawnHurdles()
|
|
{
|
|
if (pathSource == null || hurdlePrefab == null)
|
|
{
|
|
Debug.LogError("❌ Missing references.");
|
|
return;
|
|
}
|
|
|
|
// Get draw points in world space
|
|
Vector3[] drawPoints = pathSource.GetDrawPoints();
|
|
|
|
if (drawPoints == null || drawPoints.Length < 2)
|
|
{
|
|
Debug.LogError("❌ Draw points are invalid.");
|
|
return;
|
|
}
|
|
|
|
// Clean previous
|
|
foreach (var h in spawnedHurdles)
|
|
{
|
|
if (h != null)
|
|
DestroyImmediate(h);
|
|
}
|
|
spawnedHurdles.Clear();
|
|
|
|
// Spawn new hurdles at evenly spaced interpolated points
|
|
for (int i = 0; i < numberOfHurdles; i++)
|
|
{
|
|
// Even spacing between 0.05 and 0.95 to avoid endpoints
|
|
float t = Mathf.Lerp(0.05f, 0.95f, i / (float)(numberOfHurdles - 1));
|
|
float floatIndex = t * (drawPoints.Length - 1);
|
|
|
|
int iA = Mathf.FloorToInt(floatIndex);
|
|
int iB = Mathf.Min(iA + 1, drawPoints.Length - 1);
|
|
float lerpT = floatIndex - iA;
|
|
|
|
Vector3 worldPos = Vector3.Lerp(drawPoints[iA], drawPoints[iB], lerpT);
|
|
worldPos.y += offsetFromGround;
|
|
|
|
GameObject hurdle = Instantiate(hurdlePrefab, worldPos, Quaternion.identity, transform);
|
|
spawnedHurdles.Add(hurdle);
|
|
}
|
|
|
|
Debug.Log($"✅ Spawned {numberOfHurdles} hurdles at world positions in ascending order.");
|
|
}
|
|
} |