42 lines
1.3 KiB
C#
42 lines
1.3 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace Code.Track
|
|
{
|
|
public static class TrackGenerator
|
|
{
|
|
public static TrackData Generate(int seed, float targetLength = 200f, int segmentCount = 15)
|
|
{
|
|
Random.InitState(seed);
|
|
|
|
var points = new List<Vector3> { Vector3.zero };
|
|
var currentPos = Vector3.zero;
|
|
var direction = Vector3.forward;
|
|
|
|
for (var i = 0; i < segmentCount; i++)
|
|
{
|
|
var turn = Random.Range(-25f, 25f);
|
|
direction = Quaternion.Euler(0, turn, 0) * direction;
|
|
direction.y = 0;
|
|
direction.Normalize();
|
|
|
|
var segLen = targetLength / segmentCount;
|
|
currentPos += direction * segLen;
|
|
points.Add(currentPos);
|
|
}
|
|
|
|
var actualLength = 0f;
|
|
for (var i = 1; i < points.Count; i++)
|
|
actualLength += Vector3.Distance(points[i - 1], points[i]);
|
|
|
|
if (actualLength > 0.1f)
|
|
{
|
|
var scale = targetLength / actualLength;
|
|
for (var i = 1; i < points.Count; i++)
|
|
points[i] *= scale;
|
|
}
|
|
|
|
return new TrackData(points);
|
|
}
|
|
}
|
|
} |