【发布时间】:2019-01-07 04:34:49
【问题描述】:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GateControl : MonoBehaviour
{
public Transform door;
public float doorSpeed = 1.0f;
public bool randomDoorSpeed = false;
[Range(0.3f, 10)]
public float randomSpeedRange;
private Vector3 originalDoorPosition;
// Use this for initialization
void Start()
{
originalDoorPosition = door.position;
}
// Update is called once per frame
void Update()
{
if (randomDoorSpeed == true && randomSpeedRange > 0.3f)
{
StartCoroutine(DoorSpeedWaitForSeconds());
}
door.position = Vector3.Lerp(originalDoorPosition,
new Vector3(originalDoorPosition.x, originalDoorPosition.y, 64f),
Mathf.PingPong(Time.time * doorSpeed, 1.0f));
}
IEnumerator DoorSpeedWaitForSeconds()
{
doorSpeed = Random.Range(0.3f, randomSpeedRange);
yield return new WaitForSeconds(3);
}
}
在 Update 中创建 StartCoroutine 是个坏主意。但是我希望它在运行游戏时会采用一个随机速度,然后等待 3 秒并更改为新的随机速度,然后再等待 3 秒并更改为另一个新的随机速度等等。
同时等待 3 秒以保持当前速度不变,直到下一次更改。
更新:
这是我尝试过的:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GateControl : MonoBehaviour
{
public Transform door;
public float doorSpeed = 1.0f;
public bool randomDoorSpeed = false;
public bool IsGameRunning = false;
[Range(0.3f, 10)]
public float randomSpeedRange;
private Vector3 originalDoorPosition;
// Use this for initialization
void Start()
{
IsGameRunning = true;
originalDoorPosition = door.position;
StartCoroutine(DoorSpeedWaitForSeconds());
}
// Update is called once per frame
void Update()
{
door.position = Vector3.Lerp(originalDoorPosition,
new Vector3(originalDoorPosition.x, originalDoorPosition.y, 64f),
Mathf.PingPong(Time.time * doorSpeed, 1.0f));
}
IEnumerator DoorSpeedWaitForSeconds()
{
var delay = new WaitForSeconds(3);//define ONCE to avoid memory leak
while (IsGameRunning)
{
if (randomDoorSpeed == true && randomSpeedRange > 0.3f)
doorSpeed = Random.Range(0.3f, randomSpeedRange);
yield return delay;
}
}
}
但是有两个问题。
第一个问题是每 3 秒,当它改变门的速度时,它也会从当前位置改变门的位置。所以看起来门的位置正在跳到另一个位置,然后从那里继续。我怎样才能让它在门从当前位置移动的同时改变速度?
第二个问题是如何更改 randomDorrSpeed 标志,使其在游戏运行时生效?我希望如果 randomDorrSpeed 为假,则使用门的原始速度(1.0),如果为真,则使用随机速度。
【问题讨论】:
-
考虑在您的
Update方法中进行计算以确定自上次更改以来经过了多少秒,您的随机方法很好。我会用DateTime.Now - lastChange跟踪它。 -
三秒后你能启动一个外部线程来引发事件或更新共享变量吗?
-
@snowCrabs 我不会为此使用外螺纹。有很多更好的选择。
-
关于第二个问题的一个问题。您需要检查游戏是否正在运行?我的意思是如果你在脚本中是因为游戏正在运行。在什么情况下你认为 randomDorrSpeed 可能是假的?
-
@IgnacioAlorre 我可以使用 while(true) 而不是 while(isgamerunning) 所以我根本不需要 isgamerunning。并且 randomDoorSpeed 是公共的,如果它是假的,它将使用原始的恒定速度 1,如果它是真的,它将使用随机速度。看看 Bijan 解决方案的答案。所以我不需要 IsGameRunning 但 randomDoorspeed 是决定是否使用随机速度。