(une fois qu'il a atteint le point B, il va au point A et retour au point B de manière lisse et ordonnée). Pour une raison quelconque, la plate-forme refuse de déplacer et de rester en place. J'ai essayé beaucoup de choses telles que l'utilisation Voici le code. (Point A et point B sont des objets de jeu vides non parentés à la plate-forme) P> Il n'y a pas de messages d'erreur, la plate-forme ne bouge pas. La plate-forme est toujours en collision et il semble se comporter comme une plate-forme normale. p> p> vecteur3.movetowards code> et bien plus encore mais rien ne le fait bouger.
4 Réponses :
GlideArtound () code> est un ienumerator code> et ne peut pas être appelé comme une méthode. Vous devez commencer à utiliser startcoroutine code> while(true)
{
yield return new WaitForEndOfFrame();
// linear pingpong between 0 and 1
var factor = Mathf.PingPong(Time.time, 1);
// add easing at the ends
factor = Mathf.SmoothStep(0, 1, factor);
// optionally add even more easing ;)
//factor = Mathf.SmoothStep(0, 1, factor);
transform.position = Vector2.Lerp(pointA.position, pointB.position, factor);
}
Essayez ceci:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveTwoTransforms : MonoBehaviour
{
public Transform pointA;
public Transform pointB;
bool HeadingtowardsB;
bool HeadingtowardsA;
public float speed = 10;
// Start is called before the first frame update
void Start()
{
transform.position = pointA.position;
HeadingtowardsB = true;
HeadingtowardsA = false;
StartCoroutine(GlideAround());
}
// Update is called once per frame
void Update()
{
}
public IEnumerator GlideAround()
{
//Because we want a specific speed, the % between the two points
//that we should be at will be equal to (time * speed) / distance
//with an adjustment for going backwards.
float distance = Vector3.Distance(pointA, pointB) * 2;
float lapTime = distance / speed;
float startTime = Time.time;
Debug.Log("The platform speed is: " + speed.ToString());
Debug.Log("The distance for one full lap is: " + distance.ToString());
Debug.Log("One lap will take: " + lapTime.ToString() + " seconds");
while (true)
{
yield return new WaitForEndOfFrame();
float elapsedTime = (Time.time - startTime) % lapTime;
float progress = elapsedTime / (lapTime / 2);
if (progress > 1){
progress = 2 - progress;
}
Debug.Log("The platform speed is currently: " + progress.ToString() + "% between pointA and pointB");
transform.position = Vector2.Lerp(pointA.position, pointB.position, progress);
}
}
Je l'ai finalement corrigé. La solution était vraiment simple. Merci pour ton aide.
@ Nine-vingt dix neuf ans sans problème. N'oubliez pas de uplifier les réponses qui vous a aidé à comprendre et à accepter une réponse si c'est celui que vous avez utilisé!
D'accord. Je suis nouveau pour empiler débordement. Merci. :)
Le problème principal est que vous n'utilisez pas Coroutines correctement, comme indiqué dans Réponse de Derhugo .
Cependant, je vais fournir ma propre réponse, en voyant que vous faites une erreur recrue de way em> sur-ingénierie de ce problème. p> Je pense que l'enseignement par exemple pourrait être le Le plus approprié dans ce cas, alors voici: p> Si les points dictant de la plate-forme sont statiques, vous devriez le faire avec une animation. Je ne l'expliquerai pas ici. Tutoriels Comme celui-ci peut facilement être trouvé sur les didacticiels d'unité, les forums d'unité, autres Stackoverflow Q & As et YouTube. P> Si vos points sont dynamiques, c'est plus que suffisant: P>
rigidbody.position = Vector3.MoveTowards(rigidbody.position, //...
Voici le code qui a fonctionné.
Inumerator Public Glideheround ()
{ p>
Donc, vous voulez qu'il soit vraiment rapide au début, puis bougez-vous lentement?
Ce code déplacera 43% de la distance dans la première seconde, 25% (68%) de la deuxième seconde, 13% (81%) de la troisième seconde et se basculera après environ 7 secondes, peu importe la distance
En d'autres termes, la vitesse n'est pas constante i>
(Les chiffres ci-dessus supposent 60 fps. 90fps rend les choses beaucoup plus rapides, 30fps seront plus lents)
Oui c'est l'effet que je voulais.