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

时间:2014-10-23 03:33:51

标签: c# unity3d

我正在尝试在我的播放器对象上扩展基类 播放器有损坏脚本,看起来像这样

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);
}

对日志的唯一回应是“原始” 是不是应该调用孩子并将“扩展”写入日志?

2 个答案:

答案 0 :(得分:4)

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

collision.gameObject.SendMessage("ReceiveDamage", damageAmount);

无论碰撞GameObject具有ReceivedDamage的任何实现,都将被调用。这很棒,因为您不需要自己指定类型,也不需要使用GetComponent。


重要的额外信息

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

为避免玩火,请将Damage设为abstract课程。

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

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

Abstract将为您提供您想要的相同功能,但Unity3d不允许您将Damage附加到GameObjects,这样可以避免错误。您将始终可以选择使用原始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 :(得分:1)

我想当你打电话给这一行时:

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

它按名称获取组件,在这种情况下,它将是Damage脚本,而不是playerDamage脚本。

在你的脚本中它应该是:

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

   }