定义一个函数,实现跟踪准星
UFUNCTION(BlueprintCallable, Category = "Weapon")
void Fire();
导入头文件
#include "Engine/World.h"
#include "DrawDebugHelpers.h"
定义方法
void ASWeapen::Fire()
{
//创建一个撞击句柄,用来获取弹道相关信息
FHitResult Hit;
//弹道的起点,我们设置为角色眼睛的位置
AActor * MyOwner = GetOwner();
if (MyOwner)
{
FVector EyeLocation;
FRotator EyeRotator;
//得到眼睛的位置和角度
MyOwner->GetActorEyesViewPoint(EyeLocation,EyeRotator);
//弹道的终点就是起点+方向*10000
FVector TraceEnd = EyeLocation + (EyeRotator.Vector() * 1000);
//设置碰撞通道为可见性通道
FCollisionQueryParams QueryParams;
//让射线忽略玩家和枪
QueryParams.AddIgnoredActor(MyOwner);
QueryParams.AddIgnoredActor(this);
//符合追踪设为true,可以让射击更加精准
QueryParams.bTraceComplex = true;
//在创建一个单轨迹线来计算弹道
if (GetWorld()->LineTraceSingleByChannel(Hit, EyeLocation, TraceEnd, ECC_Visibility, QueryParams))
{
}
DrawDebugLine(GetWorld(), EyeLocation, TraceEnd, FColor::Red, false, 1, 0, 1);
}
}
将自身赋值到owner
将生成的枪actor变成变量
按鼠标左键调用rifle变量的方法
此时效果
现在我们进一步优化,我们希望弹道出发点是从摄像机开始
所以我们要覆写相关函数
眼睛高度的含义就是箭头上方,距离64的位置
我们现在在角色类中覆写GetPawnViewLocation函数
virtual FVector GetPawnViewLocation() const override;
定义一下函数
FVector ASCharacter::GetPawnViewLocation() const
{
//如果有相机就得到摄像机的位置
if (CameraComp)
{
return CameraComp->GetComponentLocation();
}
//如果没有相机就用父类的方法
return Super::GetPawnViewLocation();
}
效果