unity3d Unity 2D -攻击系统仅在移动时工作

w9apscun  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(152)

我最近开始编写Unity的代码,试图制作一个游戏。一直以来都很顺利,但我遇到了一个问题。我为攻击系统实现了一个脚本:

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

public class AttackDamage : MonoBehaviour
{
    private float attackDamage = 20;

    private void OnTriggerEnter2D(Collider2D other) 
    { 
        if (other.GetComponent<Health>() != null)
        {
            Health health = other.GetComponent<Health>();
            health.TakeDamage(attackDamage);
        }
    }
}

我还为卫生系统实施了一个项目:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class Health : MonoBehaviour
{
    public Image healthBar;
    public float healthAmount = 100;

    private void Update() 
    {
        if (healthAmount <= 0)
        {
            SceneManager.LoadScene(0);
        }
    }

    public void TakeDamage(float Damage)
    {
        healthAmount -= Damage;

        healthBar.fillAmount = healthAmount / 100;
    }

    public void Healing(float healPoints)
    {
        healthAmount += healPoints;
        healthAmount = Mathf.Clamp(healthAmount, 0, 100);

        healthBar.fillAmount = healthAmount / 100;
    }
}

而且效果很好。但是正如你在标题上看到的,攻击只有在我移动后才起作用。如果我不移动的时候攻击,攻击区域会出现在场景中,但是不会造成伤害。我不知道为什么。
你知道问题出在哪里吗?
这里还有一个视频实际发生了什么,在游戏中:https://drive.google.com/drive/folders/1BTYTNz_yzus-eRLnjsgB0hsYLU5sQm2k?usp=sharing
我不知道如何解决这个问题,因为我已经从网上的一个源代码复制,它实际上工作properly。
代码是完全相同的,除了卫生系统的脚本,这是没有显示在视频中,但这也不应该有太大的区别。
所以我真的不知道该怎么处理。
谢谢你的帮助:)

zf9nrax1

zf9nrax11#

如果你想在任何生命角色处于触发状态时造成持续伤害,请使用OnTriggerStay2d
否则,如果你想在用户按下按钮时造成伤害,你可以执行以下操作:
1.拥有一个能储存射程内所有敌人的命中盒子对撞机。(当敌人进入命中盒子时,将其添加到列表中,当敌人退出时,将其从列表中删除。)
1.当攻击触发时,从1.中取出列表中的所有敌人,并对其造成伤害。
代码方面,看起来像这样:

public class AttackDamage : MonoBehaviour
{
    private HashSet<Health> inRange = new HashSet<Health>();    

    private float attackDamage = 20;

    private void OnTriggerEnter2D(Collider2D other) 
    { 
        if (other.GetComponent<Health>() != null) 
        {
            // Add to set of characters that are in range of attack
            inRange.Add(other.GetComponent<Health>());
        }
    }

    private void OnTriggerExit2D(Collider2D other)
    {
        var charHealth = other.GetComponent<Health>();
        if (charHealth != null) {
            // Remove, since it exit the range of the attacking character.
            inRange.Remove(charHealth);
        }
    }

    // Call this function whenever you want to do damage to all characters in range.
    public void Attack(){
        foreach(var character in inRange){
            character.TakeDamage(attackDamage);
        }
    }
}

然后在其他地方...(例如,在您的播放器中。)

public class YourPlayer {
    // ...
 
    // Inspector reference to the hitbox
    [SerializeField]
    private AttackDamage attackHitbox;

    private void Update(){
        // Attack when button is pressed (or something).
        if (Input.GetKeyDown(KeyCode.A)) {
             attackHitbox.Attack();
        }
    }

    // ...
}

最后,如果你想在动画中的特定点造成伤害,你应该搜索的术语是 * 关键帧 *。查找关于 * 动画 * 的教程,然后是 * 关键帧 *。
一旦你了解了它,你可以使用上面提到的方法,但调用你所需的关键帧损坏脚本。

相关问题