我不知道为什么我的代码不能按预期工作!
当我把速度= 1,它工作正常。但是如果我提高速度,它就不起作用了。
我也尝试FixedUpdate
在 circle 类上使用,但没有解决问题。
我不知道我还需要做什么。
实际行为:
预期行为:
轨道等级:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Orbit : MonoBehaviour
{
public Circle circlePrefab;
public Vector2 centerPoint = Vector2.zero;
[Range(3, 360)] public int segments = 5;
public float xRadius = 2f;
public float yRadius = 2f;
public int numberOfCircles = 0;
public float speed = 0f;
private Vector2 initPosition = new Vector2(0, 2f);
private Vector2[] points;
private List<float> distances = new List<float>();
private float totalDistance = 0;
// Start is called before the first frame update
void Start()
{
points = new Vector2[segments];
for (var i = 0; i < segments; i++)
{
Vector2 point = GetPathPoint(i / (float) segments);
if (i > 0)
totalDistance += AddSegment(points[i - 1], point);
points[i] = point;
}
totalDistance += AddSegment(points[segments - 1], points[0]);
StartCoroutine(InitCircles());
}
private Vector2 GetPathPoint(float t)
{
var angle = t * 360f * Mathf.Deg2Rad;
var x = Mathf.Sin(angle) * xRadius;
var y = Mathf.Cos(angle) * yRadius;
return new Vector2(centerPoint.x + x, centerPoint.y + y);
}
private float AddSegment(Vector2 from, Vector2 to)
{
float distance = (from - to).sqrMagnitude;
distances.Add(distance);
return distance;
}
private IEnumerator InitCircles()
{
yield return new WaitForSeconds(1);
var time = new WaitForSeconds(totalDistance / speed / numberOfCircles);
for (var i = 0; i < numberOfCircles; i++)
{
Circle circle = Instantiate(circlePrefab, initPosition, transform.rotation);
circle.transform.parent = transform;
circle.name = "circle " + i;
circle.points = points;
circle.distances = distances;
circle.speed = speed;
yield return time;
}
}
}
圈类:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Circle : MonoBehaviour
{
public Vector2[] points;
public float speed = 1f;
public List<float> distances = new List<float>();
private float distance = 0;
private int currentIndex = 0;
private float time = 0;
private Vector2 currentPoint;
private Vector2 nextPoint;
// Start is called before the first frame update
void Start()
{
currentPoint = points[currentIndex];
nextPoint = points[currentIndex + 1];
}
// Update is called once per frame
void Update()
{
if (transform.position == (Vector3) nextPoint)
{
currentIndex++;
currentIndex %= distances.Count;
time = 0;
currentPoint = points[currentIndex];
nextPoint = points[(currentIndex + 1) % points.Length];
}
time += Time.deltaTime;
distance = time * speed / distances[currentIndex];
transform.position = Vector2.Lerp(currentPoint, nextPoint, distance);
}
}