修改射线类型
更改了昨天的射线类型
void USInteractionComponent::PrimaryInteract() { //射线 FHitResult FHit; //碰撞体 FCollisionObjectQueryParams ObjectQueryParams; ObjectQueryParams.AddObjectTypesToQuery(ECC_WorldDynamic); //获得Actor的所有者 AActor* MyOwner = GetOwner(); FVector Eyelocation; FRotator EyeRotator; //获得Actor所有者的眼睛位置 MyOwner->GetActorEyesViewPoint(Eyelocation,EyeRotator); //设置射线发射位置和结束位置 FVector End = Eyelocation + (EyeRotator.Vector() * 1000); // bool bBlockingHit = GetWorld()->LineTraceSingleByObjectType(FHit,Eyelocation,End,ObjectQueryParams); //发射出射线,射中目标的时候为绿色,未射中的时候为红色 TArray<FHitResult> Hits;//将Hit获得的对象转化为数组 //绘制一个球体 float Radius = 30.0f; FCollisionShape Shape; Shape.SetSphere(Radius); //发射射线 bool bBlockingHit = GetWorld()->SweepMultiByObjectType(Hits,Eyelocation,End,FQuat::Identity,ObjectQueryParams,Shape); //设置Debug射线的颜色 FColor LineColor = bBlockingHit ? FColor::Green : FColor::Red; //for循环,将射线射中的Actor类提取出来 for(FHitResult Hit:Hits) { AActor* HitActor = FHit.GetActor(); if(HitActor) { GEngine->AddOnScreenDebugMessage(-1, 1.f, FColor::Green, FString::Printf(TEXT("HitActor")));//输出调试信息 if(HitActor->Implements<USGameplayInterface>()) { GEngine->AddOnScreenDebugMessage(-1, 1.f, FColor::Green, FString::Printf(TEXT("Implements")));//输出调试信 APawn* MyPawn = Cast<APawn>(MyOwner); ISGameplayInterface::Execute_Interact(HitActor,MyPawn); } } //Debug射线的发射 DrawDebugSphere(GetWorld(),Hit.ImpactPoint,Radius,32,LineColor,false,2.0f); } DrawDebugLine(GetWorld(),Eyelocation,End,LineColor,false,1,0,5); }
在角色内添加蒙太奇
在.h文件内添加
//添加一个动画蒙太奇 UPROPERTY(EditAnywhere, Category="Attack") UAnimMontage* AttackAnim; //定时器 FTimerHandle TimeHandle_PrimaryAttack;
以及一个void
void PrimaryAttack_TimeElapsed();
在.cpp内修改Attack
void ASCharacter::PrimaryAttack() { //动画蒙太奇 PlayAnimMontage(AttackAnim); //设置定时器 GetWorldTimerManager().SetTimer(TimeHandle_PrimaryAttack, this,&ASCharacter::PrimaryAttack_TimeElapsed,0.2f); //GetWorldTimerManager().ClearTimer(TimeHandle_PrimaryAttack);//清除定时器 }
void ASCharacter::PrimaryAttack_TimeElapsed() { //触发函数的时候从手部位置生成一个魔法球的模型 FVector HandLocation = GetMesh()->GetSocketLocation("Muzzle_01"); FTransform SpawnTM = FTransform(GetControlRotation(),HandLocation); FActorSpawnParameters SpawnParams; SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; GetWorld()->SpawnActor<AActor>(ProjectileClass,SpawnTM,SpawnParams); }
蓝图控制旋转
在Sitem也就是宝箱的.h函数中修改.h文件为
UPROPERTY(VisibleAnywhere,BlueprintReadOnly) UStaticMeshComponent* LidMesh;
意思是暴露给蓝图使用
添加宝箱蓝图
并且把Particle下的autoActivate关闭
修改碰撞预设
修改子弹蓝图
蓝图相关都是很简单的小功能,不再做笔记