2017-04-13 4 views
1

Vor kurzem arbeite ich an einem Rollerballspiel (nur für Ausbildungszwecke). Und hauptsächlich arbeite ich an Replay-Skript. Das bedeutet, solange ich auf Replay-Taste klicke, muss die vorherige Bewegung des Spielers bekannt sein. Es sollte der Prince of Persia Rückspulfunktion ähnlich sein. Aber ich habe etwas falsch gemacht.Einheit Mein Replay-Skript funktioniert nicht?

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

} 

Bearbeiten: - Was in meinem Skript nicht funktioniert. Es sei denn, der Rahmen erreicht die Puffergröße, die 1000 ist. Die Wiedergabefunktion funktioniert nicht wie erwartet. Das heißt, ohne eine Schleife zu durchlaufen, wird nicht von der Aufnahme zur Wiedergabe gesprungen. Vielen Dank für Ihre Zeit und Rücksicht.

+0

Was genau meinen Sie mit _ "Aber ich habe etwas getan falsch."_? Was funktioniert bei deinem Skript nicht? – Kardux

+0

Ich denke, bis Sie Frame 1000 erreichen, gibt es einige Einträge im Array, die noch nicht festgelegt sind und daher nicht zur Zuweisung der Transformation verwendet werden können. – DrRiisTab

Antwort

1

Ich würde vorschlagen, auf Queue-Datentyp zu wechseln. Fügen Sie einfach einen Keyframe für jeden aufgezeichneten Frame hinzu. Etwas wird mit Ihrem Array verschroben, wenn Sie% der Bildanzahl verwenden. Wahrscheinlich überschreiben Sie so gute gültige Daten.

in der Aufnahmefunktion:

keyFrameQueue.Enqueue(new MyKeyFrame 
(
    time, this.transform.position, this.transform.rotation 
); 

und in der Wiedergabe in dem Update stellt dies nur für jeden Rahmen geschehen:

if(keyFrameQueue.Count > 0) 
{ 
    MyKeyFrame = keyFrameQueue.Dequeue(); 
    this.transform.position = MyKeyFrame.Position; 
    this.transform.rotation = MyKeyFrame.rotation; 
}