如何从c#Unity中的另一个脚本扩展类
我正在尝试在我的player对象上扩展基类。如何从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"); }
玩家的伤害脚本如下所示
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游戏引擎。你很接近,但它实例化的损坏类别是不正确的。从内存中,它只是按名称抓取组件吗?是的,它就是这样做的。