UE-c++ Class

一. Class介绍

虚幻引擎每个游戏性类由一个类头文件(.h)和一个类源文件(.cpp)构成。

类头文件包含类和类成员(如变量和函数)的声明,类源文件包含对应的实现。

二. Class命名

  • A 继承自AActor,可以直接生成到场景中的物体。
  • U 继承自UObject,可以附加到Actor,无法直接生成到场景。

三. Class生成

1. 添加类

引擎的C++类向导可以直接生成新类所需要的头文件和源文件,并随之更新游戏模板。自动生成的代码包含类声明,类构造函数,常用函数及引擎专有代码,例如 UCLASS()宏 。

2. 类头文件

引擎中的游戏性类通常具有单独且唯一的类头文件,这些文件的命名与其中定义的类相匹配,减去A/U前缀,并加上.h文件扩展名,如AActor类的头文件命名为 Actor.h。

类头文件使用标准C++语法,并结合专门的宏,简化类,变量和函数的声明过程。

所以在头文件的顶端,需要包含生成的特定头文件,因为方便反射工作的进行,必须包含在所有引入头文件的最后。

	#include "ClassName.generated.h"

3. 类的声明

类声明基于标准C++的类申明。

类声明定义类的名称,类的父类,需要的变量和函数。此外,还通过特定的 类说明符和元数据宏 实现特定的引擎和编辑器行为。 包含UCLASS()宏和GENERATED_BODY()宏,前者定义在类之前,后者定义在类内的最前面。

	//Class
	UCLASS([specifier,specifier,...],[meta=(key=value,key=value,...)])
	class ClassName : public ParentName {
		GENERATED_BODY()
		public:
	};

4. 类的实现

源文件(.cpp)必须包含 C++ 类声明的头文件(.h),C++ 类声明通常为引擎自动生成,但也可手动生成(如有必要)。

5. 类构造函数

类构造函数用于设置属性和其他变量的默认值,并执行其他必要的初值设定。

类构造函数通常放置在类实现文件中,也可以将构造函数内联放置在类头文件中。然而,如果构造函数在类头文件中,UClass 必须结合 CustomConstructor 说明符进行声明,因为这阻止了自动代码生成器在标头中创建构造函数声明。

	/* ALearnDeepData Class can be replaced 
	 * with any class type
	 */
	//Default constructor
	ALearnDeepData::ALearnDeepData();
	
	//Secondary constructor, supporting a special parameter
	ALearnDeepData::ALearnDeepData(const FObjectInitializer&ObjectInitializer);
protected:

6. 类静态助手(类和资源引用)

为更负责的数据类型设置数值(尤其是类引用、命名和资源引用)时,需要在构造函数中定义并实例化一个 ConstructorStatics 结构体,以保存所需的诸多属性数值。

	ALearnDeepData::ALearnDeepData(const FObjectInitializer& ObjectInitializer):Super(ObjectInitializer) {
		//Initialize the ClassDefaultObject(CDO) property here
		/* Static guarantees that a resource or class
		 * is loaded only once
		 */ 
		struct FConstructStatics {
			//Resource reference
			ConstructorHelpers::FObjectFinder<UStaticMesh>DiyObject;
			//Class reference
			ConstructorHelpers::FClassFinder<UNetConnection>DiyClass;
			FConstructStatics(){
				DiyObject=ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("Your file path"));
				DiyClass=ConstructorHelpers::FClassFinder<UNetConnection>(TEXT("Your file path"));
			}
		};
		static FConstructStatics ConstructStatics;
		//Your properties can be initialized using the structure above
		//ConstructStatics.DiyObject.Object;
		//ConstructStatics.DiyClass.Class;
    }

在构造函数中还可创建组件子对象并将其附着到 actor 的层级。生成一个 actor 时,将从 CDO 复制其组件。为确保组件固定被创建、被销毁和被正确地垃圾回收,构建函数中创建的每个组件的指针应被存储在拥有类的一个 UPROPERTY 中。
.h文件

	protected:
		UPROPERTY()
		UStaticMeshComponent*StaticMesh;

.cpp文件

	ALearnDeepData::ALearnDeepData() {
		//Initialize the ClassDefaultObject(CDO) property here
		/* For resources or classes that do not
		 * require path references(without cross-modules)
		 * You can use StaticClass()
		 */ 
		StaticMesh=Cast<UStaticMeshComponent>(UStaticMeshComponent::StaticClass());
		//Can directly create
		StaticMesh=CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Your diy name"));
		//Add the loaded resource to the component
		if (RootComponent==nullptr) {
			RootComponent=StaticMesh;
		}else {
			const FAttachmentTransformRules Rules(EAttachmentRule::KeepRelative,false);
			StaticMesh->AttachToComponent(RootComponent,Rules);
		}
    }

四. Class的反射

反射机制

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UE5 C++中实现枪发射子弹的过程下[^1]: 1. 创建子弹类:首先,需要创建一个子弹类,可以继承自UE4的AActor类。在子弹类中,可以定义子弹的属性和行为,例如速度、伤害等。 *** 3. 射击逻辑:在枪类中,实现射击逻辑。当玩家按下射击按钮时,创建一个子弹实例,并设置其初始位置和速度。可以使用UE4提供的函数来控制子弹的运动。 4. 碰撞检测:为了让子弹能够与其他物体发生碰撞,需要在子弹类中添加碰撞组件,并设置碰撞通道。可以使用UE4提供的碰撞检测函数来检测子弹与其他物体的碰撞。 5. 爆炸效果:当子弹与物体发生碰撞时,可以在碰撞事件中创建一个爆炸效果,并播放相应的特效和声音。可以使用UE4提供的粒子系统和音频组件来实现爆炸效果。 6. 子弹销毁:当子弹与物体发生碰撞后,需要将子弹销毁,以释放资源和减少性能开销。可以使用UE4提供的函数来销毁子弹实例。 下面是一个示例代码,演示了如何在UE5 C++中实现枪发射子弹的过程: ```cpp // 子弹类 class ABullet : public AActor { // 子弹属性和行为的定义 }; // 枪类 class AGun : public AActor { // 枪属性和行为的定义 // 射击逻辑 void Shoot() { // 创建子弹实例 ABullet* Bullet = GetWorld()->SpawnActor<ABullet>(BulletClass, GetActorLocation(), GetActorRotation()); // 设置子弹的初始位置和速度 Bullet->SetActorLocationAndRotation(GetMuzzleLocation(), GetMuzzleRotation()); Bullet->SetVelocity(GetMuzzleDirection() * BulletSpeed); } // 碰撞检测 void OnBulletHit(ABullet* Bullet, AActor* OtherActor) { // 判断碰撞的物体是否是发射子弹的人(自己) if (OtherActor != GetOwner()) { // 创建爆炸效果 UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), ExplosionEffect, Bullet->GetActorLocation()); UGameplayStatics::PlaySoundAtLocation(GetWorld(), ExplosionSound, Bullet->GetActorLocation()); // 销毁子弹 Bullet->Destroy(); } } }; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值