您的位置:首页 > 编程语言 > C语言/C++

【UE4】【C++】判断是否撞击到物体、从蓝图中获取组件(炮管、炮塔)、根据瞄准的方向进行(角色)旋转

2018-03-06 18:05 2441 查看
先在对应的模型(炮管、枪管)前面加好Socket(FireLocation)作为生成子弹、炮弹的地方



判断是会否会撞击到物体:
导入头文:Kismet/GameplayStatics.h

UGameplayStatics::SuggestProjectileVelocity

Choose your OS:
static bool SuggestProjectileVelocity
(
    const UObject * WorldContextObject,    //this
    FVector & TossVelocity,                //返回速度向量
    FVector StartLocation,                //起点(Socket)GetSocketLocation(FName("FireLocation"))   
    FVector EndLocation,                    //终点
    float TossSpeed,                        //自定义速度
    bool bHighArc,                    
    float CollisionRadius,
    float OverrideGravityZ,
    ESuggestProjVelocityTraceOption::Type TraceOption,
    const FCollisionResponseParams & ResponseParam,
    const TArray < AActor * > & ActorsToIgnore,
    bool bDrawDebug
)返回一个bool值来判断是否会撞击到
事例:bool bHaveSolution = false;
bHaveSolution = UGameplayStatics::SuggestProjectileVelocity(
this,
FireVector,
StartLocation, //起点
HitLocation, //终点
LaunchSpeed, //炮弹速度
false,
0,
0,
ESuggestProjVelocityTraceOption::DoNotTrace
);
if (bHaveSolution) {
UE_LOG(LogTemp, Warning, TEXT("Fire Vector is %s"), *FireVector.GetSafeNormal().ToString());
}                                                            //GetSafeNormal()是将向量转化成单位向量

C++从蓝图中获取组件:

TankAimingComponent.hUCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
UFUNCTION(BlueprintCallable,Category="Setup")
void Initialise(UTankBarrel* BarrelToSet, UTankTurret* TurretToSet);
TankAimingComponent.cppvoid UTankAimingComponent::Initialise(UTankBarrel* BarrelToSet, UTankTurret* TurretToSet) {
Barrel = BarrelToSet;
Turret = TurretToSet;
}编译后可在蓝图中得到对应的TankAiming组件


在事件图表中将蓝图中的组件移到创建的函数Initialise



即可完成从蓝图获取组件
根据移动的方向进行旋转:

先根据上述的方法得到射击的方向(FireLocation)
传递到对应组件新建的函数中(作为AimDirection)void UTankTurret::MoveTurret(FVector AimDirection) {
FRotator CurrentRotation = GetForwardVector().Rotation();   
FRotator AimRotation = AimDirection.Rotation();

float ChangeYaw = AimRotation.Yaw - CurrentRotation.Yaw;    //只用在Yaw方向上旋转

float RelativeSpeed = FMath::Clamp<float>(ChangeYaw, -1, 1);
float RotationChange = RelativeSpeed * MaxDegreePerSecond*GetWorld()->DeltaTimeSeconds; //一帧多少度
float NewRotationYaw = RotationChange + CurrentRotation.Yaw;

SetRelativeRotation(FRotator(0, NewRotationYaw, 0));    
}




因为从170°~190°时,UE4算的是-170°,由上述代码算出来会让组件旋转-170°-170°=-340°
会回头转一大圈,显然不符合我们的要求
所以需要加多一段判断代码 if (ChangeYaw > 180) {
ChangeYaw = ChangeYaw-360;
}
else if (ChangeYaw < -180) {
ChangeYaw = ChangeYaw+360;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  组件旋转 瞄准
相关文章推荐