模仿绝地求生按住Alt自由视角,本篇文章使用RInterp(插值)实现视角的线性回弹效果。
Demo下载
完整蓝图节点预览
只需要创建一个变量
说明
最主要的是一个继承自Pawn的bool值bUseControllerRotationYaw,这个值在Pawn中默认为false,而在Character中默认为true。
这个值的C++定义如下:
不管它的类型为uint32(为什么使用uint32替代bool),我们只需要把它看成bool类型就可以了。
这个值将会确定是否由PlayerController掌控所控制Pawn的旋转Yaw轴(Roll,Pitch同理)。
在USpringArmComponent或UCameraComponent中也有类似的值,
如果为真将交给PlayerController掌控,并且手动设置旋转值将无效(你打印出来是成功了的,但是会在稍后由Controller的Tick所更新为ControllerRotation的值),但是如果Character的一个或多个轴被掌控(bUseControllerRotationYaw或其他),那么这个轴将不会下放至控制USpringArmComponent或UCameraComponent,将由自己(self)所控制。
我们将使用AddControllerRotation实现鼠标的输入
---------------------------------------
我们在左Alt被按下时取消由Controller掌控Character的旋转,下放至SpringArmComponent(摄像机摇臂)被Controller控制。鼠标的输入事件由SpringArm响应,实现摄像机旋转而Character不跟着旋转。并在最后重设Reset为false,避免在Alt快速连按时,Tick事件未及时更新。
在Alt松开时将Reset设为真,其作用是在Tick中是否将摄像机重置为角色的正前方的判断。
在Reset为true的时候我们判断摄像机是否已经朝向角色的正前方了(那根从图片外面连接进来的红线),
· 如果已经朝向正前方了,那我们将Reset设为false(下一帧Tick将不会再执行了),并把Character旋转的Yaw轴交由Controller掌控更新。
·如果没有朝向正前方,那我们更新设置ControllerRotation的值(当前Controller掌控更新的是SpringArm,实则设置的是SpringArm的旋转值)。在这里我们将使用 插值 来实现线性的回弹效果。
DeltaTime是上次Tick耗时。
判断摄像机是否与角色的朝向一致:
接下来就是鼠标事件的输入: