杭州外贸网站建设公司申跃,wordpress怎么上传缩略图,网页设计与网站建设的理解,精准营销推广方案先看代码#xff1a;
TankBaseObj obj other.GetComponentTankBaseObj();if(obj ! null){//说明是坦克打到坦克 受伤处理 固定不会受伤 移动的会受伤obj.Wound(fatherObj);}
TankBaseObj 是一个基类 wound是一个虚函数 子类已经重新实现 当你的游戏对象依附…先看代码
TankBaseObj obj other.GetComponentTankBaseObj();if(obj ! null){//说明是坦克打到坦克 受伤处理 固定不会受伤 移动的会受伤obj.Wound(fatherObj);}
TankBaseObj 是一个基类 wound是一个虚函数 子类已经重新实现 当你的游戏对象依附的是一个已经继承TankBaseObj的子类 然后 TankBaseObj obj other.GetComponentTankBaseObj(); obj 就是子类的实例化 只不过 这里是用父类装子类的思想 但是他实际的引用还是子类对象 并且 子类已经重写虚函数Wound 所以这里掉用的就会是重写的函数方法
在Unity中当你使用GetComponentT()方法获取组件时你实际上是在尝试从游戏对象上获取类型为T的组件。在你的例子中T是TankBaseObj这是一个父类。如果游戏对象上附加了一个继承自TankBaseObj的子类组件比如TankChildObj那么GetComponentTankBaseObj()将会成功返回这个子类组件的实例因为子类实例也是父类类型的一个对象。
现在关于你提到的Wound方法被重写的情况这里有一些关键点需要理解 虚方法和重写如果TankBaseObj中的Wound方法被标记为virtual并且子类比如TankChildObj中提供了这个方法的一个override实现那么当通过父类类型的引用调用这个方法时实际上会调用子类中的重写方法。这是C#中多态性的一个表现。 实际对象类型在运行时obj变量虽然被声明为TankBaseObj类型但它实际上指向的是子类如TankChildObj的一个实例。因此当调用obj.Wound(fatherObj);时会调用该实例上重写的Wound方法。 编译时与运行时类型在编译时obj的类型是TankBaseObj编译器只知道它可以调用TankBaseObj上定义的方法。但在运行时obj实际指向的是一个具体的子类实例所以运行时会根据这个实例的实际类型来确定调用哪个Wound方法。
举个例子假设有以下类定义
public class TankBaseObj : MonoBehaviour
{ public virtual void Wound(GameObject attacker) { // 父类的受伤处理逻辑 Debug.Log(TankBaseObj Wound); }
} public class TankChildObj : TankBaseObj
{ public override void Wound(GameObject attacker) { // 子类的受伤处理逻辑 Debug.Log(TankChildObj Wound); // 可能还会调用base.Wound(attacker)来执行父类的逻辑 }
}
如果游戏对象上附加了TankChildObj组件并且你通过GetComponentTankBaseObj()获取了这个组件然后调用了Wound方法那么将会输出TankChildObj Wound因为实际调用的是TankChildObj中重写的Wound方法。
总结来说当你通过父类类型的引用调用一个被子类重写的方法时实际调用的是运行时对象类型中重写的方法。这是面向对象编程中多态性的一个基本特性。