我知道它很乱而且需要通读,但能够根据列表找出如何跟踪。当游戏运行并且克隆能够跟随时,这可以准确地工作。如果您认为队列仍然是一个更好的选择,请告诉我
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
}
}