如何在C# Unity中从另一个脚本扩展类

6

我正在尝试扩展我的玩家对象的基类。
玩家对象具有以下伤害脚本

using UnityEngine;
using System.Collections;

public class Damage : MonoBehaviour 
{

    public int health = 100;

    public virtual void ReceiveDamage(int damageAmount)
    {
        Debug.Log ("Original");
    }
}

接着,同一位玩家有另一个类似于这样的脚本:
using UnityEngine;
using System.Collections;

public class playerDamage : Damage 
{
    public override void ReceiveDamage(int damageAmount)
    {
        Debug.Log ("Extended");     
    }
}

但是当我像这样从另一个对象的第三方脚本中调用该脚本时:
var damageScript = collision.gameObject.GetComponent<Damage>();
if( damageScript)
{
    damageScript.ReceiveDamage(damageAmount);
}

日志的唯一响应是“Original”。 难道不应该调用子程序并将“Extended”写入日志吗?


你确定返回的实例确实是 playerDamage 吗? - Preston Guillot
请注意,Unity标签指的是Unity应用程序块,而不是Unity3D游戏引擎。 - Dour High Arch
2个回答

7
有几种方法可以实现这个。最简单的方法是使用 SendMessage
collision.gameObject.SendMessage("ReceiveDamage", damageAmount);

无论碰撞游戏对象的ReceivedDamage的实现是什么,都会被调用。这很棒,因为你不需要自己指定类型,也不需要使用GetComponent。


重要补充信息

在任何你选择的实现中,关键步骤是确保正确的脚本附加到collision.gameObject。如果你附加了两个脚本,那么你就在玩火。

为了避免玩火,请将Damage设置为abstract类。

public abstract class Damage : MonoBehaviour 
{
    public int health = 100;

    public virtual void ReceiveDamage(int damageAmount)
    {
       Debug.Log ("Original");
    }
}

除了Unity3d不允许将Damage附加到游戏对象以避免错误,Abstract将为您提供所需的相同功能。您始终可以选择具有原始ReceiveDamage选项,并选择在未来从Damage继承的类中覆盖它,就像这样:

public class Example : Damage
{
    // This one still has ReceiveDamage but it happens in the base class.
}

或者
public class PlayerDamage : Damage 
{
    public override void ReceiveDamage(int damageAmount)
    {
       Debug.Log("Extended");
    }
}

1
我认为当您调用这行代码时:

var damageScript = collision.gameObject.GetComponent<Damage>();

它通过名称获取组件,这种情况下应该是 Damage 脚本,而不是 playerDamage 脚本。
在您的脚本中应该是这样的:
   var damageScript = collision.gameObject.GetComponent<playerDamage>();
   if( damageScript)
   {
       damageScript.ReceiveDamage(damageAmount);

   }

你很接近了,但“它实例化了Damage类”是不正确的。 - apxcode
从内存中,它只是通过名称获取组件吗? - JanR
是的,那就是它的功能。 - apxcode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接