Unity3d 为什么这里需要StartRotine()

Unity3d 为什么这里需要StartRotine(),unity3d,Unity3d,我正在写一篇关于枪支修理工的文章 我想知道为什么我们需要 收益率返回新的WaitForSeconds0.5f。没有这个命令有什么区别。时间很短,真的没有必要写这个代码。毕竟,删除这个代码后会不会像场景崩溃一样出错?非常感谢您的帮助 一般来说:每个返回的方法必须至少包含一条语句。在Unity中,您必须使用来运行IEnumerator作为 在您的特定情况下:因此您可以将代码延迟0.5秒 它很短,但0.5大约是30帧 由于键盘和手指的物理限制,使用(例如)之类的东西的人可能会在每一帧中卡住fire键,

我正在写一篇关于枪支修理工的文章 我想知道为什么我们需要
收益率返回新的WaitForSeconds0.5f。没有这个命令有什么区别。时间很短,真的没有必要写这个代码。毕竟,删除这个代码后会不会像场景崩溃一样出错?非常感谢您的帮助

一般来说:每个返回的方法必须至少包含一条语句。在Unity中,您必须使用来运行IEnumerator作为

在您的特定情况下:因此您可以将代码延迟0.5秒

它很短,但0.5大约是30帧

由于键盘和手指的物理限制,使用(例如)之类的东西的人可能会在每一帧中卡住fire键,因此他会造成比正常人更大的伤害

你只是在避免这种情况,并将射击限制在每秒最多2次

总的来说,像往常一样,有多种方法可以实现这一点,您可以完全不使用协同程序,但它使编码变得更干净,更易于维护,然后在更新中执行所有操作

作为这里简单延迟的一些替代示例,您也可以在更新中执行简单计时器

专用浮点定时器; 无效更新 { 如果时间>0 { //按从上一帧开始经过的时间减少计时器 timer-=Time.deltaTime; } 其他的 { ifInput.GetButtonDownFire1 { 点火手枪; 定时器=0.5f; } } } 真空点火手枪 { 具有给定延迟的gun.get组件

布尔坎菲尔; 无效更新 { 如果Input.GetButtonDownFire1&&canFire { 点火手枪; } } 真空点火手枪 { gun.GetComponent.play手枪射击; MuzzleFlash.SetActivetrue; MuzzleFlash.GetComponent.PlayMuzzleAnim; 枪声,游戏; 冷却后的温度为0.5f; } 真空后冷 { canFire=正确; } 通常,顺便说一句,您应该存储动画引用,以避免反复使用GetComponent:

//如果可能,已经通过检查员参考这些 [SerializeField]私人动画theGunAnimation; [SerializeField]私有动画muzzleFlashAnimation; 私人空间觉醒 { //作为后备,在运行时获取它们 //因为这是一个后备方案,在最好的情况下,您已经通过Inspector引用了这些 //我们可以节省一些资源并使用GetComponent //仅在尚未设置字段的情况下 //否则,我们可以跳过使用GetComponent,因为我们已经有了一个引用 如果!theGunAnimation theGunAnimation=TheGun.GetComponent; 如果!muzzleFlashAnimation muzzleFlashAnimation=MuzzleFlash.GetComponent; } 然后以后你再使用它们

枪声动画。播放手枪射击; MuzzleFlash.SetActivetrue; muzzleFlashAnimation.PlayMuzzleAnim; 枪声,游戏;
回答得很好,但我认为他并不是指这个!如果你声明一个Coroutine IEnumerator返回函数,你需要至少有一个yield,否则它将无法编译。@Jichael部分地说,你可能是对的,但写这段代码真的没有必要,因为时间很短,而且听起来这个问题一般来说对什么有用@derHugo你的答案很详细很清楚!非常感谢!@derHugo你能告诉我这是什么吗:如果!枪声动画枪声动画吗?请。我不明白这句代码。还有,当我们设置计时器时。Time-=delta.Time->这意味着delta.Time每次都是0.5f,因为当它变为0.5f时它会变小。是吗e delta.time fixed的值?的值如我所说的,是自上一帧以来经过的时间。如果!theGunAnimation theGunAnimation=TheGun.GetComponent;像以前一样使用GetComponent,但仅在您没有通过Inspector引用它的情况下=>在您已经有引用的情况下节省资源
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FirePistol : MonoBehaviour {

    public GameObject TheGun;
    public GameObject MuzzleFlash;
    public AudioSource GunFire;
    public bool IsFiring = false;

    void Update () {
        if (Input.GetButtonDown("Fire1"))
        {
            if (IsFiring == false)
            {
                StartCoroutine(FiringPistol());
            }
        }

    }

    IEnumerator FiringPistol ()
    {
        IsFiring = true;
        TheGun.GetComponent<Animation>().Play("PistolShot");
        MuzzleFlash.SetActive(true);
        MuzzleFlash.GetComponent<Animation>().Play("MuzzleAnim");
        GunFire.Play();
        yield return new WaitForSeconds(0.5f);
        IsFiring = false;
    }
}