• 13uec++多人游戏【创建和使用自定义组件】


    创建组件的c++类,一共有两种组件类,然后我们选择actor的那一种。

    路径也加上组件后缀 

     那么场景组件和actor组件区别是什么呢

    场景组件主要是能看到;

    actor组件看不到,纯功能性组件。

     在类中添加一个成员变量

    1. //当前生命值
    2. UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "HealthComponent")
    3. float Health;

     这里名字改成了COOP

     编译,然后打开玩家蓝图,添加组件

    我们发现该组件在COOP分组里面

    =================

    回到组件c++类,继续添加成员

    1. //最大生命值
    2. UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "HealthComponent")
    3. float DefaultHealth;

     在构造函数中将其设置成100

    DefaultHealth = 100;

     在游戏开始函数里,将做大健康值赋予当前健康值

    1. // Called when the game starts
    2. void USHealthComponent::BeginPlay()
    3. {
    4. Super::BeginPlay();
    5. Health = DefaultHealth;
    6. }

    添加一个函数,用来处理伤害

    1. //承受伤害
    2. UFUNCTION()
    3. void HandleTakeAnyDamage(AActor* DamagedActor, float Damage, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser);

     定义这个函数

    1. void USHealthComponent::HandleTakeAnyDamage(AActor * DamagedActor, float Damage, const UDamageType * DamageType, AController * InstigatedBy, AActor * DamageCauser)
    2. {
    3. //当前生命值<=0,就不做任何处理
    4. if (Health <= 0)
    5. {
    6. return;
    7. }
    8. //承受伤害
    9. Health = FMath::Clamp(Health - Damage, 0.0f, DefaultHealth);
    10. }

     导入actor的头文件

    #include "GameFramework/Actor.h"

    在游戏开始函数里,调用伤害函数

    1. // Called when the game starts
    2. void USHealthComponent::BeginPlay()
    3. {
    4. Super::BeginPlay();
    5. Health = DefaultHealth;
    6. AActor * Owner = GetOwner();
    7. if (Owner)
    8. {
    9. Owner->OnTakeAnyDamage.AddDynamic(this, &USHealthComponent::HandleTakeAnyDamage);
    10. }
    11. }

    为了方便测试

    我们添加一个输出日志,打印生命值

    UE_LOG(LogTemp, Log, TEXT("Health %s"), *FString::SanitizeFloat(Health));

    编译,然后打开靶子蓝图,添加一个生命值组件

    并且我们向场景中拉入一个新的玩家类 

    我们发现了一个bug,我们打其他玩家,没有溅血的效果。

    是因为胶囊体的阻挡缘故。

    我们这样设置胶囊体的碰撞,这样子弹就可以打在网格体上了

    运行

     

  • 相关阅读:
    【webrtc】IsNewerTimestamp 时间戳新旧比较及使用
    《2022国民抑郁症蓝皮书》:94%的患者接受线上问诊
    [Docker]八.Docker 容器跨主机通讯
    Vue底层监测数据变化的原理
    【SpringBoot笔记18】SpringBoot实现统一异常处理、统一结果响应、统一参数校验
    HarmonyOS学习路之方舟开发框架—学习ArkTS语言(渲染控制 一)
    zlMediaKit 1 task模块--怎么用异步做到同步,怎么基于任务而非基于线程管理
    零信任SPA工作流程 已完成未发布
    局域网如何进行内网连接和外网连接
    Newsletter 2022-11|HStreamDB 0.11 发布
  • 原文地址:https://blog.csdn.net/zhang2362167998/article/details/127782543