引擎版本为4.24
需求为:
自己实现一个投掷物类,不能使用UE4自带的ProjectMovementComponent组件。
首先,我想到的是得让我的投掷物,向前飞行呀!
开始实现该功能。
玩家类:
World->SpawnActor<AMyProjectile>(ProjectileClass, SpawnLocation, SpawnRotation, ActorSpawnParams);
这里就是一个生成投掷物类,具体信息去看第一人称模板。需要注意是这里投掷物的旋转是直接使用玩家控制器的旋转。
投掷物飞行函数:
void AMyProjectile::Flying() {
AddActorLocalOffset(GetActorForwardVector()* Velocity);
}
很简单的思路,就是物体使用向前向量乘以速度,添加到本地偏移,通过Tick函数来达到不断的前进的效果。
但是结果却是,很抱歉的,在运行程序后,不转动摄像头时,投掷物会往特定的地点飞行,但是一旦转动摄像头,就会出现飞行方向出现偏差的问题,偏差角度随转动摄像头的角度而定。
经过多次测试之后,发现多出的偏差角度大概是正确角度的一倍左右,就是尝试
在投掷物类中的Begin函数中加入
FRotator TempRotation=GetActorRotation()* 0.5;
SetActorRotation(TempRotation);
意思就是将旋转体除以2,缩小2倍。
由此,基本物体飞行效果达成。
但是,这属于误打误撞搞定的,让我很不高兴。
我便去测试ForwardVector的值,希望它能够给我一个解释。
由此发现,ForwardVector是存在负值的。
如下图所示:
再回去看看我们的飞行函数,结合这张图,你就会发现,例如左边,我们要的旋转0-180度应该是向前向量的X在【0-1】之间取值,而不是旋转0-90度便要在【0-1】之间取值,并且X不能有负值.
由此,我们需要的应该是如下图一样的旋转角度到向前向量X的变换:
所以我们需要将旋转体/2,得到我们要的向前向量X变化。
至于旋转体到向前向量的变换,需要涉及到四元数。
其实四元数就是有(x,y,z,w)四个元素的数据结构,前面的是旋转轴,后面的是旋转量。
如:
初始值: (0,0,0,1)
沿着y轴旋转:180°(0,1,0,0) 360°(0,0,0,-1)540°(0,-1,0,0) 720°(0,0,0,1)
沿着x轴旋转:180°(-1,0,0,0) 360°(0,0,0,-1)540°(1,0,0,0) 720°(0,0,0,1)
四元数部分参考自:
Unity3D中的Quaternion(四元数)