2017-08-17 51 views
0

我正在使用Unity进行仿真并记录一些数据。它基本上是一个车,我试图记录这些事情:StreamWrite和Debug.log中的不同输出

  1. 节点=我的航点
  2. 超时=我的输出时间,这是当前时间,这个圈
  3. 速度=的此时汽车的速度
  4. XPOS = X位置
  5. zPos = Z位置

此日志记录脚本为我的data.txt工作的罚款,我得到这个结果。

1 1 0.2876698 -3.296932 95.41293 
1 2.02 1.095865 -3.286392 94.23542 
1 3.04 2.818792 -3.264626 92.27694 
1 4.08 3.079535 -3.226411 89.4863 
1 5.12 2.492892 -3.171062 85.86295 

现在,我想补充这是给我的,我需要每圈的时间第二个脚本,以便检查,如果我们有一个固定的时间这一点。我必须采用这种方式:圈数时间。

如果我想打印出来我得到这个结果的结果:

lap time 
62.02 

所以我很惊讶,因为它是在我的第一个数据记录器,同时可变,所以我想退房出了什么问题,并将我的第一个记录器的相同命令放入Debug.log中,并得到与第二个记录器相同的结果。

Debug Log

所以现在我只是想知道确切的同一行如何能够给我两个不同的输出和我将如何得到我的计时圈,他的工作是应该的工作方式。

这是完整的代码。

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using System.IO; 

public class SaveToFile : MonoBehaviour { 

public GameObject Auto; 

private CarEngine Engine; 

public float speed; 
public float maxSpeed; 
public float time; 
public float motorTorque; 
public float breakTorque; 
public float steerAngle; 
public float node; 
public bool IsRunning = true; 
public int WaitTimer = 1; 
public float xPos; 
public float zPos; 
public bool cancel = false; 
public bool lap = false; 
public float time_out; 
public float time_lap; 
public int lapNum; 


void Start() 
{ 
    Engine = Auto.GetComponent<CarEngine>(); 

    StreamWriter writer = File.AppendText(@"C:\Users\kaykl\Documents\Schule\Info\Data\CarControle\lap.txt"); 
    writer.WriteLine("lap time"); 
    writer.Close(); 
} 

void FixedUpdate() 
{ 
    motorTorque = Engine.maxMotorTorque; 
    breakTorque = Engine.maxBrakeTorque; 
    steerAngle = Engine.maxSteerAngle; 
    maxSpeed = Engine.maxSpeed; 
    speed = Engine.currentSpeed; 
    time = Time.time; 
    node = Engine.node; 
    xPos = Auto.transform.position.x; 
    zPos = Auto.transform.position.z; 
    lap = Engine.lap; 
    time_out = time - time_lap; 

    if(lap == true && time_out > 5) 
    { 
     time_lap = Time.time; 
     lapNum = lapNum + 1; 
     StreamWriter writer = File.AppendText(@"C:\Users\kaykl\Documents\Schule\Info\Data\CarControle\lap.txt"); 
     writer.WriteLine(lapNum +'+'+time_out); 
     writer.Close(); 

    } 

    if (IsRunning == true) 
    { 
     StartCoroutine(Wait()); 
    } 


} 

public IEnumerator Wait() 
{ 
    IsRunning = false; 
    yield return new WaitForSeconds(WaitTimer); 
    Output(); 
    IsRunning = true; 
} 

void Output() 
{ 
    Debug.Log(node + " " + time_out + " " + speed + " " + xPos + " " + zPos); 
    StreamWriter writer = File.AppendText(@"C:\Users\kaykl\Documents\Schule\Info\Data\CarControle\data.txt"); 
    writer.WriteLine(node + " " + time_out + " " + speed + " " + xPos + " " + zPos); 
    writer.Close(); 

} 

}

我只想说谢谢你们每个人在事先,这大概是我的一个愚蠢的错误,但我只是没有得到它现在。

//编辑

好的,现在这是我的工作代码。我使用了writer.flush(),然后我的Debug.log是正确的,但我的lap.txt仍然是错误的。 当我将StartLine()中的WriteLine改变为output()后,它以某种方式工作。所以这是我现在工作的代码。

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using System.IO; 

public class SaveToFile : MonoBehaviour { 

public GameObject Auto; 

private CarEngine Engine; 

public float speed; 
public float maxSpeed; 
public float time; 
public float motorTorque; 
public float breakTorque; 
public float steerAngle; 
public float node; 
public bool IsRunning = true; 
public int WaitTimer = 1; 
public float xPos; 
public float zPos; 
public bool cancel = false; 
public bool lap = false; 
public float time_out; 
public float time_lap; 
public int lapNum; 


void Start() 
{ 
    Engine = Auto.GetComponent<CarEngine>(); 

    Output(); 
} 

void FixedUpdate() 
{ 
    motorTorque = Engine.maxMotorTorque; 
    breakTorque = Engine.maxBrakeTorque; 
    steerAngle = Engine.maxSteerAngle; 
    maxSpeed = Engine.maxSpeed; 
    speed = Engine.currentSpeed; 
    time = Time.time; 
    node = Engine.node; 
    xPos = Auto.transform.position.x; 
    zPos = Auto.transform.position.z; 
    lap = Engine.lap; 
    time_out = time - time_lap; 

    if(lap == true && time_out > 5) 
    { 
     time_lap = Time.time; 
     lapNum = lapNum + 1; 
     StreamWriter writer = File.AppendText(@"C:\Users\kaykl\Documents\Schule\Info\Data\CarControle\lap.txt"); 
     writer.WriteLine(time_out); 
     writer.Flush(); 

     writer.Close(); 

    } 

    if (IsRunning == true) 
    { 
     StartCoroutine(Wait()); 
    } 


} 

public IEnumerator Wait() 
{ 
    IsRunning = false; 
    yield return new WaitForSeconds(WaitTimer); 
    Output(); 
    IsRunning = true; 
} 

void Output() 
{ 
    Debug.Log(node + " " + time_out + " " + speed + " " + xPos + " " + zPos); 
    StreamWriter writer = File.AppendText(@"C:\Users\kaykl\Documents\Schule\Info\Data\CarControle\data.txt"); 
    writer.WriteLine(node + " " + time_out + " " + speed + " " + xPos + " " + zPos); 
    writer.Flush(); 

    writer.Close(); 

} 

}

谁能向我解释如何仅仅指的方法,而不是把它写下来解决了这一问题的?

非常感谢。

+0

尝试关闭()方法之前的writer.Flush()。 – jdweng

+0

首先感谢你,现在它在控制台中工作,但我仍然在我的lap.txt中得到了错误的值。我在那里复制了我的另一个WriteLine命令,看它是否会打印出来,但仍然打印出与我原来的帖子。所以必须有别的东西。 –

+0

好吧修正了它,甚至很难我不太确定如何;)工作代码被添加到问题 –

回答

0

它现在正在工作。我添加了作者.Flush(),它让它变得更好,但我仍然从中得到了一些奇怪的数据。问题是,那个时候我想打印出当前圈,我用这条线的时间:

writer.WriteLine(lapNum+' '+time_out); 

我完全忘了,我不是在Python工作了,所以我用“X”来声明一个字符串而不是“x”。我将它改为

writer.WriteLine(lapNum+" "+time_out); 

现在它正在工作。 感谢您的帮助:)