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

26,怪物受击接口改为C++

整条链路如下:

一、核心设计目标
实现玩家攻击 → 敌人受击的完整链路
接口与业务逻辑分离,蓝图 / C++ 双向兼容
变量全私有,仅通过Set/Get访问,数据安全可控
死亡判断前置过滤,性能与逻辑双保障
二、分层架构与实现细节

  1. 接口层(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/.cpp)
2.1 类继承与接口绑定
cpp
运行
// Enemy.h
UCLASS()
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作为统一入口,支持蓝图调试与后续迁移 C++
3. 玩家侧调用层(MyPaperZDCharacter.cpp)
作用:攻击检测 + 伤害计算 + 接口调用,完全收进 C++
cpp
运行
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_cast<int32>(force); // 5. 标准接口调用(必须用Execute_前缀) if (target->Implements<UHitHandle_enemy>()) { IHitHandle_enemy::Execute_INT_HitHandleEnemy( target, this, finalDamage, truncatedForce); } }

}

  1. 蓝图层实现(敌人蓝图)
    作用:仅实现受击业务逻辑,不写任何分发逻辑
    删除蓝图中原有的Event INT Hithandle节点,避免覆盖 C++ 转发
    保留Event On Take Hit事件,编写受击逻辑:
    调用SetDamageCauser/SetReceivedDamage/SetReceivedForce
    扣血SetHP(GetHP() - Damage)
    HP 归零时调用SetDead(true)
http://www.jsqmd.com/news/1238599/

相关文章:

  • 服务器训练AI模型:从环境搭建到高效训练实战
  • Cursor AI快速生成高保真原型图的实战指南
  • 第一性原理思考与苏格拉底式提问法解析
  • DOS命令实用指南:从基础操作到高级技巧
  • 前后端分离架构下的JWT认证实践与Spring Security整合
  • 当人眼分辨AI作品开始失效:我在线体验了合合信息 AI 跨模态鉴伪,图片、视频、文本如何被高效识别?
  • 系统进程与线程:原理、管理与安全实践
  • 大语言模型原位分词器扩展:原理、实现与领域适配实践
  • DECODEM企业文档结构化信息提取实战:从原理到批量部署
  • 2026 年现阶段阳江口碑好的20mm 塑料疏水板销售厂家找哪家,别再浪费钱!这个20mm板材如何彻底解决渗水难题? - 企业推荐官【认证官方】
  • 【Bug已解决】Bug: GRPO quickstart max_completion_length=256 default silently breaks training 解决方案
  • 为什么你的AI写的活动方案像实习生水平?3个隐藏参数+4类语境锚点决定成败
  • opencv学习中——车辆检测代码
  • 多智能体操作系统时代来临:从AgenticOS看AI Agent底层架构设计与实战
  • TI EMIFA电源管理与时序配置实战:从SDRAM到异步存储器的嵌入式系统优化
  • OMTO-MQ消息队列服务架构解析与实践指南
  • 头痛缓解方案 —— 鸿蒙AI智能助手开发全流程解析
  • SmartHomeAI---
  • 阿里云返佣折扣详解:如何通过典名科技获得最高优惠
  • 从RNN到Attention:序列建模的核心突破与实现
  • 硬盘坏道检测与修复全攻略
  • UE5.3插件打包全流程指南:从源码到二进制环境避坑实践
  • CodeGraph轻量化代码知识图谱核心技术解析与应用
  • AI编程助手token优化:MCP技术实现99%消耗降低
  • C++对象编程:从基础概念到高级实践
  • 深度学习模型量化技术:PTQ原理与实践指南
  • 奇迹MU剑与翼跨服养号与积分速刷指南
  • GoldHEN金手指管理器:1490+游戏修改的终极解决方案
  • ngx_writev
  • 你的 AI 不是下属,是组织:为什么多智能体要借管理学和社会学来建