UE C++ 实现传送门效果

一,创建传送门类

1,传送门的组件类

因为传送功能需要两个传送门来实现,所以这里传送门定义成Component类型方便在其他actor中进行管理

新建一个类,继承自USceneComponent,成员包括:

1)UStaticMeshComponent* doorMesh   门框模型

2)UStaticMeshComponent* innerMesh;  一个在门内的面片,用于展示另一个门后的场景

3)UBoxComponent* transBox;  用于与玩家之间的碰撞检测

传送功能我放到了自定义的Actor类中实现了,所以该类不需要成员函数。

2,传送门的Actor类

该类负责传送逻辑的具体实现,所以需要包含两个上述定义的传送门组件类,具体成员包括:

1)UTransDoorComp* door1,door2;   两个传送门组件,和玩家进行交互

2)USceneCaptureComponent2D* capture;   场景捕获组件,用于制作另一个门的门后场景

3)UMaterialInstance* DynamicMaterial1, DynamicMaterial2; 两个材质实例,用于传送门组件中的innerMesh,一个是全透明的材质,一个是显示另一个门的门后场景(因为通常传送门玩家只能看到一个,所以另一个这里直接使用透明的材质)

创建自定义的类后,在类的构造函数中使用CreateDefaultSubobject 方法给对应成员分配内存,然后重新编译一下工程。

在资源浏览器all的目录下有一个C++类目录,在里面找到刚刚创建的传送门Actor类,拖到场景中(两个门可能会在(0,0,0)位置创建)

二,门后场景材质实现

1)在内容浏览器中创建一个TexetureRenderTarget2D对象(右键-》纹理中能找到)长宽与显示窗口保持一致(关系到后面的采样纹理坐标)

2)将步骤1中的对象拖入传送门的Actor类中的capture成员对应的槽中

3)在内容浏览器中创建两个材质,一个设置成全透明,另一个在材质编辑器中设置成表面材质,不透明,无光照;

然后使用使用TextureSample对步骤1的对象进行采样;

使用ScreenAlignedUVs方法获取该像素对应屏幕的采样纹理,这里需要TexetureRenderTarget2D对象和屏幕尺寸保持一致,不然门后的场景会产生偏移。

4)在BeginPlay中,用 LoadObject<UMaterialInterface> 导入材质并使用UKismetMaterialLibrary::CreateDynamicMaterialInstance创建动态材质实例,赋值给 DynamicMaterial1, DynamicMaterial2。

三,传送逻辑实现

1)在自定义的Actor类中的BeginPlay函数里,根据玩家当前看到的是哪个传送门组件,给该组件的innerMesh赋上门后场景材质,另一个组件的innerMesh赋上透明材质

2)在Tick函数中,如果当前玩家看到的是door1,记录玩家相对与door1的位置,并将capture移动到door2的该相对位置上(door1->GetComponentTransform().InverseTransformPosition可以将绝对位置转换为相对位置);旋转的变换同理(旋转的绝对位置转换为相对位置需要用四元数,这里要转换一下)

3)实现组件类中transBox的OnComponentBeginOverlap和OnComponentEndOverlap

OnComponentBeginOverlap:

如果玩家和door1重叠,先检查door1传送功能是否可用(这个在EndOverlap中转换),可用则把玩家传送到door2位置处,并将材质和Tick中的操作对象反转

OnComponentEndOverlap:

如果玩家和door2结束重叠,则标记door2可用于传送(这个是因为玩家传送到door2后会立刻和door2重叠,不加判断的会又会返回door1,再传送到door2)

可以使用addDynamic 委托的方式实现碰撞检测方法,比如

door1->transBox->OnComponentBeginOverlap.AddDynamic(this, &AtransDoor::OnHitDoor1);

四,效果展示
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值