gpt4 book ai didi

c# - Unity - 如何为每个好 Action 显示几秒钟的文本

转载 作者:行者123 更新时间:2023-11-30 22:57:51 28 4
gpt4 key购买 nike

我是 Unity 和编程新手,所以我需要一些帮助。玩家做出正确 Action 后,我试图显示文本 3 秒。它正在进行第一步,文字消失但仍在闪烁。可能是因为它处于更新方法中并且该项目仍处于锁定状态...但是我如何更改它以在每次正确移动后显示此文本 3 秒?每件商品仅限一次。谢谢

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

public class GameControl : MonoBehaviour
{
[SerializeField]
private GameObject someText
[SerializeField]
private GameObject goodMove;

// Use this for initialization
void Start()
{
someText.SetActive(false);
goodMove.SetActive(false);
}
void Update()
{
if (item1.locked && item2.locked && item3.locked)
{
someText.SetActive(true);
}

if (item1.locked || item2.locked || item3.locked)
{
StartCoroutine(waiter());
}
}
IEnumerator waiter()
{
goodMove.SetActive(true);
yield return new WaitForSeconds(3);
goodMove.SetActive(false);
}

编辑:项目被拖动到正确位置时被锁定

...case TouchPhase.Ended:
if (Mathf.Abs(transform.position.x - somePlace.position.x) <= 2f &&
Mathf.Abs(transform.position.y - somePlace.position.y) <= 2f)
{
transform.position = new Vector2(somePlace.position.x, somePlace.position.y);
transform.localScale -= new Vector3(0.4F, 0.4F, 0.4F);
locked = true;
}
else
{
transform.position = new Vector2(initialPosition.x, initialPosition.y);
}
break;

最佳答案

它在闪烁,因为您每帧都在调用 StartCoroutine(waiter());。您可以使用 bool 变量使其仅调用一次。如果我是你,我会删除 Update 函数并使用协程来修复它,避免在触摸检测脚本中移动你的代码。

此外,下面的代码在每一帧执行:

if (item1.locked && item2.locked && item3.locked)
{
someText.SetActive(true);
}

最好创建另一个锁定变量,这样您就可以在执行 if 语句之前使用它来检查锁定变量何时更改。请注意下面的 ItemChanged() 函数,它就是这样做的。

public class GameControl : MonoBehaviour
{
//Change YourItemType to whatver your item1, item2, item3 types are
YourItemType item1, item2, item3;

[SerializeField]
private GameObject someText;
[SerializeField]
private GameObject goodMove;

bool oldVal1;
bool oldVal2;
bool oldVal3;

// Use this for initialization
void Start()
{
someText.SetActive(false);
goodMove.SetActive(false);

StartCoroutine(LockChecker());
}

IEnumerator LockChecker()
{
oldVal1 = item1.locked;
oldVal2 = item2.locked;
oldVal3 = item3.locked;

//Run this code forever as the Update function
while (true)
{

//Check if item has changed
if (ItemChanged())
{
if (item1.locked && item2.locked && item3.locked)
{
someText.SetActive(true);
}

if (item1.locked || item2.locked || item3.locked)
{
//Call the waiter function then wait for it to return
yield return StartCoroutine(waiter());
}
}

yield return null;
}
}

bool ItemChanged()
{
//Check if the booelan variable changed
if (oldVal1 != item1.locked ||
oldVal2 != item2.locked ||
oldVal3 != item3.locked)
{
//Update old values
oldVal1 = item1.locked;
oldVal2 = item2.locked;
oldVal3 = item3.locked;

return true;
}

return false;
}

IEnumerator waiter()
{
goodMove.SetActive(true);
yield return new WaitForSeconds(3);
goodMove.SetActive(false);
}
}

更好的是,将锁定变量声明为属性,然后使用 getset 评估器检测锁定变量何时更改并启动协程。有一个例子 here .

关于c# - Unity - 如何为每个好 Action 显示几秒钟的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53361566/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com