2017-02-16 76 views
0

我試圖通過一個我通過CSV文件讀入的四元數組來旋轉一個遊戲對象。它目前不旋轉對象,我相信我沒有正確更新transform.rotation。任何幫助解決這個將不勝感激,讓我知道如果你需要更多的信息。如何通過四元數組旋轉游戲對象?

RotationAnimator.cs肩腳本:

public class RotationAnimator : MonoBehaviour 
{ 
    public Transform playbackTarget; 
    [HideInInspector] 
    public bool playingBack = false; 
    public CSVReader csvReader; 

    public void PlayRecording() 
    { 
     // -1 as it reads the last blank line of the CSV for reasons 
     for (int row = 0; row < csvReader.quaternionRecords.Length-1; row++) 
     { 
      playbackTarget.rotation = new Quaternion(csvReader.quaternionRecords[row].x, csvReader.quaternionRecords[row].y, csvReader.quaternionRecords[row].z, csvReader.quaternionRecords[row].w); 
     } 
    } 
} 

CSVReader.cs腳本讀取CSV文件

public class CSVReader : MonoBehaviour 
{ 
    public QuaternionRecord[] quaternionRecords; 
    public List<List<String>> fileData; 
    ILogging logger; 
    string path = "Assets\\Logs\\RotationList.csv"; 

    private void OnEnable() 
    { 
     logger = Logging.GetCurrentClassLogger(); 
    } 

    public void ReadFile() 
    { 
     var r = File.OpenText(path); 
     fileData = r.ReadToEnd().Split('\n').Select(s => s.Split(',').ToList()).ToList(); 
     quaternionRecords = new QuaternionRecord[fileData.Count]; 

     // skip last empty line at "file data.count -1" 
     for(int row = 0; row < fileData.Count-1; row++) 
     { 
      try 
      { 
       quaternionRecords[row] = new QuaternionRecord(); 
       quaternionRecords[row].time = float.Parse(fileData[row][0]); 
       quaternionRecords[row].x = float.Parse(fileData[row][1]); 
       quaternionRecords[row].y = float.Parse(fileData[row][2]); 
       quaternionRecords[row].z = float.Parse(fileData[row][3]); 
       quaternionRecords[row].w = float.Parse(fileData[row][4]); 
      } 
      catch(Exception e) 
      { 
       Debug.Log("Ouch!"); 
      } 
     } 
     r.Close(); 
    } 

    public struct QuaternionRecord 
    { 
     public float time; 
     public float x; 
     public float y; 
     public float z; 
     public float w; 
    } 
} 

凡PlayRecording被稱爲:

public void Playback() 
    { 
     Debug.Log("Beginning Playback..."); 
     csvReader.ReadFile(); 
     rotationAnimator.PlayRecording(); 
    } 
+0

如何以及在哪裏調用PlayRecording? –

+0

在另一個腳本中,這裏是功能: public void Playback() { Debug.Log(「Beginning Playback ...」); csvReader.ReadFile(); rotationAnimator.PlayRecording(); rotationAnimator.playingBack = true; } – Nilmag

+0

我明白你在做什麼,我已經擺脫了布爾,並添加了必要的通話功能 – Nilmag

回答

1

以下是使用Coroutines通過修改現有代碼來對quaternionRecords進行編程的方法。

//Change void to IEnumerator 
public IEnumerator PlayRecording() 
{ 
    for (int row = 0; row < csvReader.quaternionRecords.Length; row++) 
    { 
     playbackTarget.rotation = new Quaternion(csvReader.quaternionRecords[row].x, csvReader.quaternionRecords[row].y, csvReader.quaternionRecords[row].z, csvReader.quaternionRecords[row].w); 
     //Add this line to wait 1 second until next itteration 
     yield return new WaitForSeconds(1f); 
    } 
} 

public void Playback() 
{ 
    Debug.Log("Beginning Playback..."); 
    csvReader.ReadFile(); 
    //Change to StartCourotine 
    StartCoroutine(rotationAnimator.PlayRecording()); 
} 

我沒有測試代碼,以便它可能無法正常工作,它可能不是最好的解決方案,但它是一個辦法做到這一點。其他方法是使用UpdateTime.deltaTime

+1

您可以保存每個記錄旋轉的時間戳,並通過更新/固定更新中的記錄並根據當前時間設置當前旋轉。我會將行放入隊列中,並在更新中取出隊列。 –