/// <summary> /// Adds a new player position to the position list. /// </summary> /// <param name="gameObj">Object to store position from.</param> /// <param name="posArray">List to add position in.</param> public void AddPosition(GameObject gameObj, List <PlayerTimePosition> posArray) { // Making new position to store in list PlayerTimePosition pos = new PlayerTimePosition(); pos.position = gameObj.transform.position; pos.time = Time.time; pos.input = new TimePositionInput(); // Sprite handling SpriteRenderer renderer = gameObj.GetComponentInChildren <SpriteRenderer>(); pos.sprite = renderer.sprite; pos.facingRight = gameObj.GetComponent <PlayerControl>().facingRight; // If it's the player adding a new position, also store inputs if (gameObj.CompareTag("Player")) { pos.input.SetInput(); } posArray.Add(pos); // Continuously removing all positions outside time threshold posArray.RemoveAll(x => x.time <= (Time.time - rewindSeconds)); }
/// <summary> /// Handles player movement while rewinding time. /// </summary> public void PlayerRewind() { // If there are positions left on the position list, move player past one position if (playerPositions.Count > 0) { PlayerTimePosition currentPos = playerPositions[playerPositions.Count - 1]; transform.position = currentPos.position; // Set player inputs along with position player.SetInputFromPosition(currentPos.input); // Setting sprite Debug.Log(currentPos.sprite.name); player.GetComponentInChildren <SpriteRenderer>().sprite = currentPos.sprite; player.facingRight = currentPos.facingRight; // Insert the position on the record for the clone playerRecord.Insert(0, currentPos); // Remove the position from the stored list playerPositions.RemoveAt(playerPositions.Count - 1); } // If there are no positions left, player is frozen in time else { isFrozen = true; //rb.constraints = RigidbodyConstraints2D.FreezeAll; } }