当前位置: 首页 > news >正文

做网站需要哪些人才发布做任务网站

做网站需要哪些人才,发布做任务网站,做健康食品的网站,网站logo图怎么做的注#xff1a;1.这个分类是按照源码里的注释分类的 2.本篇是通读并给出一些注释形式的#xff0c;并不涉及结构性的分析 3.看之前要对UE的GAS系统的定义有初步了解 4.因为都是接口函数#xff0c;有些没细看的研究那一部分的时候会细看 1 一些接口函数#xff0c;但是…注1.这个分类是按照源码里的注释分类的 2.本篇是通读并给出一些注释形式的并不涉及结构性的分析 3.看之前要对UE的GAS系统的定义有初步了解 4.因为都是接口函数有些没细看的研究那一部分的时候会细看 1  一些接口函数但是注释说不要直接调用要通过GameplayCueManager调用 // Do not call these functions directly, call the wrappers on GameplayCueManager insteadUFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCueExecuted_FromSpec(const FGameplayEffectSpecForRPC Spec, FPredictionKey PredictionKey) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCueExecuted(const FGameplayTag GameplayCueTag, FPredictionKey PredictionKey, FGameplayEffectContextHandle EffectContext) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCuesExecuted(const FGameplayTagContainer GameplayCueTags, FPredictionKey PredictionKey, FGameplayEffectContextHandle EffectContext) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCueExecuted_WithParams(const FGameplayTag GameplayCueTag, FPredictionKey PredictionKey, FGameplayCueParameters GameplayCueParameters) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCuesExecuted_WithParams(const FGameplayTagContainer GameplayCueTags, FPredictionKey PredictionKey, FGameplayCueParameters GameplayCueParameters) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCueAdded(const FGameplayTag GameplayCueTag, FPredictionKey PredictionKey, FGameplayEffectContextHandle EffectContext) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCueAdded_WithParams(const FGameplayTag GameplayCueTag, FPredictionKey PredictionKey, FGameplayCueParameters Parameters) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCueAddedAndWhileActive_FromSpec(const FGameplayEffectSpecForRPC Spec, FPredictionKey PredictionKey) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCueAddedAndWhileActive_WithParams(const FGameplayTag GameplayCueTag, FPredictionKey PredictionKey, FGameplayCueParameters GameplayCueParameters) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCuesAddedAndWhileActive_WithParams(const FGameplayTagContainer GameplayCueTags, FPredictionKey PredictionKey, FGameplayCueParameters GameplayCueParameters) override; 2 ExecuteGameplayCue相关 注释翻译GameplayCues也可以独立出现这些函数接受一个可选的效果上下文用于传递命中结果等信息 一个是传入GEContextHandle版本的一个是传入FGameplayCueParameters版本的 声明如下 /** GameplayCues can also come on their own. These take an optional effect context to pass through hit result, etc */void ExecuteGameplayCue(const FGameplayTag GameplayCueTag, FGameplayEffectContextHandle EffectContext FGameplayEffectContextHandle());void ExecuteGameplayCue(const FGameplayTag GameplayCueTag, const FGameplayCueParameters GameplayCueParameters); 实现就是调用GameplayCueManager里的函数 void UAbilitySystemComponent::ExecuteGameplayCue(const FGameplayTag GameplayCueTag, FGameplayEffectContextHandle EffectContext) {// Send to the wrapper on the cue managerUAbilitySystemGlobals::Get().GetGameplayCueManager()-InvokeGameplayCueExecuted(this, GameplayCueTag, ScopedPredictionKey, EffectContext); }void UAbilitySystemComponent::ExecuteGameplayCue(const FGameplayTag GameplayCueTag, const FGameplayCueParameters GameplayCueParameters) {// Send to the wrapper on the cue managerUAbilitySystemGlobals::Get().GetGameplayCueManager()-InvokeGameplayCueExecuted_WithParams(this, GameplayCueTag, ScopedPredictionKey, GameplayCueParameters); } 先大致看下实现可以发现逻辑都一样都是先检查有效性再构造FGameplayCuePendingExecute PendingCue,再调用AddPendingCueExecuteInternal唯一不一样的地方就是初始化PendingCue.CueParameters这个参数的方式不一样WithParams版本的很简单就是直接赋值下面去找下InitGameplayCueParameters这个函数里边重点就这一行 CueParameters.EffectContext EffectContext; 这里贴的实现  void UGameplayCueManager::InvokeGameplayCueExecuted(UAbilitySystemComponent* OwningComponent, const FGameplayTag GameplayCueTag, FPredictionKey PredictionKey, FGameplayEffectContextHandle EffectContext) {if (EnableSuppressCuesOnGameplayCueManager OwningComponent OwningComponent-bSuppressGameplayCues){return;}if (OwningComponent){FGameplayCuePendingExecute PendingCue;PendingCue.PayloadType EGameplayCuePayloadType::CueParameters;PendingCue.GameplayCueTags.Add(GameplayCueTag);PendingCue.OwningComponent OwningComponent;UAbilitySystemGlobals::Get().InitGameplayCueParameters(PendingCue.CueParameters, EffectContext);PendingCue.PredictionKey PredictionKey;AddPendingCueExecuteInternal(PendingCue);} }void UGameplayCueManager::InvokeGameplayCueExecuted_WithParams(UAbilitySystemComponent* OwningComponent, const FGameplayTag GameplayCueTag, FPredictionKey PredictionKey, FGameplayCueParameters GameplayCueParameters) {if (EnableSuppressCuesOnGameplayCueManager OwningComponent OwningComponent-bSuppressGameplayCues){return;}if (OwningComponent){FGameplayCuePendingExecute PendingCue;PendingCue.PayloadType EGameplayCuePayloadType::CueParameters;PendingCue.GameplayCueTags.Add(GameplayCueTag);PendingCue.OwningComponent OwningComponent;PendingCue.CueParameters GameplayCueParameters;PendingCue.PredictionKey PredictionKey;AddPendingCueExecuteInternal(PendingCue);} } 顺着思路看AddPendingCueExecuteInternal 发现就是把他加入了执行队列但是没有真正执行 void UGameplayCueManager::AddPendingCueExecuteInternal(FGameplayCuePendingExecute PendingCue) {if (ProcessPendingCueExecute(PendingCue)){PendingExecuteCues.Add(PendingCue);}if (GameplayCueSendContextCount 0){// Not in a context, flush nowFlushPendingCues();} } 再去看FlushPendingCues这个函数 函数体太长了核心就是调用这两个函数 诶惊奇的发现就是前面第一部分里不让你直接调用的接口函数找了一圈RepInterface也是调用接口函数所以最后除了各个函数的条件判断不太一样都是调用的ASC中的InvokeGameplayCueEvent RepInterface-Call_InvokeGameplayCueExecuted_WithParams PendingCue.OwningComponent-InvokeGameplayCueEvent 这里的RepInterface IAbilitySystemReplicationProxyInterface* RepInterface PendingCue.OwningComponent-GetReplicationInterface(); 再顺着看Invoke这个函数发现都调用GameplayCueManager的HandleGameplayCue UAbilitySystemGlobals::Get().GetGameplayCueManager()-HandleGameplayCue GC中的HandleGameplayCue会先将标签翻译然后路由路由中的具体处理 CueSet和Interface调用HandleGameplayCue其中的GameplayCueInterface CastIGameplayCueInterface(TargetActor) // Give the global set a chanceif (bAcceptsCue !(Options EGameplayCueExecutionOptions::IgnoreNotifies)){RuntimeGameplayCueObjectLibrary.CueSet-HandleGameplayCue(TargetActor, GameplayCueTag, EventType, Parameters);}// Use the interface even if its not in the mapif (GameplayCueInterface bAcceptsCue){GameplayCueInterface-HandleGameplayCue(TargetActor, GameplayCueTag, EventType, Parameters);} Interface中的Handle会处理函数列表最后转到默认处理函数子类可以实现 而CueSet中调用这个函数 UGameplayCueSet::HandleGameplayCueNotify_Internal 会分UGameplayCueNotify_Static和AGameplayCueNotify_Actor处理具体逻辑到这就各种信息检索完了进入具体的处理逻辑之后就要进入这两个类里看了这里就不继续看了 3 AddGameplayCue /** Add a persistent gameplay cue */void AddGameplayCue(const FGameplayTag GameplayCueTag, FGameplayEffectContextHandle EffectContext FGameplayEffectContextHandle());void AddGameplayCue(const FGameplayTag GameplayCueTag, const FGameplayCueParameters GameplayCueParameters); 套娃到这里 这个函数大体逻辑 检查是否是服务器 检查是否已经存在该提示避免重复添加 强制网络同步确保客户端能够接收到最新的游戏玩法提示 添加GC到容器 处理混合复制模式根据复制模式调整预测Key 调用RPC播放激活事件通过RPC将游戏玩法提示同步到客户端 触发服务器端事件在服务器端触发 WhileActive 事件 客户端预测逻辑在客户端预测性地添加GC并触发事件 void UAbilitySystemComponent::AddGameplayCue_Internal(const FGameplayTag GameplayCueTag, const FGameplayCueParameters GameplayCueParameters, FActiveGameplayCueContainer GameplayCueContainer) {if (IsOwnerActorAuthoritative()){const bool bWasInList GameplayCueContainer.HasCue(GameplayCueTag);ForceReplication();GameplayCueContainer.AddCue(GameplayCueTag, ScopedPredictionKey, GameplayCueParameters);// For mixed minimal replication mode, we do NOT want the owning client to play the OnActive event through this RPC, since it will get the full replicated // GE in its AGE array. Generate a server-side prediction key for it, which it will look for on the _Implementation function and ignore. (--- Original Hack){FPredictionKey PredictionKeyForRPC ScopedPredictionKey; // Key we send for RPC. Start with the regular old ScopedPredictionKey// Special stuff for mixed replication modeif (ReplicationMode EGameplayEffectReplicationMode::Mixed){if (GameplayCueContainer.bMinimalReplication){// For *replicated to sim proxies only* container, Create a Server Initiated PK to avoid double playing on the auto proxy in mixed replication mode (Original Hack)PredictionKeyForRPC FPredictionKey::CreateNewServerInitiatedKey(this);}else{// For replicated to everyone cue container, we need to clear server replicated prediction keys, or else they will trip the same absorption code that we added for the first hack above.// Its ok to just throw out a server replicated prediction key because (outside of mixed replication mode) it will not affect what the client does in NetMulticast_InvokeGameplayCueAdded_WithParams_Implementation// (E.g, the client only skips the InvokeCall if the key is locally generated, not for server generated ones anways)if (ScopedPredictionKey.IsServerInitiatedKey()){PredictionKeyForRPC FPredictionKey();}}}// Finally, call the RPC to play the OnActive eventif (IAbilitySystemReplicationProxyInterface* ReplicationInterface GetReplicationInterface()){ReplicationInterface-Call_InvokeGameplayCueAdded_WithParams(GameplayCueTag, PredictionKeyForRPC, GameplayCueParameters);}}if (!bWasInList){// Call on server here, clients get it from repnotifyInvokeGameplayCueEvent(GameplayCueTag, EGameplayCueEvent::WhileActive, GameplayCueParameters);}}else if (ScopedPredictionKey.IsLocalClientKey()){GameplayCueContainer.PredictiveAdd(GameplayCueTag, ScopedPredictionKey);// Allow for predictive gameplaycue events? Needs more thoughtInvokeGameplayCueEvent(GameplayCueTag, EGameplayCueEvent::OnActive, GameplayCueParameters);InvokeGameplayCueEvent(GameplayCueTag, EGameplayCueEvent::WhileActive, GameplayCueParameters);} } 4 RemoveGameplayCue /** Remove a persistent gameplay cue */void RemoveGameplayCue(const FGameplayTag GameplayCueTag); 去到了Container里处理Remove这里就不深入了具体研究GC会继续看 void UAbilitySystemComponent::RemoveGameplayCue_Internal(const FGameplayTag GameplayCueTag, FActiveGameplayCueContainer GameplayCueContainer) {if (IsOwnerActorAuthoritative()){GameplayCueContainer.RemoveCue(GameplayCueTag);}else if (ScopedPredictionKey.IsLocalClientKey()){GameplayCueContainer.PredictiveRemove(GameplayCueTag);} } 总结1.以上就是几个关键的函数但都是偏向的都是调用的整体逻辑没有深入具体的实现留坑 2.按着我看的顺序来的并非实际调用顺序
http://www.w-s-a.com/news/278723/

