- Home /
Copying movement for period of time
Hello, I'm developing a project in which the main mechanic is when the player picks up an object, a copy of the itself will show up and copy its last 10 seconds of movement. I already have the movement being copied, but it is the whole movement since start, not the last 10 seconds. How can I accomplish this?
public bool isCopying;
[SerializeField] Transform copy;
List<Vector2> positions;
[SerializeField] [Range(0f, 10f)] float recordTime;
void Start()
{
positions = new List<Vector2>();
}
private void FixedUpdate()
{
if (isCopying)
{
Copy();
}
else
{
RecordPosition();
}
}
private void RecordPosition()
{
if (positions.Count > Mathf.Round(recordTime / Time.fixedDeltaTime))
{
positions.Remove(transform.position);
}
positions.Add(transform.position);
}
private void Copy()
{
if (positions.Count > 0)
{
copy.position = positions[0];
positions.RemoveAt(0);
}
else
{
isCopying = false;
}
}
Here's a gif of what I have: https://media.giphy.com/media/finuyiZZ7EVuRXLfEm/giphy.gif
Answer by mchts · Mar 28, 2019 at 12:31 PM
Queue is the key for such action:
[SerializeField] [Range(0f, 10f)] float recordTime;
private float counter;
private bool copyMovement;
private Queue<Vector2> lastMovements;
void Start(){
lastMovements = new Queue<Vector2>();
counter = 0;
}
void Update (){
if(copyMovement){ //when you pick up your boost item
lastMovements.Enqueue(transform.position);
counter += Time.deltaTime;
if(counter >= recordTime){
lastMovements.Dequeue();
}
} else {
counter = 0;
lastMovements.Clear();
}
}
This way your movements will be stored in queue but when time is greater than recordTime
the last item stored will be removed at the same time. This is exactly what you need i guess.
Answer by Antao98 · Mar 28, 2019 at 06:37 PM
Thank you so much! I didn't use your code exactly the same, I adapted it to what I had. The queue method was exactly what I needed, thank you! Here's the final code for anyone who needs it:
void Start()
{
positions = new Queue<Vector2>();
}
private void FixedUpdate()
{
if (isCopying)
{
Copy();
}
else
{
RecordPosition();
}
}
private void RecordPosition()
{
if (positions.Count > Mathf.Round(recordTime / Time.fixedDeltaTime))
{
positions.Dequeue();
}
positions.Enqueue(transform.position);
}
private void Copy()
{
if (positions.Count > 0)
{
copy.position = positions.Dequeue();
}
else
{
isCopying = false;
}
}
}
Your answer
Follow this Question
Related Questions
How can I update the players location? 1 Answer
Find Quadratic Equation From 3 points for Jump 1 Answer
Enemy Movement and Pacing 1 Answer
Move to mouse position 1 Answer