首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BTService没有更新黑板键

BTService没有更新黑板键
EN

Stack Overflow用户
提问于 2022-07-13 07:28:21
回答 1查看 178关注 0票数 0

我试图在我的游戏中为AI的敌人创建一个系统,以便他们在低生命值时“撤退”。为了实现这一点,我创建了一个BTService,它主动获取字符的Health并将其保存在黑板键中。

不幸的是,我注意到该服务能够正确设置"Health“值一次,但似乎不会再次更新它。因此,即使敌人的生命值下降,黑板键也会一直保持在一定的值。

本质上所发生的是:

  1. 有一个带有健康变量的ShooterCharacter类。在其行为树中,有一个名为" Health“的黑板键,它将在ShooterCharacter类中存储Health的值。为了实现这一点,一个BTService被称为”更新字符健康“。游戏开始时,”更新字符健康“按预期进行。在行为树中,Health值显示为70,Health ShooterCharacter类从它随后停止工作的ShooterCharacter开始。即使它所属的ShooterCharacter类的健康度降至40,关键仍然是70。

以下是更新字符健康BTService的代码。

BTService_CharacterHealth.h

代码语言:javascript
运行
复制
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "BehaviorTree/Services/BTService_BlackboardBase.h"
#include "BTService_CharacterHealth.generated.h"

/**
 * s
 */
UCLASS()
class SIMPLESHOOTER_API UBTService_CharacterHealth : public UBTService_BlackboardBase
{
    GENERATED_BODY()

public: 
    UBTService_CharacterHealth();

protected: 
    virtual void TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds) override;   
};

BTService_CharacterHealth.cpp

代码语言:javascript
运行
复制
// Fill out your copyright notice in the Description page of Project Settings.


#include "BTService_CharacterHealth.h"
#include "AIController.h"
#include "BehaviorTree/BlackboardComponent.h"
#include "GameFramework/Pawn.h"
#include "Kismet/GameplayStatics.h"
#include "ShooterCharacter.h"

UBTService_CharacterHealth::UBTService_CharacterHealth()
{
    NodeName = "Update Character Health";
}

void UBTService_CharacterHealth::TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds)
{
    Super::TickNode(OwnerComp, NodeMemory, DeltaSeconds);

    AShooterCharacter*  Character = Cast<AShooterCharacter>(OwnerComp.GetAIOwner()->GetPawn());

    if (Character == nullptr)
    {
        return;
    }

    OwnerComp.GetBlackboardComponent()->SetValueAsFloat(GetSelectedBlackboardKey(), Character->Health);
};

我注意到的一件奇怪的事情是,这个问题可能与OwnerComp.GetBlackboardComponent()->SetValueAsFloat(GetSelectedBlackboardKey(), Character->Health);有关。

我在AShooterCharacter* Character = Cast<AShooterCharacter>(OwnerComp.GetAIOwner()->GetPawn());命令之后插入了下面的ULOG。

代码语言:javascript
运行
复制
    UE_LOG(LogTemp, Warning, TEXT("Character Health: %f"), Character->Health);

奇怪的是,这个ULOG能够跟上。如果这个角色的健康是40岁,它会打印出40。尽管如此,即使在这个ULOG活动的情况下,黑板键仍然保持在70。

我明白,如果这件事有点令人费解,我也会被这个问题困扰,所以你可以随便问我其他的问题。

EN

回答 1

Stack Overflow用户

发布于 2022-07-14 07:48:24

过了一段时间,我设法找到了解决问题的办法。事实证明,BTService确实会相应地进行更新。问题是,在检查行为树之前,我没有在编辑器中选择一个特定的敌人角色,这是我做了一个业余的小时移动。

行为树显然在一个字母列表中显示了第一个AI字符的值。它之所以没有被更新,是因为它显示的是另一个没有被破坏的角色。

基本上,当我测试的时候,我拍摄了"ShooterCharacter_4“来看看健康是否会下降。然而,行为树显示的是"ShooterCharacter_1“的值,它没有被破坏,并且处于最大健康状态。因此,我误以为“健康”在更新的时候没有被更新。

我发现,选择游戏中的ShooterCharacter_4,然后去行为树报告,健康是40/70后,破坏它。

我也终于能够让这个“退却”脚本开始了。这与C++无关,我只需确保在不满足条件时行为树操作被正确中止。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72962436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档