最近,我正在进行滚球比赛(仅用于教育目的)。主要是我正在研究重播脚本。这意味着只要我点击重播按钮,就可以知道玩家之前的动作。它应该类似于波斯倒带功能的王子。但我做错了。
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
public class Player : MonoBehaviour {
private const int buffersize = 1000;
private MyKeyFrame[] playerskeyframe = new MyKeyFrame [buffersize];
private Rigidbody rigidbody;
void Start () {
rigidbody = GetComponent<Rigidbody> ();
}
void Update () {
if (GameManager.Recording == true) {
Record ();
} else {
PlayBack ();
}
}
void PlayBack(){
rigidbody.isKinematic = true;
int frame = Time.frameCount % buffersize;
this.transform.position = playerskeyframe [frame].Position;
this.transform.rotation = playerskeyframe [frame].rotation;
}
void Record(){
Debug.Log (Time.frameCount % buffersize);
rigidbody.isKinematic = false;
int frame = Time.frameCount % buffersize;
float time = Time.time;
playerskeyframe [frame] = new MyKeyFrame (time, this.transform.position, this.transform.rotation);
}
}
public struct MyKeyFrame {
public float frametime;
public Vector3 Position;
public Quaternion rotation;
public MyKeyFrame (float atime,Vector3 apos, Quaternion arotation){
frametime = atime;
Position = apos;
rotation = arotation;
}
}
编辑: - 在我的脚本中不起作用。除非帧到达buffersize,这是1000回放功能不能按预期工作。这意味着如果没有完成循环,它就不会从录制中跳转到播放。 感谢您的时间和考虑。
答案 0 :(得分:1)
我建议切换到队列数据类型。只需在每个帧中添加一个关键帧即可。 当你使用%的帧数时,你的阵列会变得棘手。你可能会覆盖好的有效数据。
在记录功能中:
keyFrameQueue.Enqueue(new MyKeyFrame
(
time, this.transform.position, this.transform.rotation
);
并且在回放中只是将更新发送到每一帧:
if(keyFrameQueue.Count > 0)
{
MyKeyFrame = keyFrameQueue.Dequeue();
this.transform.position = MyKeyFrame.Position;
this.transform.rotation = MyKeyFrame.rotation;
}