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

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方法。

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

相关文章:

unity3d——关于GetComponent<T>()

先看代码&#xff1a; TankBaseObj obj other.GetComponent<TankBaseObj>();if(obj ! null){//说明是坦克打到坦克 受伤处理 固定不会受伤 移动的会受伤obj.Wound(fatherObj);} TankBaseObj 是一个基类 wound是一个虚函数 子类已经重新实现 当你的游戏对象依附…...

Spring 框架中常见的注解(Spring、SpringMVC、SpringBoot)

1. Spring 中常见注解 还有Recourse&#xff1a;相当于AutowiredQualifier Value : 用于将配置文件中的值注入到Bean的字段中。 Bean : 用于在配置类中声明一个Bean。 Lazy : 用于延迟加载Bean。 2. SpringMVC 中常见注解 还有GetMapping PostMapping PutMapping DeleteMapp…...

Hms?: 1渗透测试

靶机&#xff1a;Hms?: 1 Hms?: 1 ~ VulnHub 攻击机&#xff1a;kail linux 2024 主机扫描阶段发现不了靶机&#xff0c;所以需要按DriftingBlues2一样手动配置网卡 1,将两台虚拟机网络连接都改为NAT模式&#xff0c;并查看靶机的MAC地址 2&#xff0c;攻击机上做主机扫描发现…...

1、Qt6 Quick 简介

一、Qt6 Quick 简介 1、Qt Quick简介 Qt Quick 是 Qt 6 中使用的用户界面技术的总称。它是在 Qt 4 中引入的&#xff0c;现在在 Qt 6 中进行了扩展。Qt Quick 本身是几种技术的集合&#xff1a; QML——用户界面标记语言JavaScript - 动态脚本语言Qt C - 高度可移植的增强型…...

大模型论文集-20241103

Investigating the catastrophic forgetting in multimodal large language models 研究问题 本文探讨了多模态大型语言模型&#xff08;MLLMs&#xff09;在学习新任务时的灾难性遗忘现象。研究者关注于在添加新数据集后&#xff0c;模型是否能够保留之前学到的知识而不忘记…...

GESP4级考试语法知识(计数排序-桶排序)

整数排列参考程序代码&#xff1a; #include<iostream> #include<cstring> using namespace std; int main() {int a[101],n,i,j,k;memset(a,0,sizeof(a)); //数组清0cin>>n; //输入数字个数for(i1;i<n;i) {cin>>k; //输…...

红队-shodan搜索引擎篇

如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一.shodan原理与功能的介绍 Shodan Search Engine 它是专门搜网络设备的,只要联网的,只要有IP地址的都可以称为网络设备 1.shodan&#x…...

SQL 数据结构查询

1&#xff1a;查询变得结构。 SELECT COLID,SO.NAME,EP.VALUE,SO.LENGTH,MIN(ST.NAME) AS TYPE FROM SYS.EXTENDED_PROPERTIES EP RIGHT JOIN SYS.SYSCOLUMNS SO ON MAJOR_IDID AND COLIDMINOR_ID LEFT JOIN SYS.SYSTYPES ST ON ST.XTYPESO…...

《高频电子线路》—— 角度调制(调相、调频)

文章内容来源于【中国大学MOOC 华中科技大学通信&#xff08;高频&#xff09;电子线路精品公开课】&#xff0c;此篇文章仅作为笔记分享。 目录 角度调制&#xff08;调相、调频&#xff09; 角度调制的原因 调频VS调幅 角度调制的分类 本章重难点 调相 时域&#xff0…...

危机来临前---- 力扣: 876

危机即将来临 – 链表的中间节点 描述&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例&#xff1a; 何解&#xff1f; 1、遍历找到中间节点 &#xff1a; 这个之在回文链表中找…...

langchain调用chatgpt对文本进行编码

1.导包 from langchain_openai import OpenAIEmbeddings2.加载编码器 embeddings_model OpenAIEmbeddings(model"text-embedding-3-large",base_url"https://api.chatanywhere.tech/v1")3.编码 embeded_result embeddings_model.embed_documents([&qu…...

python manage.py

自定义命令python manage.py 文件夹建立&#xff1a;(Python Package)这个形式的包&#xff0c;里面会自动加载__init__.py文件 1.新建management文件夹(文件必须加载在新建APP下&#xff0c;不能建在初始APP下) 2.在里面创建名为&#xff1a;commands的文件夹 3.在其下创建名…...

qt QDoubleSpinBox详解

1、概述 QDoubleSpinBox是Qt框架中的一个控件&#xff0c;专门用于浮点数&#xff08;即小数&#xff09;的输入和调节。它提供了一个用户界面元素&#xff0c;允许用户在预设的范围内通过拖动滑块、点击箭头或使用键盘来递增或递减浮点数值。QDoubleSpinBox通常用于需要精确数…...

RK3229 Android9自定义一个按键实现长按短按

一、kernel修改 --- a/arch/arm/boot/dts/rk3229-evb-android.dtsib/arch/arm/boot/dts/rk3229-evb-android.dtsi-18,26 18,25 };gpio_keys {status "okay";compatible "gpio-keys";#address-cells <1>;#size-cells <0>;autorepeat;pinct…...

A*算法求第k短路

话不多说先上例题。。 acwing&#xff1a;178. 第K短路 给定一张 NN 个点&#xff08;编号 1,2…N1,2…N&#xff09;&#xff0c;MM 条边的有向图&#xff0c;求从起点 SS 到终点 TT 的第 KK 短路的长度&#xff0c;路径允许重复经过点或边。 注意&#xff1a; 每条最短路中至…...

CVPR’25截稿在即:今年的重大新规,你知道吗?

介绍会议&#xff1a; CVPR 2025全称是 IEEE/CVF Conference on Computer Vision and Pattern Recognition&#xff0c;即IEEE/CVF国际计算机视觉与模式识别会议。将于2025年6月11日至15日在美国田纳西州纳什维尔召开&#xff0c;CVPR是计算机视觉和模式识别领域的顶级会议。与…...

一文详解销售管理系统的功能、作用、选型

在当今竞争激烈的商业环境中&#xff0c;企业需要高效的工具来管理销售流程、提升客户关系和优化业务决策。销售管理系统&#xff08;Sales Management System&#xff09;正是这样一种工具&#xff0c;它通过整合客户信息、自动化销售流程和提供数据分析&#xff0c;帮助企业实…...

MySQL上RDS MySQL

初步想法是通过主从复制的方式进行&#xff0c;即ECS上的数据库设为主&#xff0c;RDS为从&#xff0c;等同步完成后&#xff0c;切换为RDS节点。创建实例后发现&#xff0c;RDS实例不支持server-id的自定义配置&#xff0c;这个想法就被否决了。但是aliyun和huaweiyun 都提供了…...

单体架构的 IM 系统设计

先直接抛出业务背景&#xff01; 有一款游戏&#xff0c;日活跃量&#xff08;DAU&#xff09;在两千左右&#xff0c;虽然 DAU 不高&#xff0c;但这两千用户的忠诚度非常高&#xff0c;而且会持续为游戏充值&#xff1b;为了进一步提高用户体验&#xff0c;继续增强用户的忠…...

kafka消费端常见故障及处理方法

文章目录 前言一、消费端某个进程已经crash1. 主要心跳相关配置2. 完整的消费者配置示例3. 调整参数的建议 二、客户端没有crash&#xff0c;但是消费阻塞1. 工作机制2. 示例配置3.运用在代码里3. 配置建议 前言 kafka消费端经常会出现一些故障&#xff0c;一起来分析一下故障…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...