虚幻蓝图学习笔记 简单VR功能实现

1.创建GameMome, Pawn, Interface, Actor类型蓝图

在接口interface中定义两个方法用来抓取与释放事件,在抓取事件中输入变量组件类型SceneComponent

在Actor蓝图中添加StaticMesh用来显示被抓取的对象加载接口Interfaces->inplemented interfaces并实现抓取与释放方法

在抓取事件中首先取消物理属性Set Simulate Physics ,之后将自己附加在传入的组件上AttachComponentToComponent,

在释放事件上,首先设置物理属性Set SimulatePhysics,之后分离组件DetachFromActor

 2.在手的蓝图类,并添加Skeleta Mesh添加手的模型, 触发器Sphere,Spline样条用来移动线路 ,Arrow设置方向,StaticMesh移动地点显示;

 

3,在pawn蓝图中,添加Camera,并在event BeginPlay事件中创建SpawnActor手,并保持至变量,并把手依附AttachActorToComponent到Camera上

 

4,在Pawn根据输入映射,实现手的移动 方向是根据手的Arrow

Get Forward Vector/Get Right Vector ->AddActor WorldOffset

鼠标X轴->Add controller yaw input

鼠标Y轴-> Add Controller Ritch input

 

5.用鼠标左键控制手Motinoncontroller抓取(GragActor)与释放(ReleaseActor)物品(在手的蓝图中定义的方法)

 

 

6.鼠标右键控制移动,在移动时显示线路Activeteleporter,释放时移动到位置Execte Teleportation,并清除线路ClearArc(Activeteleporter与ClearArc时在手蓝图中创建的方法)

在移动Execte Teleportation中,先设一个变量用来判断是否移动is Teleporting,在判断是否可以移动,

之后把状态同步到手蓝图中DisableTeleport(自定义方法),如果可以移动将移动标记Is Teleporting设置为true

同时设置镜头黑屏过度,GetPlayerCameraManager->StartCameraFade(ToAlpha=1;Duration=0.2) ,并根据手中的位置NavMeshLoaction(用来存储移动位置的变量) 并获取角度GetActorRotation->Teleport; 并恢复镜头效果StartCameraFade,最后设置移动标记IsTeleporting为false

 

 

6,手的蓝图方法实现

在Tick事件中判断是否移动,如果时,清除辅助线C;earArc, 计算抛物线长度TraceTeleportDestination,获取最后目标判断是否有目标, 并将位置记录,并把辅助物体设置到最后StaticMesh->SetWorldLocation,并添加线路UpdateArcSpline,

 1).清除辅助线函数;清空集合中的组件DestroyComponent,并清空集合Clear,清空样条Clear Spline Points

 2)计算抛物线TraceTeleportDestination,使用PredictProjectilePathByObjectTpe

获取Arrow的位置GetWorldLocation->Start Pos/GetForwardVector->Launch Velocity 获取最后一个hit, 并获取导航组件getNavigation System->ProjectPointToNavigation 上的点的位置, 并把值返回出去;

 3)更新Spline的方法UpdateArcSpline

根据计算出点在Spline中添加Point; 完成后, 设置Spline类型SetSplinePointType (CurveClamped) 并遍历添加组件GetNumberOfSplinePoints减2去掉头尾, Add Spline Mesh Component, 并添加到集合中,并获取Get Tangent at Spline Point->Tangent

 4),取消标记 事件DisableTeleport当IsTeleporteractive等于true ,先设置为false, 并把辅助线隐藏

 5)激活标记事件ActiveTeleporter , 设置激活并显示辅助线

6)抓取事件GragActor; 获取在触发器内的ActorGetOverlappingActors  并遍历, 判断是否时可以拿起来的物品,DoesImplementInterface(实现自定义接口的方法) 

并判断它的位置是否小于我们定义的位置,并把长度与它赋值给ArrayElement; 完成后判断ArrayElement是否有效isValid 并调用物品绑定的事件Grab1

 7)是否事件ReleaseActor

判断ArrayElement是否有效IsValid ,并判断是否时手RootComponent->GetAttachParent; 如果时将调用物品的Release , 并清空ArrayElemt ->NearestLength 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/qq964107326/p/15169967.html