【UE4】【C++】判断是否撞击到物体、从蓝图中获取组件(炮管、炮塔)、根据瞄准的方向进行(角色)旋转
2018-03-06 18:05
2441 查看
先在对应的模型(炮管、枪管)前面加好Socket(FireLocation)作为生成子弹、炮弹的地方
判断是会否会撞击到物体:
导入头文:Kismet/GameplayStatics.h
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) )
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;
}
判断是会否会撞击到物体:
导入头文: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;
}
相关文章推荐
- 【UE4】【C++】蓝图添加UI(准心……)、获得准心对准的方向(进行旋转……)
- UE4 蓝图获取LeapMotion Grab Strength 判断是否握拳(Grab Strength)抓取
- 一些有关Android图片的操作,判断方向,旋转,根据uri获取绝对路径,缩放与移动
- android根据坐标获取相应控件,判断点是否在控件上
- UE4----C++调用蓝图类生角色加入场景和用纯C++生成角色加入场景中
- php array 根据value获取key,in_array()判断是否在数组内实例
- 【UE4】【C++】WASD添加力到组件上让整个物体移动(油门Throttle),OnHit移动事件绑定
- 根据weekNo(本周为0,上周为-1,下周为1),week(Calendar.XXX)获取日期,以及根据weekNo和week判断今天是否是该日期
- 利用第三方后期处理材质(PostProcess Material)对物体进行描边【UE4】【C++】
- unity3D基础学习 通过判断鼠标点击的是否是目标物体,物体旋转,滑动滚轮缩放拉近视角
- [置顶] linux 判断是否是合法ip,根据域名获取ip
- 根据系统是否支持自动旋转设置屏幕方向
- 【Unity 3D学习】获取鼠标滑动方向(上下左右)-控制摄像机围绕物体旋转
- Unity 获取物体正前方绕Y轴旋转一定角度后的方向
- c++判断文件是否存在,判断是文件还是目录,获取文件大小,获取程序所在路径
- android 根据apk文件获取包名等信息 已经判断 指定 这个apk 是否安装过
- 如何判断一个C++对象是否在堆栈上(通过VirtualQuery这个API来获取堆栈的起始地址,然后就可以得到答案了),附许多精彩评论
- bootstrap-table复选框默认选中。(从数据库获取到对应的状态进行判断是否为选中状态)
- 类库------对一些字符串进行操作的类1.判断输入是否数字2.截取字符串函数3.过滤输入信息4.生成随机数5.生成验证码图片6.获取汉字第一个拼音7.半角转全角8.全角转半角
- C++ 如何一次性获取用户输入并判断是否为数字?