typescript 构造函数-PUER打字稿

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 构造函数_构造函数的作用是什么_构造函数何时被调用

格式

一个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;
}
}

typescript 构造函数_构造函数何时被调用_构造函数的作用是什么

目前不支持在 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的函数意味着它没有返回值。 如果函数没有声明返回类型,则相当于返回任意类型,手动模式不支持任意类型。

以下是一些数组和技巧的示例:

typescript 构造函数_构造函数的作用是什么_构造函数何时被调用

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 {

}
}