UE4【C++】【播放声音、特效、伤害、子弹、蒙太奇动作】

if (IsAmmoEmpty && !IsReloading)
	{
		//Play Empty Sound
		USoundBase* EmptyAmmoSound = MuzzleConfig.EmptyAmmoSound.Get();
		if (!IsValid(EmptyAmmoSound))
		{
			EmptyAmmoSound = MuzzleConfig.EmptyAmmoSound.LoadSynchronous();
		}
		UGameplayStatics::PlaySoundAtLocation(GetWorld(), EmptyAmmoSound, PistolMeshRef->GetComponentLocation());

		//Play Anim Montage
		UAnimMontage* EmptyAmmoMontage = UUtilFunctionLibrary::GetAnimMontageFromAssetID(MuzzleConfig.EmptyAmmoMontage);
		UAnimInstance* PistolAnim = PistolMeshRef->GetAnimInstance();
		if (IsValid(PistolAnim))
		{
			if (PistolAnim->Montage_IsActive(EmptyAmmoMontage))
			{
				PistolAnim->Montage_SetPlayRate(EmptyAmmoMontage, 1.0f);

				if (false == PistolAnim->Montage_IsPlaying(EmptyAmmoMontage))
				{
					PistolAnim->Montage_Resume(EmptyAmmoMontage);
				}
			}
			else
			{
				FAlphaBlend AlphaBlend;
				AlphaBlend.SetBlendTime(0.2f);
				AlphaBlend.SetBlendOption(EAlphaBlendOption::Linear);
				EmptyAmmoMontage->BlendIn = AlphaBlend;
				EmptyAmmoMontage->BlendOut = AlphaBlend;
				float AnimMontageSecond = PistolAnim->Montage_Play(EmptyAmmoMontage);
			}
		}
		return;
	}
	if (!IsShootDelayComplete || IsReloading)
	{
		return;
	}
	FLatentActionInfo LatentActionInfo;
	LatentActionInfo.ExecutionFunction = FName("ShootingDelay");
	LatentActionInfo.CallbackTarget = this;
	LatentActionInfo.UUID = 2;
	LatentActionInfo.Linkage = 0;
	UKismetSystemLibrary::Delay(GetWorld(), MuzzleConfig.FireDelay, LatentActionInfo);
	IsShootDelayComplete = false;
	LeftAmmoNum -= 1;
	SetLeftAmmoValue(LeftAmmoNum, TotalAmmoNum);
	if (IsShootState)
	{
		//Emitter Muzzle Fx
		UParticleSystem* ShootFx = MuzzleConfig.ShootFx.Get();
		if (!IsValid(ShootFx))
		{
			ShootFx = MuzzleConfig.ShootFx.LoadSynchronous();
		}
		UGameplayStatics::SpawnEmitterAttached(ShootFx, PistolMeshRef, "Muzzle", FVector::ZeroVector, FRotator::ZeroRotator, EAttachLocation::KeepRelativeOffset);
		
		//Play Shell Fx
		UParticleSystem* ShellFx = MuzzleConfig.ShellFx.Get();
		if (!IsValid(ShellFx))
		{
			ShellFx = MuzzleConfig.ShellFx.LoadSynchronous();
		}
		UGameplayStatics::SpawnEmitterAttached(ShellFx, PistolMeshRef, "Shells", FVector::ZeroVector, FRotator::ZeroRotator, EAttachLocation::KeepRelativeOffset);

		//Play Shoot Sound
		USoundBase* ShootSound = MuzzleConfig.ShootSound.Get();
		if (!IsValid(ShootSound))
		{
			ShootSound = MuzzleConfig.ShootSound.LoadSynchronous();
		}
		UGameplayStatics::PlaySoundAtLocation(GetWorld(), ShootSound, PistolMeshRef->GetComponentLocation());

		//Play Shell Sound
		USoundBase* ShellSound = MuzzleConfig.ShellSound.Get();
		if (!IsValid(ShellSound))
		{
			ShellSound = MuzzleConfig.ShootSound.LoadSynchronous();
		}
		UGameplayStatics::PlaySoundAtLocation(GetWorld(), ShellSound, PistolMeshRef->GetComponentLocation());

		//Apply Damage
		FHitResult  hitResult(ForceInit);
		FVector start = FirstPersonCamera->GetComponentLocation();
		FVector end = start + FirstPersonCamera->GetForwardVector() * 1000000.0f;
		FCollisionQueryParams TraceParams;
		TraceParams.bTraceComplex = false;
		TraceParams.AddIgnoredActor(this);
		bool hit = GetWorld()->LineTraceSingleByChannel(hitResult, start, end, ECC_GameTraceChannel2, TraceParams);
		if (hit)
		{
			AActor* hitActor = hitResult.Actor.Get();
			if (IsValid(hitActor))
			{
				UGameplayStatics::ApplyDamage(hitActor, 1.0f, HostController, this, UDamageType::StaticClass());
			}
		}

		//Spawn Projectile
		USkeletalMeshSocket const* BoneSocket = PistolMeshRef->GetSocketByName("Muzzle");
		if (IsValid(BoneSocket))
		{
			UClass* ProjectileClass = UFLUtils::LoadClassEx<UClass>("/Game/ThirdContent/MPS_V2/Game/Blueprints/Projectile_BP.Projectile_BP_C");
			if (IsValid(ProjectileClass))
			{
				FTransform BoneTrans = BoneSocket->GetSocketTransform(PistolMeshRef);
				FQuat Quat = BoneTrans.GetRotation();
				FRotator Rotation = Quat.Rotator();
				float Pitch = FirstPersonCamera->GetComponentRotation().Pitch;
				FVector Forward = FirstPersonCamera->GetForwardVector();
				Rotation = Forward.Rotation();
				AActor* Projectile = SCPGAMEINSTANCE(this)->GetWorld()->SpawnActor<AActor>(ProjectileClass, BoneTrans.GetLocation(), Rotation);
			}
		}

		//Play Anim Montage
		UAnimMontage* ShootMontage = UUtilFunctionLibrary::GetAnimMontageFromAssetID(MuzzleConfig.ShootMontage);
		UAnimInstance* PistolAnim = PistolMeshRef->GetAnimInstance();
		if (IsValid(PistolAnim))
		{
			if (PistolAnim->Montage_IsActive(ShootMontage))
			{
				PistolAnim->Montage_SetPlayRate(ShootMontage, 1.0f);

				if (false == PistolAnim->Montage_IsPlaying(ShootMontage))
				{
					PistolAnim->Montage_Resume(ShootMontage);
				}
			}
			else
			{
				FAlphaBlend AlphaBlend;
				AlphaBlend.SetBlendTime(0.2f);
				AlphaBlend.SetBlendOption(EAlphaBlendOption::Linear);
				ShootMontage->BlendIn = AlphaBlend;
				ShootMontage->BlendOut = AlphaBlend;
				float AnimMontageSecond = PistolAnim->Montage_Play(ShootMontage);
			}
		}
		if (MuzzleConfig.CameraShakeEffect.Num() > 0)
		{
			CameraShake(ShootShake, MuzzleConfig.CameraShakeEffect[0], 1.0f);
		}		
	}

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值