I know its messy and alot to read through, but was able to figure out how to track based off the list. this works accurately when the game runs and the clones are able to follow. Let me know if you think queue would still be a better option to try
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class FPS : MonoBehaviour
{
//movement
public Rigidbody rigi;
float hori, verti, mHori, mVerti;
Vector3 movement;
public float jumpForce;
public float gravityMultiplier;
public float moveSpeed;
float currentSpeed;
//data track
public bool tracking;
private bool finTrack;
bool jumping;
bool interact;
private int trackIndex;
public List <Vector6> trackData = new List<Vector6>();
public GameObject clone;
public Transform camera;
public GameObject LM;
//Raycasting
public LayerMask doorLayer;
RaycastHit other;
public Text hud;
[System.Serializable]
public class Vector6{
public float hori;
public float verti;
public float mHori;
public float mVerti;
public bool jumping;
public bool interact;
public Vector6 (float h, float v, float mh, float mv, bool j, bool i ){
hori = h;
verti = v;
mHori = mh;
mVerti = mv;
jumping = j;
interact = i;
}
}
void Start()
{
currentSpeed = 1;
Physics.gravity *= gravityMultiplier; //GRAVITY MULTIPLY!
camera.gameObject.SetActive(true);
StartCoroutine("Track");
trackData.Clear();
gameObject.transform.SetParent(LM.transform);
}
void Update()
{
if(Physics.Raycast(transform.position, transform.forward, out other, 50f, doorLayer))
{
hud.text = "Press E to use" + other.collider.gameObject.name;
}
else hud.text = "";
//TRACKING VERSION
if (!finTrack)
{
hori = Input.GetAxis("Horizontal");
verti = Input.GetAxis("Vertical");
mHori = Input.GetAxis("Mouse X");
mVerti = Input.GetAxis("Mouse Y");
//JUMPING
if (Input.GetKeyDown(KeyCode.Space)){
rigi.AddForce(new Vector3(0, jumpForce, 0), ForceMode.Impulse);
jumping = true;
}
else jumping = false;
if(Input.GetKeyDown(KeyCode.E))
{
if(Physics.Raycast(transform.position, transform.forward, out other, 50f, doorLayer))
{
other.collider.SendMessage("Use");
interact = true;
}
}
else interact = false;
}
///RECORDED VERSION
else if(trackIndex < trackData.Count)
{
hori = trackData[trackIndex].hori;
verti = trackData[trackIndex].verti;
mHori = trackData[trackIndex].mHori;
mVerti = trackData[trackIndex].mVerti;
if (trackData[trackIndex].jumping)
{
rigi.AddForce(new Vector3(0, jumpForce, 0), ForceMode.Impulse);
}
if (trackData[trackIndex].interact)
{
if(Physics.Raycast(transform.position, transform.forward, out other, 70f, doorLayer))
{
other.collider.SendMessage("Use");
}
}
trackIndex++;
}
movement.x = hori * moveSpeed * currentSpeed;
movement.z = verti * moveSpeed * currentSpeed;
movement.y = rigi.velocity.y;
rigi.velocity = transform.TransformDirection(movement);
//HEAD MOVEMENT
camera.Rotate(-mVerti, 0, 0);
transform.Rotate(0, mHori, 0);
}
void Reset()
{
Transform oriPos = GameObject.FindWithTag("OriPos").transform;
transform.position = oriPos.position;
transform.rotation = oriPos.rotation;
trackIndex = 0;
}
//tracking
IEnumerator Track()
{
tracking = true;
while ( tracking )
{
trackData.Add(new Vector6(hori,verti,mHori,mVerti,jumping,interact));
if(Input.GetKeyDown(KeyCode.Q))
{
tracking = false;
}
yield return null;
}
Transform oriPos = GameObject.FindWithTag("OriPos").transform;
transform.position = oriPos.position;
transform.rotation = oriPos.rotation;
camera.gameObject.SetActive(false);
Instantiate(clone, oriPos.position, oriPos.rotation);
finTrack = true;
//Restart
}
}