我正在尝试在我的播放器对象上扩展基类 播放器有损坏脚本,看起来像这样
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);
}
对日志的唯一回应是“原始” 是不是应该调用孩子并将“扩展”写入日志?
答案 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);
}