相关文章:

  • 怎样建设网站是什么样的广州做和改版网站的公司
  • 世界网站制作帮助做职业规划的网站
  • wordpress 查看站点ppt素材大全免费图片
  • 网站做弹幕广告有什么兼职做it的网站
  • 什么公司做网站出名广州做外贸网站公司
  • 源码网站取名企业网站怎么做百度
  • 织梦网站如何打通百度小程序深圳网站设计灵点网络品牌
  • 做网站网关备案展厅设计风格
  • 唐山网站建设费用网站title优化
  • 网站建设公司做销售好不好海南在线新闻中心
  • title 镇江网站建设wordpress 获取用户密码
  • 品牌型网站建设wordpress+js插件开发教程
  • 免费注册微信网站国家企业年审营业执照官网
  • 建设银行网站 无法访问东莞淘宝运营
  • 做家电网站做网站美工需要会什么软件
  • 深圳营销型定制网站开发1000建设银行网站特点分析
  • 安装网站系统重庆知名网站
  • 巴彦淖尔市 网站建设怀化北京网站建设
  • 内部网站管理办法建立网站后台
  • 自学考试网站建设与管理郑州网站建设开拓者
  • 宁夏制作网站公司慈溪建设集团网站
  • 国家企业官方网站查询系统站酷设计网站官网入口文字设计
  • 彩票网站开发制作需要什么wordpress连接微博专业版v4.1
  • 孝感建设银行官网站百度一下你就知道啦
  • 做网站如何做视频广告制作公司简介怎么写
  • 做网站 买空间商务网站内容建设包括
  • 萝岗网站建设为什么点不开网站
  • 惠州网站制作询问薇北京网站建设最便宜的公司
  • 注册网站英语怎么说wordpress 3.8.3
  • 甘肃张掖网站建设网站开发软件是什么专业