Unity我的重播脚本不起作用?

时间:2017-04-13 09:06:31

标签: c# unity3d

最近,我正在进行滚球比赛(仅用于教育目的)。主要是我正在研究重播脚本。这意味着只要我点击重播按钮,就可以知道玩家之前的动作。它应该类似于波斯倒带功能的王子。但我做错了。

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回放功能不能按预期工作。这意味着如果没有完成循环,它就不会从录制中跳转到播放。 感谢您的时间和考虑。

1 个答案:

答案 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;
}