Igor
Igor

Reputation: 4003

Unity3D - Playback object array of position (with dynamic velocity)

We own two objects in the scene. One follows the mouse position on the screen, and the object 2 in turn follows the route object 1 did. We are storing the positions covered by the object 1 and causing the object 2 play them. enter image description here

When you run the game, an object follows the other quietly, reproducing the stored position ... but when one object's speed is changed (on mouse click increase velocity) the object 2 can not keep up, as this still following the positions already be cached in the array (including the calculations speed). Please, watch the shot video below:

YouTube: https://youtu.be/_HbP09A3cFA

public class Play : MonoBehaviour
{

    public Transform obj;
    private List<Recorder> recordList;
    private float velocity = 10.0f;
    private Transform clone;

    void Start()
    {
        recordList = new List<Recorder>();
        clone = obj;
    }

    void Update()
    {

        if (Input.GetMouseButton(0))
        {
            velocity = 20.0f;
        }
        else {
            velocity = 10.0f;
        }

        var dir = Input.mousePosition - Camera.main.WorldToScreenPoint(transform.position);
        var angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
        transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.AngleAxis(angle, Vector3.forward), 180 * Time.deltaTime);
        transform.position += transform.right * Time.deltaTime * velocity;
        Camera.main.transform.position = new Vector3(transform.position.x, transform.position.y, Camera.main.transform.position.z);

        recordList.Insert(0, new Recorder
        {
            Position = transform.position,
            Rotation = transform.rotation,
            Velocity = velocity
        });

        var x = 8;
        if (x < recordList.Count)
        {
            clone.position = recordList[x].Position;
            clone.rotation = recordList[x].Rotation;
            clone.position += clone.right * Time.deltaTime * velocity;
        }

        if (recordList.Count > x)
            recordList.RemoveRange(x, recordList.Count - x);
    }
}

public class Recorder
{
    public Vector3 Position{get;set;}
    public Quaternion Rotation{get;set;}
    public float Velocity{get;set;}
}

How can we play the positions stored always with the speed of the object 1?

Summary:

Thanks in advance.

Upvotes: 0

Views: 91

Answers (1)

yes
yes

Reputation: 967

If i understood correctly you might want to consider using Queue<T> instead of List<T>. I think it would be a better suited datatype as it represents a FIFO collection (first in, first out), which is how you use List anyway. You can add elements with Enqueue(T) to the end of the queue and always get the first item with Dequeue() (it also removes it). As for Stack<T> (the opposite), there is also a Peek() function which lets you "preview" the next element.

Another thing, it depends on distance and speed, but i have the feeling that storing the position of every frame could become a bit excessive (maybe im just overly concerned though)

I think the issue with your code is that you always get the 8th element of the List.

Upvotes: 0

Related Questions