当前位置: 首页 > article >正文

unity3d——关于GetComponent<T>()

先看代码:

TankBaseObj obj = other.GetComponent<TankBaseObj>();
            if(obj != null)
            {
                //说明是坦克打到坦克  受伤处理  固定不会受伤  移动的会受伤
                obj.Wound(fatherObj);
            }

TankBaseObj 是一个基类  wound是一个虚函数  子类已经重新实现   当你的游戏对象依附的是一个已经继承TankBaseObj的子类   然后 TankBaseObj obj = other.GetComponent<TankBaseObj>();  obj 就是子类的实例化  只不过 这里是用父类装子类的思想  但是他实际的引用还是子类对象 并且 子类已经重写虚函数Wound 所以这里掉用的就会是重写的函数方法

在Unity中,当你使用GetComponent<T>()方法获取组件时,你实际上是在尝试从游戏对象上获取类型为T的组件。在你的例子中,TTankBaseObj,这是一个父类。如果游戏对象上附加了一个继承自TankBaseObj的子类组件(比如TankChildObj),那么GetComponent<TankBaseObj>()将会成功返回这个子类组件的实例,因为子类实例也是父类类型的一个对象。

现在,关于你提到的Wound方法被重写的情况,这里有一些关键点需要理解:

  1. 虚方法和重写:如果TankBaseObj中的Wound方法被标记为virtual,并且子类(比如TankChildObj)中提供了这个方法的一个override实现,那么当通过父类类型的引用调用这个方法时,实际上会调用子类中的重写方法。这是C#中多态性的一个表现。

  2. 实际对象类型:在运行时,obj变量虽然被声明为TankBaseObj类型,但它实际上指向的是子类(如TankChildObj)的一个实例。因此,当调用obj.Wound(fatherObj);时,会调用该实例上重写的Wound方法。

  3. 编译时与运行时类型:在编译时,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组件,并且你通过GetComponent<TankBaseObj>()获取了这个组件,然后调用了Wound方法,那么将会输出TankChildObj Wound,因为实际调用的是TankChildObj中重写的Wound方法。

总结来说,当你通过父类类型的引用调用一个被子类重写的方法时,实际调用的是运行时对象类型中重写的方法。这是面向对象编程中多态性的一个基本特性。


http://www.kler.cn/a/382025.html

相关文章:

  • JAVA基础:数组 (习题笔记)
  • 【Rust中的迭代器】
  • 解析 MySQL 数据库容量统计、存储限制与优化技巧
  • Unity照片墙效果
  • FITS论文解析
  • 深度学习基础知识-损失函数
  • 解决Knife4j 接口界面UI中文乱码问题
  • 扩展卡尔曼滤波(EKF)的限制
  • 西南科技大学C++实验作业3——容器使用和文件输入输出流
  • 实现数传数据转网口(以太网)和遥控器SBUS信号转串口的功能
  • leetcode 75.颜色分类
  • Python的struct打包通讯数据头文件
  • 杨辉三角——c语言
  • 浏览器内核版本更新:Chrome 130✔
  • 【MySQL】函数
  • 网络安全求职指南_看完这篇就足够了~
  • c++设计模式demo
  • 【Linux】Linux安全与密钥登录指南
  • 工作管理实战指南:利用Jira、Confluence等Atlassian工具打破信息孤岛,增强团队协作【含免费指南】
  • 算法学习(十)—— 字符串
  • Oracle 第15章:安全性管理
  • 基于python主观题自动阅卷系统毕业设计项目
  • 计算机网络:网络层 —— 虚拟专用网 VPN
  • [C++从小白到大牛]第三篇:3分钟带你入门C++(下)
  • 苍穹外卖day-01
  • java 正则匹配json中占位符