fait pivoter un point arbitraire autour d’un autre point arbitraire

J’ai écrit les méthodes suivantes pour faire pivoter un point arbitraire autour d’un autre point arbitraire d’un angle sur une durée. Le point en question évolue maintenant de manière erratique, mais se termine là où je pense est la destination souhaitée. Je dois le faire se déplacer en douceur à l’angle.

Veuillez noter que les points sont indépendants d’un object du jeu.

Dans le diagramme ci-dessous, j’essaie de déplacer un point d’une courbe de LineRenderer (dessinée avec un LineRenderer ) autour d’un autre point d’un angle sur une période donnée. Aucun de ces points ne coïncide avec la position de l’object de jeu contenant la courbe de Bézier.

entrez la description de l'image ici

 IEnumerator runMovement() { yield return new WaitForSeconds(2.0f); Vector2 pivot = points[3]; StartCoroutine(RotateControlPointWithDuration(pivot, 2.0f, 90.0f)); } IEnumerator RotateControlPointWithDuration(Vector2 pivot, float duration, float angle) { float currentTime = 0.0f; float ourTimeDelta = 0; Vector2 startPos = points[0]; ourTimeDelta = Time.deltaTime; float angleDelta = angle / duration; //how many degress to rotate in one second while (currentTime < duration) { currentTime += Time.deltaTime; ourTimeDelta = Time.deltaTime; points[0] = new Vector2(Mathf.Cos(angleDelta * ourTimeDelta) * (startPos.x - pivot.x) - Mathf.Sin(angleDelta * ourTimeDelta) * (startPos.y - pivot.y) + pivot.x, Mathf.Sin(angleDelta * ourTimeDelta) * (startPos.x - pivot.x) + Mathf.Cos(angleDelta * ourTimeDelta) * (startPos.y - pivot.y) + pivot.y); yield return null; } } 

Le motif que vous voulez est juste

 public IEnumerator HowToSmoothly() { // move "X" from value "A" to value "B" float duration = 2.5f; float delta = B - A; float startTime = Time.time; float finishTime = Time.time+duration; while(Time.time B) X = B; yield return 0; } X = B; yield break; } 

Je peux vraiment vous aider beaucoup avec les quartoniens, mais je peux vous donner quelques conseils sur le mouvement dans le temps. La dure leçon que je devais apprendre était d’éviter d’utiliser des co-routines autant que possible. Bien qu’ils semblent assez lisses, ils sont un peu déroutants et c’est un peu déroutant que Unity ne les utilise pas exactement de la manière dont vous êtes censés les utiliser dans d’autres domaines de C #.

Dans la mesure du possible, j’utilise simplement une classe d’unité qui met à jour chaque image. C’est beaucoup plus simple à comprendre et à déboguer. L’inconvénient dans votre cas est que vous avez besoin d’un nouveau composant pour chaque point que vous essayez de faire pivoter, mais cela ne devrait pas être un gros problème.

 public class PointRotator : MonoBehaviour 

{

 bool rotating = false; float rate = 0; float angle; Vector3 point; Vector3 pivot; public void Rotate(Vector3 point, Vector3 pivot, float duration, float angle) { this.point = point; this.pivot = pivot; this.rate = angle/duration; this.angle = angle; rotating = true; } public void Update() { if (rotating) { // use quartonian.Lerp with Time.deltatime here //if(angle > quartonian angle){rotating = false) } } 

}

Essayez quelque chose comme ça et voyez si votre problème disparaît. Sinon, vous devrez peut-être effectuer des recherches un peu plus approfondies sur les quartoniens, ou simplement effectuer la sortinggonomésortinge manuellement, car vous êtes dans un plan 2D.