
整条链路如下:一、核心设计目标实现玩家攻击 → 敌人受击的完整链路接口与业务逻辑分离蓝图 / C 双向兼容变量全私有仅通过Set/Get访问数据安全可控死亡判断前置过滤性能与逻辑双保障二、分层架构与实现细节接口层HitHandle_enemy.h作用定义统一受击协议不包含任何业务逻辑cpp运行UINTERFACE(MinimalAPI)class UHitHandle_enemy : public UInterface{ GENERATED_BODY() };class ROUGHLIKE1_API IHitHandle_enemy{GENERATED_BODY()public:UFUNCTION(BlueprintNativeEvent, Category “Hit”)void INT_HitHandleEnemy(AActor* DamageCauser, float Damage, float Force);virtual void INT_HitHandleEnemy_Implementation(AActor* DamageCauser, float Damage, float Force) 0;};采用BlueprintNativeEvent支持蓝图重写与 C 实现函数参数与你蓝图原接口完全对齐伤害来源、伤害值、推力2. 敌人类实现层Enemy.h/.cpp2.1 类继承与接口绑定cpp运行// Enemy.hUCLASS()class ROUGHLIKE1_API AEnemy: public APaperZDCharacter, public IHitHandle_enemy{GENERATED_BODY()public:// 接口实现声明virtual void INT_HitHandleEnemy_Implementation(AActor* DamageCauser, float Damage, float Force) override;// 通用受击入口蓝图/C均可调用 UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category Combat | Attack) void OnTakeHit(AActor* DamageCauser, float Damage, float Force); virtual void OnTakeHit_Implementation(AActor* DamageCauser, float Damage, float Force); // 全私有变量的Set/Get接口HP、死亡状态、伤害数据等 // ...完整实现见之前的代码};2.2 核心转发逻辑接口与通用入口解耦cpp运行// Enemy.cpp// 接口仅做转发不写业务逻辑void AEnemy::INT_HitHandleEnemy_Implementation(AActor* DamageCauser, float Damage, float Force){OnTakeHit(DamageCauser, Damage, Force);}// 通用受击入口蓝图重写优先级高于C默认实现void AEnemy::OnTakeHit_Implementation(AActor* DamageCauser, float Damage, float Force){// C默认空实现逻辑由蓝图编写}接口层仅转发保留原有接口兼容性OnTakeHit作为统一入口支持蓝图调试与后续迁移 C3. 玩家侧调用层MyPaperZDCharacter.cpp作用攻击检测 伤害计算 接口调用完全收进 Ccpp运行void AMyPaperZDCharacter::INT_AttackDetection_Implementation(FVector boxPosition, FVector boxExtension){// 1. 死亡前置过滤直接阻断无效攻击if (IsDead) return;// 2. 盒体检测命中敌人 // ...检测逻辑 // 3. 遍历敌人统一分发伤害 for (AActor* target : outActors) { if (!target || !target-ActorHasTag(FName(enemy))) continue; // 4. C内完成暴击伤害计算替代蓝图逻辑 bool bIsCrit UKismetMathLibrary::RandomBoolWithWeight(AttackCritChance); float finalDamage AttackBaseDamage * (bIsCrit ? AttackCritMultiplier : 1.0f); int32 truncatedForce static_castint32(force); // 5. 标准接口调用必须用Execute_前缀 if (target-ImplementsUHitHandle_enemy()) { IHitHandle_enemy::Execute_INT_HitHandleEnemy( target, this, finalDamage, truncatedForce); } }}蓝图层实现敌人蓝图作用仅实现受击业务逻辑不写任何分发逻辑删除蓝图中原有的Event INT Hithandle节点避免覆盖 C 转发保留Event On Take Hit事件编写受击逻辑调用SetDamageCauser/SetReceivedDamage/SetReceivedForce扣血SetHP(GetHP() - Damage)HP 归零时调用SetDead(true)