WaitForSeconds 有问题
Having problems with WaitForSeconds
所以我正在尝试为 "follower" 制作一个脚本,它将开始跟随玩家与它发生碰撞。问题是我希望跟随者在每次玩家停止后向玩家移动之前等待给定的时间。
它在玩家与它碰撞时起作用,它在给定时间后向玩家移动,但当玩家停止并再次移动时,跟随者会粘住玩家而不是等到给定时间结束。这是脚本:
void Update () {
//running is a triggered true on colliding with player.
if(running == true){
StopCoroutine(Move());
StartCoroutine(Move());
}
}
IEnumerator Move(){
yield return new WaitForSeconds (0.5f);
Vector2 pos = transform.position;
Vector2 playerpos = player.transform.position;
playerpos.y = pos.y;
transform.position = Vector2.MoveTowards(pos, playerpos, 1f * Time.deltaTime);
}
我做错了什么吗?
还有一个问题,跟随者的移动速度比给定的速度快。
玩家移动功能。
void Move(float horizontalinput){
Vector3 pos = transform.position;
pos.x += horizontalinput * maxSpeed * Time.deltaTime;
transform.position = pos;
}
非常感谢您的帮助。
StopCoroutine(Move());
正在停止协程的一个新实例,而不是当前 运行。
要么:
StopCoroutine("Move");
StartCoroutine("Move");
或者这个:
private IEnumerator coroutine;
void Update () {
//running is a triggered true on colliding with player.
if(running == true){
StopCoroutine(coroutine);
if(coroutine != null)
coroutine = Move();
StartCoroutine(coroutine);
}
}
你可以试试:
创建一个名为 _canMove
的变量并将其设置为 false
。那么您的 Update
将是:
private void Update()
{
if(_canMove)
{
Move();
}
}
您的 Move
方法将与当前方法相同,但减去了 WaitForSeconds
行。然后,当播放器停止 运行 时,以下行将阻止 Update
方法调用 Move
方法:
_canMove = false
当玩家再次开始移动时运行以下:
StartCoroutine(ResetCanMove);
这将调用 ResetCanMove
,它将在将 _canMove
设置为 true
之前等待 x 秒,然后将导致 Update
开始调用 Move
再次.
这是ResetCanMove
方法
private IEnumerator ResetCanMove()
{
yield return new WaitForSeconds(0.5f);
_canMove = true;
}
在您的代码中,您没有正确使用 StopCoroutine..
你可以这样做:
private Coroutine myCoroutine;
void Update ()
{
//running is a triggered true on colliding with player.
if(running == true)
{
if(myCoroutine != null)
{
StopCoroutine(myCoroutine);
}
myCoroutine = StartCoroutine(Move());
}
}
另一种选择是使用带有元素名称的启动和停止协程,但您将使用反射,这会影响游戏的性能。
所以我正在尝试为 "follower" 制作一个脚本,它将开始跟随玩家与它发生碰撞。问题是我希望跟随者在每次玩家停止后向玩家移动之前等待给定的时间。
它在玩家与它碰撞时起作用,它在给定时间后向玩家移动,但当玩家停止并再次移动时,跟随者会粘住玩家而不是等到给定时间结束。这是脚本:
void Update () {
//running is a triggered true on colliding with player.
if(running == true){
StopCoroutine(Move());
StartCoroutine(Move());
}
}
IEnumerator Move(){
yield return new WaitForSeconds (0.5f);
Vector2 pos = transform.position;
Vector2 playerpos = player.transform.position;
playerpos.y = pos.y;
transform.position = Vector2.MoveTowards(pos, playerpos, 1f * Time.deltaTime);
}
我做错了什么吗?
还有一个问题,跟随者的移动速度比给定的速度快。
玩家移动功能。
void Move(float horizontalinput){
Vector3 pos = transform.position;
pos.x += horizontalinput * maxSpeed * Time.deltaTime;
transform.position = pos;
}
非常感谢您的帮助。
StopCoroutine(Move());
正在停止协程的一个新实例,而不是当前 运行。
要么:
StopCoroutine("Move");
StartCoroutine("Move");
或者这个:
private IEnumerator coroutine;
void Update () {
//running is a triggered true on colliding with player.
if(running == true){
StopCoroutine(coroutine);
if(coroutine != null)
coroutine = Move();
StartCoroutine(coroutine);
}
}
你可以试试:
创建一个名为 _canMove
的变量并将其设置为 false
。那么您的 Update
将是:
private void Update()
{
if(_canMove)
{
Move();
}
}
您的 Move
方法将与当前方法相同,但减去了 WaitForSeconds
行。然后,当播放器停止 运行 时,以下行将阻止 Update
方法调用 Move
方法:
_canMove = false
当玩家再次开始移动时运行以下:
StartCoroutine(ResetCanMove);
这将调用 ResetCanMove
,它将在将 _canMove
设置为 true
之前等待 x 秒,然后将导致 Update
开始调用 Move
再次.
这是ResetCanMove
方法
private IEnumerator ResetCanMove()
{
yield return new WaitForSeconds(0.5f);
_canMove = true;
}
在您的代码中,您没有正确使用 StopCoroutine..
你可以这样做:
private Coroutine myCoroutine;
void Update ()
{
//running is a triggered true on colliding with player.
if(running == true)
{
if(myCoroutine != null)
{
StopCoroutine(myCoroutine);
}
myCoroutine = StartCoroutine(Move());
}
}
另一种选择是使用带有元素名称的启动和停止协程,但您将使用反射,这会影响游戏的性能。