首页 > 编程语言 >关于Actor Component的思考--学习斯坦佛UE+C++

关于Actor Component的思考--学习斯坦佛UE+C++

时间:2023-10-03 22:44:37浏览次数:35  
标签:函数 -- Component Actor UPrimitiveComponent 源码 Health

跟着B站的视频学习,感觉自己的头很混乱。所以浅浅总结一下创建Actor Component之后其的作用和相关操作。

Actor Component

首先Component为一个组件,源码就是一个类的声明和类的实现。所以对其的操作就是对类的操作。可以在其源码内部定义一些物体属性,比如一个角色的Component。我们可以定义其的血量,属性等人物属性。

就拿目前学习到的血量来说,在声明中,定义血量float和对应的实现扣血的函数。然后在类的实现内部构造函数中初始化血量,并且在类的实现中编写函数原型。

或者说所有新建的源码文件都是这样构成的。

Component接入一个角色Actor

直接在Actor的头文件中,定义一个Component类的对象。然后在构造函数中初始化这个对象。

//.h
USAttributeComponent* AttributeComp;

//.cpp
AttributeComponent = CreateDefaultSubobject<USAttributeComponent>("AttributeComponent");

至此该Component就接入了这个Actor,所以该Actor拥有了Health和改变Health的函数方法。

对子弹实现攻击扣血功能

主要实现设置Health的函数方法中,Delta的值并且确定什么时候在Actor上调用改变Health的函数。
操作实现就只用编写一个函数,在函数中接受角色参数,然后通过调用传入的角色,获取Component属性,然后再将Delta值传入改变Health的函数方法即可。
课程中采用的是Overlap来判断粒子与角色的碰撞。使用了一个委托OnComponentBeginOverlap,使用这个委托对this(粒子)添加了一个事件&ASMagicProjectile::OnActorOverlap就是我们要编写的函数

SphereComp->OnComponentBeginOverlap.AddDynamic(this, &ASMagicProjectile::OnActorOverlap);

该函数的具体参数参考了这个委托的定义源码FComponentBeginOverlapSignature;

DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_SixParams( FComponentBeginOverlapSignature, UPrimitiveComponent, OnComponentBeginOverlap, UPrimitiveComponent*, OverlappedComponent, AActor*, OtherActor, UPrimitiveComponent*, OtherComp, int32, OtherBodyIndex, bool, bFromSweep, const FHitResult &, SweepResult);

我们编写的这个OnActorOverlap函数源码如下

void ASMagicProjectile::OnActorOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	if (OtherActor && OtherActor!=GetInstigator()) {
		//获取除了自己的其他对象的AttributeComponent属性
		USAttributeComponent* AttributeComp = Cast<USAttributeComponent>(OtherActor->GetComponentByClass(USAttributeComponent::StaticClass()));
		//如果有进行下一步操作,减少值
		if (AttributeComp) {
			AttributeComp->ApplyHealthChange(-1.0f);
			Destroy();
		}
	}
}

一个Actor是拥有多个接口的,我们利用GetComponentByClass来获取我们想要的Component。
USAttributeComponent::StaticClass()利用StaticClass()获取USAttributeComponent的class。之后利用cast强制转换把得到的这个Actor的Component转换为一个局部变量,然后操作这个局部变量调用改变Health的函数ApplyHealthChange()改变该Actor的血量。
image

标签:函数,--,Component,Actor,UPrimitiveComponent,源码,Health
From: https://www.cnblogs.com/XTG111/p/17741761.html

相关文章

  • FastAPI
    FastAPI1.FastAPI简介1.介绍 FastAPI是一个用于构建API快速(高性能)的web框架使用Python3.6+并基于标准的Python类型提示开发快捷性能和NodeJSGO相当并集成SwaggerUI 2.特征 快速:可与NodeJS和Go并肩的极高性能(归功于Starlette和Pydantic)最快的......
  • json.dump()的用法
    一、JSON是什么JSON是用于存储和交换数据的语法。JSON(JavaScriptObjectNotation)最初是用JavaScript对象表示法编写的文本,但随后成为了一种常见格式,被包括Python在内的众多语言采用。python里面的语言对象一般只有python能读懂,为了能比较好储存,而且能够让别的编程语言也能......
  • CS144-lab4
    Checkpoint4Writeup报文头格式IPV4头/**+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*|Version|IHL|TypeofService|TotalLength|*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*|......
  • CF1661D Progressions Covering 题解
    最详细的题解题目传送门:ProgressionsCovering阅读前人题解时,限于个人能力有限,有一些地方想了好一会儿才懂。发现很多题解都是在@SDLTF_凌亭风等作者基础上延伸,但详细程度依旧有限,尽管这篇题解亦是站在他们基础上延伸的,这篇题解更为详细的点明了很多地方。本人第一次写题解,......
  • 2023 ICPC 香港
    gym开场发现E是传统数据结构题很高兴,不过先跳了。F知道相邻两段的长度差\(\le1\),以为最终每段长度只有\(\lfloor\frac{n}{m+1}\rfloor,\lceil\frac{n}{m+1}\rceil\)两种,那就可以DP了,队友签完HA我上去写,呼救两次后WAontest2,gjk说不相邻的两端长度差不一定\(\le1......
  • 162. 寻找峰值
    给你一个整数数组nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设nums[-1]=nums[n]=-∞。你必须实现时间复杂度为O(logn)的算法来解决此问题。示例1:输入:nums=[1,2,3,1]输出:2解释:3是峰值元素,你......
  • 在 WebStorm 里调试 vue3 项目
    官方说明:https://blog.jetbrains.com/webstorm/2018/01/working-with-vue-js-in-webstorm/#:~:text=Wecandebugourapplication,andstartthedebugsession.打开WebStorm编辑器右上角的Configuration的Edit,在URL填入项目的地址并选择想要使用的Brower,点击调试之......
  • vue3 使用 pinia
    安装pinia官网:https://pinia.vuejs.org/pnpmaddpinia使用新建pinia实例//@/store/index.tsimport{createPinia}from"pinia";importuseUserStorefrom"@/store/user.ts";exportuseUserStore;constpinia=createPinia();exportdefault......
  • 水果系统项目分析pro09-fruit1.4-thymelea
    水果系统项目分析pro09-fruit1.4-thymelea基本架构IndexServlet为继承的Servlet容器类ViewBaseServlet为复制的thymelea源代码用来渲染页面index.html为前端界面index.html<htmlxmlns:th="http://www.thymeleaf.org"> <head> <metacharset="utf-8"> &l......
  • 4.Maven配置本地仓库,阿里云远程仓库
    1.配置本地仓库Editmaven安装目录下->conf->settings文件配置<localRepository>D:\myinstall\apache-maven-3.9.4\repository</localRepository>  改地址为本地工作目录 2.配置aliyun中央仓库配置阿里云中央仓库的好处是下载jar包非常快(不配置默认在国外maven中央仓库下......