unity3d 如何在Unity中计算时间?

1hdlvixo  于 2023-03-23  发布在  其他
关注(0)|答案(2)|浏览(256)

我正在创建一个游戏,当一个对象被跟踪时,它会改变颜色并变成红色,如何计算游戏开始和颜色变化之间的时间?
也许导出到一个txt文件将是完美的。
我是这么想的:
计时器脚本

public float timer = 0.0f;

void Start()
{
    timer = 0;
}

void Update()
{

    timer += Time.Time;
    print(second);
}

比眼动仪上的触发器:

void CountStop()
{
    // i don't know how to stop the count and save the value
}
5fjcxozz

5fjcxozz1#

对于你问题的第一部分,Unity本身已经解决了这个问题,只需使用Time.time

private void OnGUI() => GUILayout.Box($"Current Time: {Time.time}");

但是你说你想改变一个对象的颜色。在这方面,你可以使用Color.Lerp,但是根据你在对象上使用的shadermaterial,可能需要灵活性。在下面的代码中,在检查器中输入meshRenderer值,就会进行更改。希望这个指南能解决你的问题。

[SerializeField] private MeshRenderer meshRenderer;

[SerializeField] private float lerpTime = 4f; // 4 seconds
[SerializeField] private Color color;
private void Update()
{
    meshRenderer.material.color = Color.Lerp(meshRenderer.material.color, color, Time.time / lerpTime);
}

制作简单的Tweener

如果你想有一个临时计时器,就像下面这样,用几个回调函数来做一个tweener,这是一个相对更高级的技术。

private void Start()
{
    StartCoroutine(TweenTimer(2f, f =>
        {
            Debug.Log($"Tween Time: {f}");
        },
        () =>
        {
            Debug.Log("Timer End.");
        }));
}
private IEnumerator TweenTimer(float duration, Action<float> onTime = null, Action onEnd = null)
{
    var _timer = 0f;
    while (_timer <= duration)
    {
        _timer += Time.deltaTime;
        yield return new WaitForSeconds(Time.deltaTime);
        onTime?.Invoke(_timer);
    }
    onEnd?.Invoke();
}
bmp9r5qi

bmp9r5qi2#

正如其他人所指出的,要获得应用程序启动后的时间,只需像这样使用Time.time

// Assuming this is called by you e.g. if the color changes
void CountStop()
{
    float timeSinceStart = Time.time;
}

如果您不需要应用程序启动后的时间,而是从某个时间点开始,您可以通过使用Time.deltaTimeTime.unscaledDeltaTime在帧上累计时间来手动测量时间。未缩放意味着它不受应用程序timescale(真实的)的影响。例如,您可以执行以下操作:

float elapsedTime = 0f;
bool measuretime = false;

// Call to start measuring time in Update() method
void StartTimer()
{
    measureTime = true;
{

// Call to stop measuring time in Update() method
void StopTimer()
{
    measureTime = false;
}

// Call to reset timer
void ResetTimer()
{
    elapsedTime = 0f;
}

// Call to get measured time
float GetMeasuredTime()
{
    return elapsedTime;
}

// Unity built-in Update() method
void Update()
{
    if (measureTime)
    {
        elapsedTime += Time.unscaledDeltaTime;
    }
}

相关问题