unity3d 我正在尝试制作一个脚本,移动我的游戏对象一段时间,然后停止它2秒钟,但它不起作用

3phpmpom  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(210)

我正在尝试制作一个脚本,移动我的游戏对象一段时间,然后停止它2秒钟。
但我的代码确实让它运行了一会儿然后停止,但随后它进入了一个无休止的循环,什么也不做
这是我的代码;

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

public class Enemyai : MonoBehaviour
{
    public Animator anim;
    public int timer = 100000;
    public int Abstimer = 100000;
    public bool running = true;
    
    public float speed = 5;

    // Start is called before the first frame update
    void Start()
    {
        
        
    }

    // Update is called once per frame
    void Update()
    {
        
        if (timer==0)
        {
            timer = Abstimer;
            anim.SetBool("isRunning", false);
            running = false;
            Invoke("attack", 2);



        }

        if (running == true)
        {
            anim.SetBool("isRunning", true);
            this.transform.position += transform.right * -speed * Time.deltaTime;
            timer--;
        }

        

    }
    void attack()
    {
        
        running = true;
    }

'

vmjh9lq9

vmjh9lq91#

嗯...您知道您当前使其等待100000
=〉正常帧速率约为每秒60帧,这使得大约1667秒-又名27分钟-等待...
你更愿意做的是

  • 不使用帧速率相关代码,但秒
  • 使用合理的时间^^

例如:

public class Enemyai : MonoBehaviour
{
    public Animator anim;
    // This would mean 3 seconds
    public float Abstimer = 3f;
    public float speed = 5;

    void Update()
    {    
        if (timer<=0)
        {
            timer = Abstimer;
            anim.SetBool("isRunning", false);
            running = false;
            Invoke(nameof(attack),  2);
        }
        if (running)
        {               
            this.transform.position -= transform.right * speed * Time.deltaTime;
            timer-= Time.deltaTime:
        }
    }

    void attack()
    {
        anim.SetBool("isRunning", true);
        running = true;
    }
}

也许更容易处理的可能是一个Coroutine像例如。

public class Enemyai : MonoBehaviour
{
    public Animator anim;
    // This would mean 3 seconds
    public float Abstimer = 3f;
    public float speed = 5;

    private IEnumerator Start()
    {
        while(true)
        {
            yield return new WaitForSeconds(2);

            anim.SetBool("isRunning", true);

            for(var timer = 0f; timer < Abstimer; timer += Time.deltaTime)
            {
                transform.position -= transform.right * speed * Time.deltaTime;
                yield return null;
            }

            anim.SetBool("isRunning", false);
        }
    } 
}

无论采用哪种方法,您都需要在Inspector中实际调整Abstimer的值,而不仅仅是在代码中

相关问题