C# 如何在指定的时间内在Unity中循环一个命令

C# 如何在指定的时间内在Unity中循环一个命令,c#,unity3d,C#,Unity3d,我正在尝试为unity中的玩家制作一个攻击脚本。攻击将通过在玩家面前创建一个变换来进行,当玩家按下攻击按钮时,一个1秒计时器将启动,任何进入该变换的敌人都将被杀死。计时器结束后,进入转换时敌人将不再被杀死。我试着通过使用invokererepeating命令循环基本命令来杀死敌人一秒钟。但是我以前从未使用过,所以它当然不起作用。我必须提到,我使用了startcroutine使命令重复一秒钟。我为自己缺乏知识而道歉,因为我是Unity和编程新手。无论如何,代码如下: public class Pl

我正在尝试为unity中的玩家制作一个攻击脚本。攻击将通过在玩家面前创建一个变换来进行,当玩家按下攻击按钮时,一个1秒计时器将启动,任何进入该变换的敌人都将被杀死。计时器结束后,进入转换时敌人将不再被杀死。我试着通过使用
invokererepeating
命令循环基本命令来杀死敌人一秒钟。但是我以前从未使用过,所以它当然不起作用。我必须提到,我使用了
startcroutine
使命令重复一秒钟。我为自己缺乏知识而道歉,因为我是Unity和编程新手。无论如何,代码如下:

public class PlayerAttack : MonoBehaviour
{
    public Transform AttackArea;
    bool IsAttacking = false;
    public Animator animator;
    public LayerMask EnemyLayers;
    public float AttackRange = 0.5f;
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {

            animator.SetTrigger("Attack");
            StartCoroutine(AttackLoop());
            Attack();
            InvokeRepeating("Attack", 0, 0);
        }
    }


    void Attack()
    {

            Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(AttackArea.position, AttackRange, EnemyLayers);
            foreach (Collider2D enemy in hitEnemies)
            {
                enemy.GetComponent<Enemy_1>().Death();
            }

    }
    


    void OnDrawGizmosSelected()
    {
        if (AttackArea == null)
            return;
        Gizmos.DrawWireSphere(AttackArea.position, AttackRange);

    }
    IEnumerator AttackLoop()
    {
        yield return new WaitForSeconds(1);
        {
            CancelInvoke("Attack");
        }
    }



}
public class PlayerAttack:monobhavior
{
公共转型攻击区;
bool-IsAttacking=false;
公共动画师;
公共层屏蔽层;
公众浮标攻击范围=0.5f;
无效更新()
{
if(Input.GetKeyDown(KeyCode.Space))
{
设置触发器(“攻击”);
start例程(AttackLoop());
攻击();
调用重复(“攻击”,0,0);
}
}
无效攻击()
{
Collized r2d[]HitDebuys=Physics2D.OverlappCircleall(攻击区域.position,攻击范围,EnemyLayers);
foreach(在HitTowners中碰撞R2D敌人)
{
敌人。GetComponent()。死亡();
}
}
void OnDrawGizmosSelected()
{
if(AttackArea==null)
返回;
Gizmos.DrawWireSphere(AttackArea.position,AttackRange);
}
IEnumerator AttackLoop()
{
返回新的WaitForSeconds(1);
{
取消调用(“攻击”);
}
}
}

一种简单的方法是创建一个单一的协同程序,使用
time.deltaTime
跟踪时间,并循环直到适当的时间过去:

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        StartAttack();
    }
}

void StartAttack()
{
    float attackDuration = 1.0f; // attack for 1 second
    animator.SetTrigger("Attack");
    StartCoroutine(AttackLoop(attackDuration));
}

void Attack()
{
    Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(AttackArea.position, AttackRange, EnemyLayers);
    foreach (Collider2D enemy in hitEnemies)
    {
        enemy.GetComponent<Enemy_1>().Death();
    }
}

IEnumerator AttackLoop(float attackDuration)
{
    float elapsedTime = 0f;
    while (elapsedTime < attackDuration) 
    {
        Attack();
        yield return null;
        elapsedTime += Time.deltaTime;
    }
}
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
StartAttack();
}
}
void StartAttack()
{
float attackDuration=1.0f;//攻击1秒
设置触发器(“攻击”);
start例程(AttackLoop(attackDuration));
}
无效攻击()
{
Collized r2d[]HitDebuys=Physics2D.OverlappCircleall(攻击区域.position,攻击范围,EnemyLayers);
foreach(在HitTowners中碰撞R2D敌人)
{
敌人。GetComponent()。死亡();
}
}
IEnumerator AttackLoop(浮动攻击持续时间)
{
浮动时间=0f;
while(elapsedTime<攻击持续时间)
{
攻击();
收益返回空;
elapsedTime+=Time.deltaTime;
}
}

您的
攻击
方法未以任何方式连接到协同路由。它根本不受它们启动或停止的影响(而且您只调用一次)