这个官方案例实现了玩家输入控制前后左右移动,以及如何对Pawn对象进行拓展。
完整的代码及其教学都在虚幻文档中,读者可以点击下方链接进行学习:
玩家输入和Pawn | 虚幻引擎文档 (unrealengine.com)
接下来我将整理我在学习此官方案例中遇到的问题及其我对此官方案例课后作业布置的解决方法。
操作输入函数与Tick的联动
通过对官方案例的学习,不难发现,控制前后左右移动的函数是与Tick相互作用实现的。
而在项目设置中
对于输入绑定来说有Action Mappings(动作映射)和Axis Mappings(轴映射)两种绑定方式
我们再蓝图的实际操作中,可以清晰的知道:Action mappings是触发式的具有间断性,而Axis Mappings则是需要持续读入具有连续性,那么在C++编程中,它们的运作原理是怎么样的呢。
本人觉得,在此官方案例中区别不大。
在案例中,为动作映射的操作--控制物体缩放,仅仅只是改变了一个设在类函数中的bool变量值
而为轴映射的操作--物体的移动,也是通过调用轴值改变了设在类函数中的FVector值。
具体如下:
定义在Pawn类中的两个变量
可以说,Axis Mappings通过与Tick相互作用实现了持续性的效果而此案例中的Action Mappings通过与Tick相互作用实现了某种持续性效果的瞬间改变。
其代码如下:
//动作映射实现,缩放控制
float CurrentScale = OurVisibleComponent->GetComponentScale().X;
if (bGrowing)
{
CurrentScale += DeltaTime;
}
else
{
CurrentScale -= (DeltaTime * 0.5f);
}
CurrentScale = FMath::Clamp(CurrentScale, 1.0f, 2.0f);
OurVisibleComponent->SetWorldScale3D(FVector(CurrentScale));
//轴映射实现,物体运动
if (!CurrentVelocity.IsZero())
{
FVector NewLocation = GetActorLocation() + (CurrentVelocity * DeltaTime);
SetActorLocation(NewLocation);
}
上述代码均在Tick函数中实现
对于轴映射的解释如下:只要CurrentVelocity不是0,那么就对物体位置每帧更新,而CurrentVelocity正是通过玩家输入Axis值来改变的。
那么,是不是应该减少轴映射的操作来进行性能上的优化呢?
这是我在研究轴映射中遇到的一个小小问题,欢迎评论区大佬在下方解答。
而动作映射的操作就是改变bool对后续的持续状态进行修改,即物体要么缩放至2倍,要么缩小至0.5倍,这里就不过多赘述,因为动作映射大多不是持续状态的改变,比如按下某个键播放开火、挥刀、跳跃动画等。
Clamp()函数
这个函数用来限制数的大小范围
“Clamps X to be between Min and Max, inclusive”
对于轴映射的某些操作是有帮助的
假如在某种情况下,轴值突破了-1到1的限制,而我们只想要-1到1的效果,我们仅需使用Clamp函数就能实现值的限制操作:
template
static T Clamp
(
const T X,
const T Min,
const T Max
)
比如向前移动有W键,↑方向键,同时摁的话会不会突破至2.0呢?(笔者并没有亲自尝试过-.-)
如下为控制移动的函数代码段:
void AMyPawn::Move_XAxis(float AxisValue)
{
//以100单位/秒的速度向前或向后移动
CurrentVelocity.X = FMath::Clamp(AxisValue, -1.0f, 1.0f) * 100.0f;
}
Min = -1.0f,Max = 1.0f
好了,今天的总结到此结束,欢迎大家在评论区讨论指出我的不足之处。