Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Apsiya · Mar 02, 2018 at 02:05 PM · c#unity 5gameobjectcoroutineenemy

Lerp in Coroutine (Crazy Behavior)

Hey my friends i have a problem that i strugle on it for days now , i make an obstacle that goes up and stay some time and return down and stay for some times also, i make it move with the Vector3.lerp function, and to make it stop i use the coroutine yield thing , all work great, but when the time goes and with some duplicante, the obstacles began to move in unsynchronized movements and move with crazy behavior , please help me, it blocks me from advancing in my project this is the code :

  IEnumerator Move()
 {
     //float timeToStart = Time.deltaTime;
     while (isAlive) {


         if (tail.transform.position == currentPoint.position)
         {


             pointSelection++;
             yield return new WaitForSeconds (waitTime);


             if (pointSelection == points.Length) {
                 pointSelection = 0;
                 waitTime = waitTimeDown;
                 yield return null;
             } else {

                 waitTime = waitTimeUp;
                 yield return null;

             }

             currentPoint = points[pointSelection];
             PlaySound (pointSelection);
         }

         tail.transform.position=Vector3.Lerp(tail.transform.position,currentPoint.position,speed );
     
         yield return null;
     }

 }
Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

2 Replies

· Add your reply
  • Sort: 
avatar image
0
Best Answer

Answer by Legend_Bacon · Mar 02, 2018 at 07:26 PM

Hello there,

If you know how long you want the object to be travelling for, you could use something like this:

     //SerializeField means you can assign them in the inspector
     [SerializeField] private float f_moveDuration = 4.0f;
     [SerializeField] private float f_timeToStayUp = 2.0f;
     [SerializeField] private float f_timeToStayDown = 3.0f;
     [SerializeField] private Transform tr_upTarget = null;
     [SerializeField] private Transform tr_downTarget = null;
 
     private Coroutine moveCoroutine = null;
 
     private void Start()
     {
         StartMovingObject();
     }
 
     // Call to start perpetual movement
     public void StartMovingObject()
     {
         moveCoroutine = StartCoroutine(MoveObjectCoroutine());
     }
 
     // Call to stop movement
     public void StopMovingObject()
     {
         if (moveCoroutine != null)
             StopCoroutine(moveCoroutine);
     }
 
     private IEnumerator MoveObjectCoroutine()
     {
         //Assuming your object starts DOWN
         bool isDown = true;
         yield return new WaitForSeconds(f_timeToStayDown);
         while(true)
         {
             float timer = 0.0f;
             Vector3 startPosition = gameObject.transform.position;
             Vector3 targetPosition = isDown ? tr_upTarget.position : tr_downTarget.position;
 
             // Object Starts Moving here
             while (timer < f_moveDuration)
             {
                 timer += Time.deltaTime;
                 float t = timer / f_moveDuration;
 
                 //Smoothing
                 t = t * t * t * (t * (6f * t - 15f) + 10f);
                 gameObject.transform.position = Vector3.Lerp(startPosition, targetPosition, t);
                 yield return null;
             }
 
             //Object has reached destination here
             isDown = !isDown;
             yield return new WaitForSeconds(isDown ? f_timeToStayDown : f_timeToStayUp);
         }
 
         yield return null;
     }

Throw that script onto your object, assign its variables, and you're good to go. It'll go up, stay a while, go down, stay a while, and start again. You can control exactly how long the objects spend moving, waiting up, and waiting down with f_moveDuration, f_timeToStayUp, and f_timeToStayDown (in seconds).

I threw a smoothing algorithm in there, but if you don't like it you can pick any other from this page


I hope that helps!

Cheers,

~LegendBacon

Comment
Add comment · Show 3 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Apsiya · Mar 02, 2018 at 10:57 PM 0
Share

Thank you very much for your time and i appreciate your help , it works like a charm but why code didn't work can you explain please (if you have time of course ) .

avatar image Legend_Bacon Apsiya · Mar 05, 2018 at 09:41 AM 0
Share

From what I can tell, there are a few things wrong with the piece of code above:

  1. You're comparing two position using "==" in your first if statement. While it may seem to work for now, there is no guarantee that it always will due to the slight imprecision of floating points. Usually you want to use Vector3.Distance() ins$$anonymous$$d, with a small threshold to make sure the code catches it.

  2. Lerps are a bit complicated, but usually you don't want to use them with speed. Ins$$anonymous$$d, I recommend you read the intro of THIS PAGE. It exactly explains how Lerps are "supposed" to work.

I hope that helps!

Cheers,

~LegendBacon

avatar image Apsiya Legend_Bacon · Mar 05, 2018 at 02:03 PM 0
Share

Thank you i appreciate your help .

avatar image
0

Answer by Helical · Mar 02, 2018 at 02:28 PM

Your problem is probably in speed

 tail.transform.position=Vector3.Lerp(tail.transform.position,currentPoint.position,speed );

Lerp as a function goes from point A to point B, by a value from 0 to 1.

In addition to speed, try at least to give it a smoothed DeltaTime conversion

 tail.transform.position=Vector3.Lerp(tail.transform.position,currentPoint.position, speed * Time.DeltaTime );

That will make the speed factor seem more natural. However the progress will not be linear.

If you wish for the movement to be linear, I would suggest remembering the starting Vector3 position at the beggining of the movement

 var startPos = tail.transform.position;
 float progress = 0f;

 while(whatever){
    tail.transform.position=Vector3.Lerp(startPos ,currentPoint.position, progress);
    progress = Mathf.clamp(progress + speed * Time.DeltaTime, 0f, 1f);
    yield return null;
 }


Lastly your condition

 if (tail.transform.position == currentPoint.position)

might never be sated, because a Lerp never reaches destination unless the coeffecient (third parameter) is 1 or greater. I would suggest testing destination reached based on distance delta.

 if( (tail.transform.position -currentPoint.position).magnitude < 0.05f ) 



Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Apsiya · Mar 02, 2018 at 03:28 PM 0
Share

Thank you for your answer, your awsome solution gives me a synchronized movement but not smooth :

alt text

2018-03-02-15-23-09-1.gif (321.1 kB)

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

497 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Issues with my loading screen 0 Answers

Calling an Audio Source on one game object from a script on another game object..? 1 Answer

GameObject keeps acting like gameObject. 1 Answer

transform.SetParent(null); Not Working 1 Answer

Moving player to generated position 2 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges