Unity3d Unity2D攻击动画和伤害计时

Unity3d Unity2D攻击动画和伤害计时,unity3d,Unity3d,背景: 我有一个2D游戏,在这个游戏中,你可以生成向右移动的单位,攻击敌人,直到你摧毁敌人的基地。每个单元都被实例化并具有raycast2D组件。当它没有发现任何东西时,它会行走,当它发现敌人时,它会停止并用攻击冷却时间进行攻击 现在,它一旦发现敌人,就会播放攻击动画,同时造成伤害。例如:如果攻击动画需要0.5秒,冷却时间为1秒,则计时器同时运行,动画与伤害刻度不匹配 光线投射代码停止移动,关闭行走动画并检查其是否可以攻击 else if (hitInfo.collider.gameObject

背景:

我有一个2D游戏,在这个游戏中,你可以生成向右移动的单位,攻击敌人,直到你摧毁敌人的基地。每个单元都被实例化并具有raycast2D组件。当它没有发现任何东西时,它会行走,当它发现敌人时,它会停止并用攻击冷却时间进行攻击

现在,它一旦发现敌人,就会播放攻击动画,同时造成伤害。例如:如果攻击动画需要0.5秒,冷却时间为1秒,则计时器同时运行,动画与伤害刻度不匹配

光线投射代码停止移动,关闭行走动画并检查其是否可以攻击

else if (hitInfo.collider.gameObject.tag == "Enemy")
        {

            transform.Translate(Vector2.right * 0 * Time.deltaTime);
            anim.SetBool("isWalking", false);

            if (attackCurrentTime < attackCD)
            {
                attackCurrentTime += Time.deltaTime;
            }
            else
            {
                attackCurrentTime = 0;
                basicAttackEnemy();

            }
        }
else if(hitInfo.collider.gameObject.tag==“敌人”)
{
transform.Translate(Vector2.right*0*Time.deltaTime);
动画设置工具(“isWalking”,false);
如果(attackCurrentTime
这是最基本的敌人();功能。它只是启动动画并造成伤害

void basicAttackEnemy()
        {
            anim.SetTrigger("attackEnemy");
            hitInfo.collider.gameObject.GetComponent<EnemyIA>().TakeDamage(attackDamage);

        }
void basictacktoken()
{
动画设置触发器(“攻击敌人”);
hitInfo.collider.gameObject.GetComponent().TakeDamage(攻击伤害);
}
我如何在Unity中更改代码或做其他事情,让我的伤害、动画和冷却计时器正确同步


谢谢你的时间。

假设你有某种生物在做动画,他们有某种武器(即使武器只是拳头或爪子),我发现实施攻击和伤害的“最佳”方法是使用迎面相撞方法来判断你何时与敌人接触

你要做的是:

第1步:在武器上,或者在他们身体的某个部位,创建一个额外的对撞机,该对撞机应该足够靠近应该承受伤害的敌人。请随意将这个对撞机设置得相当大,因为它不会在游戏中真正“显示”任何东西

步骤2:在代码[SerializeField]私有BoxCollider weaponCollider中创建一个新变量。(如果您需要不同的形状,可以从BoxCollider更改此项,没有问题)

步骤3:将这些更改保存到代码中,现在在编辑器中,您将看到在具有该攻击动画脚本的游戏对象(玩家对象?)上有一个空的参数槽,将新的碰撞器从检查器拖放到该槽中,这将告诉您的代码您正在谈论的碰撞器

第四步:你需要使用图层来识别敌人,但不要太担心。本教程将为您提供所需的大部分内容->

步骤5:最后,您可以将代码更新为如下内容。(这可能不准确,但它应该能让你离得足够近,让你自己走完剩下的路

void basicAttackEnemy()
        {
            anim.SetTrigger("attackEnemy");
            weaponCollider.enabled = true;
        }
步骤7:使用以下内容创建一个新脚本,并将其附加到碰撞器上

void onCollisionEnter(Collision collision) {
  if (gameObject.Layer == "Enemy") {
    hitInfo.collider.gameObject.GetComponent<EnemyIA>().TakeDamage(attackDamage);
    self.enabled = false;
  }
}
void onCollisionEnter(碰撞){
如果(gameObject.Layer==“敌人”){
hitInfo.collider.gameObject.GetComponent().TakeDamage(攻击伤害);
self.enabled=false;
}
}
您可能需要更改OnCollisionCenter脚本,有关碰撞器和碰撞的更多信息,请尝试本教程


但总的来说,这一切都是这样的。它创建了一个系统,你的攻击动画激活一个对撞机,检查它是否真的击中了敌人,如果击中了,那么它会对敌人造成伤害,然后再次关闭自己。它关闭了自己,这样你就不会一次击中就杀死一切,否则,它会造成伤害在攻击动画中,一秒钟内出现多次。我想问题在于动画的计时。你能与我们分享你的动画状态和转换吗?