如何通过四元数数组旋转游戏对象?
How to rotate a game object through an array of Quaternions?
我正在尝试通过我通过 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();
}
这是一种通过修改现有代码使用 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());
}
我没有测试过代码,因此它可能无法正常工作,也可能不是最佳解决方案,但这是一种实现此目的的方法。其他方法是使用 Update
和 Time.deltaTime
我正在尝试通过我通过 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();
}
这是一种通过修改现有代码使用 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());
}
我没有测试过代码,因此它可能无法正常工作,也可能不是最佳解决方案,但这是一种实现此目的的方法。其他方法是使用 Update
和 Time.deltaTime