Class Unity-从子类激活事件

Class Unity-从子类激活事件,class,unity3d,events,delegates,subclass,Class,Unity3d,Events,Delegates,Subclass,我正在制作一个游戏,我制作了一个“敌人”类作为“演员”类的子类,它将用于敌人、障碍物、玩家等。我通过演员类处理碰撞,而敌人和玩家在游戏中处理伤害的方式不同,所以我需要在敌人子类中使用TakeDamage方法。我已确认所有碰撞功能正常,这将问题精确定位在我尝试使用的代理上 在actor类中,我有以下内容: public event OnDamageEvent OnTakeDamage; public delegate void OnDamageEvent(int damage); ... pu

我正在制作一个游戏,我制作了一个“敌人”类作为“演员”类的子类,它将用于敌人、障碍物、玩家等。我通过演员类处理碰撞,而敌人和玩家在游戏中处理伤害的方式不同,所以我需要在敌人子类中使用TakeDamage方法。我已确认所有碰撞功能正常,这将问题精确定位在我尝试使用的代理上

在actor类中,我有以下内容:

public event OnDamageEvent OnTakeDamage;
public delegate void OnDamageEvent(int damage);

...

public void OnHit(Collider2D hitBy)
{
    GameObject hitGO = hitBy.gameObject;
    switch (hitBy.gameObject.layer)
    {
        case 6:
            Hitbox hbox = hitBy.GetComponent<Hitbox>();
            if (hbox.ControllerID != this)
            {
                if (GetHitIDs(hbox))
                {
                    hbox.HitIDs.Add(gameObject.GetComponent<GameActor>());
                    OnTakeDamage?.Invoke(hbox.Damage);
                    Debug.Log("Hit.");
                }
            }
            break;
    }
}
private void Start()
{
    OnTakeDamage += TakeDamage;
}
...
private void TakeDamage(int damage)
{
    Debug.Log("Damage: " + damage);
    health -= damage;
    if(health <= 0)
    {
        StartCoroutine(Death(60));
    }
}

private void OnTriggerEnter2D(Collider2D hitBy)
{
    OnHit(hitBy);
}
重大事故损害公共事件;
公共代表无效OnDamageEvent(内部损坏);
...
公共无效命中(碰撞R2D命中)
{
GameObject hitGO=hitBy.GameObject;
开关(hitBy.gameObject.layer)
{
案例6:
Hitbox hbox=hitBy.GetComponent();
if(hbox.ControllerID!=此)
{
if(GetHitIDs(hbox))
{
添加(gameObject.GetComponent());
OnTakeDamage?调用(hbox.Damage);
Log(“Hit”);
}
}
打破
}
}
在敌方类中,如前所述,敌方类是actor类的一个子类,我有:

public event OnDamageEvent OnTakeDamage;
public delegate void OnDamageEvent(int damage);

...

public void OnHit(Collider2D hitBy)
{
    GameObject hitGO = hitBy.gameObject;
    switch (hitBy.gameObject.layer)
    {
        case 6:
            Hitbox hbox = hitBy.GetComponent<Hitbox>();
            if (hbox.ControllerID != this)
            {
                if (GetHitIDs(hbox))
                {
                    hbox.HitIDs.Add(gameObject.GetComponent<GameActor>());
                    OnTakeDamage?.Invoke(hbox.Damage);
                    Debug.Log("Hit.");
                }
            }
            break;
    }
}
private void Start()
{
    OnTakeDamage += TakeDamage;
}
...
private void TakeDamage(int damage)
{
    Debug.Log("Damage: " + damage);
    health -= damage;
    if(health <= 0)
    {
        StartCoroutine(Death(60));
    }
}

private void OnTriggerEnter2D(Collider2D hitBy)
{
    OnHit(hitBy);
}
private void Start()
{
OnTakeDamage+=TakeDamage;
}
...
私人伤害(智力伤害)
{
调试日志(“损坏:+损坏);
健康-=损害;

如果(健康)您提供了更多的上下文?OnHit是如何调用的?如果第二个代码段是第一个代码段的子类..为什么要使用
事件
?只需使用
虚拟
抽象
方法,并在子类中覆盖它,对吧。OnHit由子类中的OnTriggerEnter2D调用(同样,我有理由从子类中这样做。)至于虚拟、抽象和重写?我不知道这些。你能给我一个例子说明它们是如何工作的吗?我可以尝试任何方法来找到有效的方法。