查找自变量更改以来的时间

时间:2018-10-23 17:26:59

标签: c# unity3d

从某个变量更改开始,您将如何查找时间?以一个布尔变量为例,您如何找到自上次更改以来的时间?我想将布尔变量用作触发器(在为true时激活触发器),但是仅在将其更改为true之后经过确切的恒定时间(例如0.5s)之后(才可以将其从false更改为是的)。

这是我的代码:

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

public class hitRegistration : MonoBehaviour
{

    AudioSource hitSound;
    private bool hitState = false;
    // Use this for initialization
    void Start()
    {
        hitSound = gameObject.GetComponent<AudioSource>();
    }
    void OnMouseOver()
    {
        Debug.Log("Mouse is over game object.");
        if (Input.GetKey(KeyCode.X) && hitState == false)
        {
            hitSound.Play();
            hitState = true;
        }
    }
    private void OnMouseExit()
    {
        Debug.Log("Mouse is no longer over game object.");
        if (hitState == true)
        {
            // sound clip gets cut if the cursor leaves before its finished.
            Destroy(gameObject);
        }
    }

    // Update is called once per frame
    void Update()
    {

    }
}

“ OnMouseOver()”是将鼠标置于相关游戏对象上方时调用的简单函数。我想将销毁游戏对象的时间延迟到一定时间。

3 个答案:

答案 0 :(得分:9)

首先,如评论中所述,您可能正试图以错误的方式解决此问题,并且您可能会问一个“ XY”问题-一个要问问题的地方关于建议的不良解决方案,而不是询问您面临的实际问题。

无论是好是坏,为了回答您实际提出的问题:无法将行为与在C#中读取或编写变量相关联,但是您可以将行为与属性相关联

private bool hitState; // The "backing store".
private bool HitState 
{
  get 
  {
    return hitState;
  }
  set
  {
    hitState = value;
  }
}

然后在整个课程的其余部分中使用HitState而不是hitState

现在,您可以添加在读取或写入属性时所需的任何逻辑:

private DateTime hitStateTime = default(DateTime);
private bool hitState; // The "backing store".
private bool HitState 
{
  get 
  {
    return hitState;
  }
  set
  {
    hitState = value;
    hitStateSet = DateTime.Now;
  }
}

现在您知道它的设置时间。等等。

答案 1 :(得分:1)

除非您真的需要跟踪每帧的时间量,否则一种您要执行的操作的方法是使用Unity Coroutines

协程是与主线程并行运行的方法。要解决您的问题,您可以先在同一脚本中创建协程,然后等待,然后执行您想延迟的操作。 Unity中的协程是一种最多使用一个参数并具有IEnumerator返回类型的方法。您在协程内部使用yield return WaitForSeconds(t);使其延迟t秒。

然后,一旦该死了,请检查鼠标当前是否通过isHovered(在OnMouseOver / OnMouseExit方法中进行了设置)悬停在对象上。如果是这样,请注意该死了。如果不是,那么它将立即死亡。

IEnumerator WaitToDie(float delaySeconds) 
{
    yield return new WaitForSeconds(delaySeconds);

    // If the mouse is on the object, let OnMouseExit know we're ready to die
    if (isHovered) 
    {
        readyToDie = true;
    } 
    // Otherwise, just die
    else 
    {
        Destroy(gameObject)
    }

}

然后在您的OnMouseOver代码中,在发出声音后运行协程

void OnMouseOver()
{
    isHovered = true;

    Debug.Log("Mouse is over game object.");
    if (Input.GetKey(KeyCode.X) && !hitState)
    {

        hitState = true;
        hitSound.Play();

        // we want to delay for half a second before processing the hit.
        float delaySeconds = 0.5; 
        IEnumerator coroutine = WaitToDie(delaySeconds);

        StartCoroutine(coroutine);
    }
}

然后在您的OnMouseExit中,让所有人都知道您已经完成悬停,并检查是否已经过去了。

private void OnMouseExit()
{
    isHovered = false;
    Debug.Log("Mouse is no longer over game object.");

    if (readyToDie) {
        Destroy(gameObject);
    } 

}

当两个鼠标都离开对象并且时间已过时,此代码将使对象死亡。

作为旁注,我认为您可能想重新审视一下命中率,除非您的确实想要从拿着X 然后又< / strong>将鼠标移到对象上。如果您打算在鼠标位于顶部时按下X的任何时间触发,则可能需要将支票放入Update并选中Input.GetKey(KeyCode.X) && !hitState && isHovered

答案 2 :(得分:0)

保留一个单独的变量(DateTime)并将其命名为lastUpdate。然后确保将其设置为DateTime。现在,每次更新您要跟踪的布尔值时。然后,当您需要查看已存储多长时间时,您可以减去:

DateTime lengthOfTime = DateTime.Now-lastUpdate;

从lengthOfTime中,您现在可以访问经过了多少天,几小时,几分和/或几秒钟。

在手机上输入即时消息,因此请轻松输入伪代码。

祝你好运