2017-02-16 17 views
0

私がCSVファイル経由で読み込んだクォータニオンの配列を通してゲームオブジェクトを回転しようとしています。現在、私はtransform.rotationを正しく更新していないと思っています。これを解決する助けがあれば大いに感謝します。情報が必要な場合は教えてください。Quaternionsの配列を通してゲームオブジェクトを回転させるにはどうすればよいですか?

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

を使用しています。どのようにプレイレコーディングを呼び出していますか? –

+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

記録された各回転のタイムスタンプを保存して、更新/固定更新の記録を行い、現在の時間に応じて現在の回転を設定することができます。私は行をキューに入れ、更新時にキューを使い果たしました。 –

関連する問題