我正在尝试在播放器对象上扩展基类。
玩家的伤害脚本如下所示
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);
}
对日志的唯一响应是“原始”,是否应该叫孩子并将其“扩展”写入日志?
有几种方法可以做到这一点。最简单的方法是SendMessage。
collision.gameObject.SendMessage("ReceiveDamage", damageAmount);
无论ReceivedDamage
碰撞GameObject具有哪种实现,都将被称为该实现。这很棒,因为您不需要自己指定类型也不需要使用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
到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");
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句