从某个变量更改开始,您将如何查找时间?以一个布尔变量为例,您如何找到自上次更改以来的时间?我想将布尔变量用作触发器(在为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()”是将鼠标置于相关游戏对象上方时调用的简单函数。我想将销毁游戏对象的时间延迟到一定时间。
答案 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中,您现在可以访问经过了多少天,几小时,几分和/或几秒钟。
在手机上输入即时消息,因此请轻松输入伪代码。
祝你好运