虚幻基础:攻击 与 受击 之间的联动


能帮到你的话,就给个赞吧 😘


文章目录

  • 联动:组件间通过联动逻辑完成任务
    • [组件的状态 联动 其他组件的行为](#组件的状态 联动 其他组件的行为)
    • [组件的行为 受 其他组件的影响](#组件的行为 受 其他组件的影响)
  • [组件的状态 联动 其他组件的行为:组件A的状态 联动 组件B的行为](#组件的状态 联动 其他组件的行为:组件A的状态 联动 组件B的行为)
    • [1.信号发送:组件 A 发送信号](#1.信号发送:组件 A 发送信号)
    • [2.行为响应:组件 B 接收信号后并执行预设行为](#2.行为响应:组件 B 接收信号后并执行预设行为)
    • [示例:角色死亡时,UI&音效组件 执行预设行为](#示例:角色死亡时,UI&音效组件 执行预设行为)
  • [组件的行为 受 其他组件的影响:组件A 的行为 受 组件B 的影响](#组件的行为 受 其他组件的影响:组件A 的行为 受 组件B 的影响)
    • [行为调整:组件 A 接收信号 并根据 信号内容 调整自身行为](#行为调整:组件 A 接收信号 并根据 信号内容 调整自身行为)
    • [信号发送:组件 B 发送信号](#信号发送:组件 B 发送信号)
    • [示例:攻击组件 要 根据 防御组件的 "无敌状态" 攻击。](#示例:攻击组件 要 根据 防御组件的 “无敌状态” 攻击。)
  • 信号发送机制:接收信号并发送:组件间的交互方式
  • 攻击&受击之间的联动
    • [攻击时不能受击:受击组件受击时 根据攻击组件的状态判断是否可以受击](#攻击时不能受击:受击组件受击时 根据攻击组件的状态判断是否可以受击)
    • [受击时不能攻击:攻击组件攻击时 根据受击组件的状态判断是否可以攻击](#受击时不能攻击:攻击组件攻击时 根据受击组件的状态判断是否可以攻击)
  • 联动设计
    • [1.避免双向联动:若 A 联动 B,B 联动 A,则导致组件状态无法预测](#1.避免双向联动:若 A 联动 B,B 联动 A,则导致组件状态无法预测)
  • 参考
    • [编程 组件之间的联动](#编程 组件之间的联动)

联动:组件间通过联动逻辑完成任务

组件的状态 联动 其他组件的行为

组件的行为 受 其他组件的影响

组件的状态 联动 其他组件的行为:组件A的状态 联动 组件B的行为

1.信号发送:组件 A 发送信号

2.行为响应:组件 B 接收信号后并执行预设行为

示例:角色死亡时,UI&音效组件 执行预设行为

cpp 复制代码
// 血量组件(状态变化源)
class HealthComponent {
private:
    float CurrentHealth;
    EventBus* EventBus; // 事件总线

public:
    HealthComponent(EventBus* Bus) : EventBus(Bus), CurrentHealth(100.0f) {}

    void TakeDamage(float Damage) {
        CurrentHealth = FMath::Max(0.0f, CurrentHealth - Damage);
        
        // 血量变化时 发布信号
        EventBus->Publish(new HealthChangedEvent(CurrentHealth));
        
        // 血量为0时 发布信号
        if (CurrentHealth <= 0) {
            EventBus->Publish(new DeathEvent());
        }
    }
};

// UI组件
class UIComponent {
public:
    UIComponent(EventBus* Bus) {
        // 接收血量变化信号
        Bus->Subscribe<HealthChangedEvent>([this](HealthChangedEvent* E) {
            UpdateHealthBar(E->NewHealth); // 执行预设行为:更新UI
        });
    }
};

// 音效组件
class SoundComponent {
public:
    SoundComponent(EventBus* Bus) {
        // 接收死亡信号
        Bus->Subscribe<DeathEvent>([this](DeathEvent* E) {
            PlaySound("Death"); // 执行预设行为:播放音效
        });
    }
};

组件的行为 受 其他组件的影响:组件A 的行为 受 组件B 的影响

行为调整:组件 A 接收信号 并根据 信号内容 调整自身行为

信号发送:组件 B 发送信号

示例:攻击组件 要 根据 防御组件的 "无敌状态" 攻击。

cpp 复制代码
// 攻击组件(接收无敌信号,根据信号内容调整攻击行为)
class AttackComponent {
private:
    EventBus* EventBus;
public:
    AttackComponent(EventBus* EventBus) : EventBus(EventBus) {
        // 接收无敌信号
        Bus->Subscribe<InvincibilityChangedEvent>([this](InvincibilityChangedEvent* E) {
            // 根据无敌信号的内容调整攻击行为
            if (E->bNewInvincibleState) {
                PlayHitEffect(false); // 播放无效攻击特效(未命中)
                PlaySound("HitBlocked.wav");
            }
            else (E->bNewInvincibleState) {
                Target->TakeDamage(20.0f, ...); // 造成伤害
                PlayHitEffect(true); // 播放有效攻击特效
            }     
        });
    }
};

// 防御组件(发布无敌变化信号)
class DefenseComponent {
private:
    EventBus* EventBus;
    bool bIsInvincible = false;
public:
    DefenseComponent(EventBus* EventBus) : EventBus(EventBus) {}
    
    // 激活无敌状态并发布信号
    void ActivateInvincibility(float Duration) {
        bIsInvincible = true;
        
        // 发布无敌变更信号(通知所有订阅者)
        EventBus->Publish(new InvincibilityChangedEvent(bIsInvincible));
        
        // 定时取消无敌
        GetWorld()->GetTimerManager().SetTimer(
            InvincibilityTimer, 
            [this]() {
                bIsInvincible = false;
                EventBus->Publish(new InvincibilityChangedEvent(bIsInvincible));
            },
            Duration, 
            false
        );
    }
};

// 示例
void Example() {
    // 创建事件总线
    EventBus* GlobalEventBus = new EventBus();

    // 创建防御组件
    DefenseComponent* DefenseComp = new DefenseComponent(GlobalEventBus);

    // 创建攻击组件
    AttackComponent* AttackComp = new AttackComponent(GlobalEventBus);

    // 触发无敌状态变化(自动通知攻击组件)
    DefenseComp->ActivateInvincibility(3.0f); // 3秒无敌
}

信号发送机制:接收信号并发送:组件间的交互方式

事件驱动

观察者

回调

攻击&受击之间的联动

攻击时不能受击:受击组件受击时 根据攻击组件的状态判断是否可以受击

受击时不能攻击:攻击组件攻击时 根据受击组件的状态判断是否可以攻击

联动设计

1.避免双向联动:若 A 联动 B,B 联动 A,则导致组件状态无法预测

参考

编程 组件之间的联动

相关推荐
AA陈超2 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-25 属性信息数据资产
c++·游戏·ue5·游戏引擎·虚幻
AA陈超4 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-19 打开属性菜单
c++·游戏·ue5·游戏引擎·虚幻
AA陈超5 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-16 属性菜单 - 构建
c++·游戏·ue5·游戏引擎·虚幻
AA陈超7 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-14 属性菜单 - 文本值行
c++·游戏·ue5·游戏引擎·虚幻
AA陈超7 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-13 属性菜单 - 边框值
c++·游戏·ue5·游戏引擎·虚幻
染指11108 天前
23.UE-游戏逆向-寻找骨骼坐标
ue4·虚幻·虚幻引擎·ue·unrealengine4
qq_428639618 天前
虚幻基础:EQS
虚幻
qq_428639619 天前
虚幻基础:行为树
虚幻
开发游戏的老王9 天前
虚幻引擎虚拟制片入门教程目录
游戏引擎·虚幻
AA陈超10 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P05-11 消息小部件
c++·游戏·ue5·游戏引擎·虚幻