// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "SWeapon.generated.h"
class USkeletalMeshComponent;
UCLASS()
class TSHOOTERGAME_API ASWeapon : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ASWeapon();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
UFUNCTION(BlueprintCallable,Category="Weapon")
void Fire();
UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category="Components")
USkeletalMeshComponent* SkeletalMeshComponent;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "Public/SWeapon.h"
#include <Components/SkeletalMeshComponent.h>
#include "Public/DrawDebugHelpers.h"
// Sets default values
ASWeapon::ASWeapon()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
SkeletalMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("SkeletalMeshComponent"));
RootComponent = SkeletalMeshComponent;
}
// Called when the game starts or when spawned
void ASWeapon::BeginPlay()
{
Super::BeginPlay();
}
void ASWeapon::Fire()
{
AActor* MyOwner = GetOwner();
if (MyOwner)
{
FVector EyeLocation;
FRotator EyeRotation;
//获取眼睛的位置
MyOwner->GetActorEyesViewPoint(EyeLocation, EyeRotation);
FVector EndLocation = EyeLocation + EyeRotation.Vector() * 10000;
FHitResult OutHit;
FCollisionQueryParams Params;
Params.AddIgnoredActor(MyOwner);
Params.AddIgnoredActor(this);
Params.bTraceComplex = true; //设置设置检测会更精确
//射线
//第四个参数 忽略的碰撞(忽略自身)
if (GetWorld()->LineTraceSingleByChannel(OutHit, EyeLocation, EndLocation, ECC_Visibility, Params))
{
//射到了东西
AActor* HitActor = OutHit.GetActor();
}
//第五个参数 是否要持续存在
//第七个参数 优先级
//第八个参数 线的粗度
DrawDebugLine(GetWorld(), EyeLocation, EndLocation, FColor::Red, false,1.0,0,1 );
}
}
// Called every frame
void ASWeapon::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
在Character 中重写 GetPawnViewLocation
//重写父类的函数,把获取眼睛的位置改成获取相机的位置
FVector ASCharacter::GetPawnViewLocation() const
{
if (CameraCom)
{
return CameraCom->GetComponentLocation();
}
return Super::GetPawnViewLocation();
}