我试图在我的游戏中为AI的敌人创建一个系统,以便他们在低生命值时“撤退”。为了实现这一点,我创建了一个BTService,它主动获取字符的Health并将其保存在黑板键中。
不幸的是,我注意到该服务能够正确设置"Health“值一次,但似乎不会再次更新它。因此,即使敌人的生命值下降,黑板键也会一直保持在一定的值。
本质上所发生的是:
以下是更新字符健康BTService的代码。
BTService_CharacterHealth.h
// 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
// 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。
UE_LOG(LogTemp, Warning, TEXT("Character Health: %f"), Character->Health);
奇怪的是,这个ULOG能够跟上。如果这个角色的健康是40岁,它会打印出40。尽管如此,即使在这个ULOG活动的情况下,黑板键仍然保持在70。
我明白,如果这件事有点令人费解,我也会被这个问题困扰,所以你可以随便问我其他的问题。
发布于 2022-07-14 07:48:24
过了一段时间,我设法找到了解决问题的办法。事实证明,BTService确实会相应地进行更新。问题是,在检查行为树之前,我没有在编辑器中选择一个特定的敌人角色,这是我做了一个业余的小时移动。
行为树显然在一个字母列表中显示了第一个AI字符的值。它之所以没有被更新,是因为它显示的是另一个没有被破坏的角色。
基本上,当我测试的时候,我拍摄了"ShooterCharacter_4“来看看健康是否会下降。然而,行为树显示的是"ShooterCharacter_1“的值,它没有被破坏,并且处于最大健康状态。因此,我误以为“健康”在更新的时候没有被更新。
我发现,选择游戏中的ShooterCharacter_4,然后去行为树报告,健康是40/70后,破坏它。
我也终于能够让这个“退却”脚本开始了。这与C++无关,我只需确保在不满足条件时行为树操作被正确中止。
https://stackoverflow.com/questions/72962436
复制相似问题