ue4 rpc php,UE4 RPC在C++中的使用简例

本文解析了AI角色如何在《Tick》中实现冷却计时和开火决策,重点介绍了服务器端的判定逻辑、开火事件与客户端同步。通过CanFire函数和FireServer方法展示了服务器如何控制角色的射击行为及其同步策略。
摘要由CSDN通过智能技术生成

//tick中检测冷却,只在服务器进行

void AAICharacterBase::CheckInterval()

if (HasAuthority() == true && State == EAICharacterState::Normal && CurClipBullet > 0)

if (LastFireTime + FireInterval < UKismetSystemLibrary::GetGameTimeInSeconds(GetWorld()))

bIntervalFinish = true;

//是否可以开火判定

bool AAICharacterBase::CanFire() const

if (State != EAICharacterState::Normal)

return false;

//弹夹中没有子弹

if (CurClipBullet <= 0)

return false;

//是否冷却完毕,该值为Replicated值,由服务器在tick中判定,然后复制给客户端

return bIntervalFinish;

//Fire

void AAICharacterBase::Fire()

//如果可以开火,则调用服务器的开火事件

if (CanFire())

FireServer();

//开火的服务器事件

void AAICharacterBase::FireServer_Implementation()

//只在服务器端记录上次开火事件

LastFireTime = UKismetSystemLibrary::GetGameTimeInSeconds(GetWorld());

bIntervalFinish = false;

if (CurClipBullet > MaxClipBullet)

CurClipBullet = MaxClipBullet;

if (CurClipBullet > 0)

CurClipBullet--;

FRotator FireRotator = GetActorRotation();

//子弹扩散

FireRotator.Yaw += UKismetMathLibrary::RandomFloatInRange(-1.f * DiffuseRadian, DiffuseRadian);

FireRotator.Pitch += UKismetMathLibrary::RandomFloatInRange(-1.f * DiffuseRadian, DiffuseRadian);

//调用开火的多播事件

FireNetwork(FireRotator);

//服务器事件的验证,返回false时候,服务器会把该客户端踢掉

bool AAICharacterBase::FireServer_Validate()

return true;

//开火的多播事件

void AAICharacterBase::FireNetwork_Implementation(FRotator FireRotator)

if (State != EAICharacterState::Normal)

return;

//判定该端是否为专用服,专用服不用表现音效和特效等

if (UKismetSystemLibrary::IsDedicatedServer(GetWorld()) == false)

FireParticle->SetActive(true, true);

FireParticle->SetWorldRotation(FireRotator, false);

//产生子弹

if (ProjectileClass)

FActorSpawnParameters SpawnParams;

SpawnParams.Owner = this;

SpawnParams.Instigator = Instigator;

FVector FireLocation = FireParticle->K2_GetComponentLocation();

AProjectileActor* Projectile = GetWorld()->SpawnActor(ProjectileClass, FireLocation, FireRotator, SpawnParams);

//调用到蓝图,在蓝图中处理一部分开火时候的事件

FireEvent();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值