0
votes

J'ai besoin d'aide sur ce problème de Lerping. J'essaie de faire un jeu de plateforme

(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 vecteur3.movetowards et bien plus encore mais rien ne le fait bouger.

Voici le code. (Point A et point B sont des objets de jeu vides non parentés à la plate-forme) xxx

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.


0 commentaires

4 Réponses :


1
votes

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);
}


0 commentaires

0
votes

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);
    }
}


3 commentaires

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. :)



0
votes

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, //...


0 commentaires

0
votes

Voici le code qui a fonctionné.

Inumerator Public Glideheround () { xxx


5 commentaires

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


(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.