uclass_extends继承引擎类函数
启用该功能后,UE编辑器可以识别能够实现特定写法的类
node enable_puerts_module.js
比如这样一个类:
import * as UE from 'ue'
class TS_Player extends UE.Character {
}
export default TS_Player;
之后你可以在UE编辑器中选择它
class TS_Player extends UE.Character {
FpsCamera: UE.CameraComponent;
//...
Constructor() {
let FpsCamera = this.CreateDefaultSubobjectGeneric<UE.CameraComponent>("FpsCamera", UE.CameraComponent.StaticClass());
FpsCamera.SetupAttachment(this.CapsuleComponent, "FpsCamera");
//...
}
MoveForward(axisValue: number): void {
this.AddMovementInput(this.GetActorForwardVector(), axisValue, false);
}
MoveRight(axisValue: number): void {
this.AddMovementInput(this.GetActorRightVector(), axisValue, false);
}
ReceiveBeginPlay(): void {
//...
}
格式
一个TypeScript满足以下三点,一个类就可以被UE编辑器识别
限制相对命令行
UE命令行输入命令,查看内部状态,自动触发特定typescript文件的编译
puertscompileid,其中id是puertsls返回的id,反例:生命周期
该模式下,继承UE类型的TypeScript类型对象的生命周期由引擎管理。
例如下面的情况:
let obj = getsomeobject();
setTimeout(() => {
console.log(obj.XXX);
}, 1000);
obj 对象是通过闭包引用的。 如果obj是普通的UE对象typescript 构造函数,puerts会为obj添加强引用。 如果是继承UE类型的TypeScript类型对象,则不会添加任何引用。
构造函数
与标准的TypeScript构造函数不同,从引擎类模式继承并由UE初始化调用的构造函数首字母需要小写,即Constructor
class TsTestActor extends UE.Actor {
tickCount: number;
//注意,继承UE类的js类,构造函数必须大写开头
Constructor() {
this.PrimaryActorTick.bCanEverTick = true;
tickCount = 0;
}
}
目前不支持在 Actor 的构造函数中更改 Component 的属性,因为 SpawnActor 构造对象后typescript 构造函数,会对 Component 进行重置:构造函数将 Component 属性设置为无效并启用 AsyncLoadingThreadEnabled 后, CreateDefaultSubobject不能在Constructor中调用,否则Constructor会被延迟调用后,CreateDefaultSubobject会报错,因为构造时不再调用
只有使用继承引擎类模式支持的类型声明的数组和方法才能被UE识别
直接映射类型
void、number、string、bigint、boolean、UE模块下的UObject派生类、枚举、UStruct、TArray、TSet、TMap、TSubclassOf(类引用)、TSoftObjectPtr(软对象引用)、TSoftClassPtr(软类引用)
注意:返回类型声明为void的函数意味着它没有返回值。 如果函数没有声明返回类型,则相当于返回任意类型,手动模式不支持任意类型。
以下是一些数组和技巧的示例:
class TsTestActor extends UE.Actor {
tickCount: number;
actor: UE.Actor;
map: UE.TMap<string, number>;
arr: UE.TArray<UE.Object>;
set: UE.TSet<string>;
Add(a: number, b: number): number {
return a + b;
}
e: UE.ETickingGroup;
clsOfWidget: UE.TSubclassOf<UE.Widget>;
softObject: UE.TSoftObjectPtr<UE.Actor>;
softClass: UE.TSoftClassPtr<UE.Actor>;
}
类型注释
TypeScript 和 UE 之间数据类型的丰富程度不同,因此两者不一一对应。 比如UE中的byte、int、float对应的是TypeScript的个数,那么我们如何告诉puerts生成我们需要的类型呢? 呢绒? Puerts提供了类型注解,如下:
class TsTestActor extends UE.Actor {
//@cpp:text
Foo(): string {
return "hello";
}
Bar(p1:number/*@cpp:int*/): void {
}
//@cpp:name
Field: string;
}
其他注意事项
不仅是类型注解,puerts还支持其他注解
表示UE编辑器无法识别,技术和数组都可用
class TsTestActor extends UE.Actor {
//@no-blueprint
TsOnlyMethod():void {
}
//@no-blueprint
TsOnlyField: number;
}
远程过程调用
方法和字段的RPC属性可以通过装饰器来设置。
注意:TypeScript 的装饰器默认不启用,需要在 tsconfig.json 中将experimentalDecorators属性设置为true
主键,通过方式设置标志
设置数组的复制条件
class TsTestActor extends UE.Actor {
@rpc.flags(rpc.PropertyFlags.CPF_Net | rpc.PropertyFlags.CPF_RepNotify)
@rpc.condition(rpc.ELifetimeCondition.COND_InitialOrOwner)
dint: number;
@rpc.flags(rpc.FunctionFlags.FUNC_Net | rpc.FunctionFlags.FUNC_NetClient)
Fire(): void {
}
@rpc.flags(rpc.FunctionFlags.FUNC_Net | rpc.FunctionFlags.FUNC_NetServer | rpc.FunctionFlags.FUNC_NetReliable)
FireServer(): void {
}
//如果字段设置了CPF_RepNotify,需要增加“OnRep_字段名”为名字的方法
OnRep_dint(): void {
}
}
发表评论