如何从c#Unity中的另一个脚本扩展类

如何从c#Unity中的另一个脚本扩展类,c#,unity3d,C#,Unity3d,我正在尝试在我的player对象上扩展基类。 玩家的伤害脚本如下所示 using UnityEngine; using System.Collections; public class Damage : MonoBehaviour { public int health = 100; public virtual void ReceiveDamage(int damageAmount) { Debug.Log ("Original"); }

我正在尝试在我的player对象上扩展基类。
玩家的伤害脚本如下所示

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);
}
public class Example : Damage
{
    // This one still has ReceiveDamage but it happens in the base class.
}
var-damageScript=collision.gameObject.GetComponent();
如果(损坏脚本)
{
损坏脚本。收到的损坏(损坏金额);
}
对日志的唯一响应是“原始”
孩子不应该被调用并“扩展”写入日志吗?

我想当你调用这一行时:

var damageScript = collision.gameObject.GetComponent<Damage>();
var-damageScript=collision.gameObject.GetComponent();
它按名称获取组件,在本例中是损坏脚本,而不是playerDamage脚本

在脚本中,它应该是:

   var damageScript = collision.gameObject.GetComponent<playerDamage>();
   if( damageScript)
   {
       damageScript.ReceiveDamage(damageAmount);

   }
var-damageScript=collision.gameObject.GetComponent();
如果(损坏脚本)
{
损坏脚本。收到的损坏(损坏金额);
}

有几种方法可以做到这一点。最简单的方法是

collision.gameObject.SendMessage("ReceiveDamage", damageAmount);
碰撞游戏对象具有的
receivedImage
的任何实现都将被调用。这非常棒,因为您不需要自己指定类型,也不需要使用GetComponent


重要额外信息 在您选择的任何实现中,关键步骤是确保将正确的脚本连接到
冲突.gameObject
。如果你同时附加两个脚本,那么你就是在玩火

为了避免玩火,请将
伤害
设置为
抽象

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

    public virtual void ReceiveDamage(int damageAmount)
    {
       Debug.Log ("Original");
    }
}
Abstract将为您提供您想要的相同功能,除了Unity3d不允许您将
伤害
附加到游戏对象上,这有助于避免错误。您始终可以选择使用原始的
ReceiveDamage
,也可以选择在继承自
Damage
的未来类上覆盖它,如下所示:

var damageScript = collision.gameObject.GetComponent<Damage>();
if( damageScript)
{
    damageScript.ReceiveDamage(damageAmount);
}
public class Example : Damage
{
    // This one still has ReceiveDamage but it happens in the base class.
}


你确定返回的实例实际上是一个
playerDamage
?请注意
Unity
标记指的是Unity应用程序块,而不是Unity3D游戏引擎。你很接近,但
它实例化的损坏类别是不正确的。从内存中,它只是按名称抓取组件吗?是的,它就是这样做的。