Files
BusyRabbit/Script/ManagedBusyRabbit/UI/Level/Controllers/BusyRoleStateController.cs
2025-10-28 23:51:17 +08:00

76 lines
2.3 KiB
C#

using UnrealSharp.Engine;
using UnrealSharp.Attributes;
using UnrealSharp.BusyRabbit;
using UnrealSharp.GameplayAbilities;
using UnrealSharp;
using UnrealSharp.CoreUObject;
namespace UI.Level.Controllers;
[UMultiDelegate]
public delegate void OnUIAttributeChange(FName AttributeName, float NewValue, float OldValue);
[UClass]
public class UBusyRoleStateController : UPW_UIController
{
[UProperty()]
public TMulticastDelegate<OnUIAttributeChange> OnAttributeChangeDelegate { get; set; }
protected override void OnUIControllerInitialized()
{
if (UGameplayStatics.GetPlayerController(0) is ALevelPlayerController PC)
{
ABusyPlayerRole Role = PC.ControlledRole;
if (AbilitySystemLibrary.GetAbilitySystemComponent(Role) is UBusyAbilitySystemComponent ASC)
{
RegisterAttributeListener(ASC, "Health");
RegisterAttributeListener(ASC, "Hunger");
}
}
}
public float GetControlledAttribute(FName AttributeName)
{
if (UGameplayStatics.GetPlayerController(0) is ALevelPlayerController PC)
{
ABusyPlayerRole Role = PC.ControlledRole;
if (AbilitySystemLibrary.GetAbilitySystemComponent(Role) is UBusyAbilitySystemComponent ASC)
{
FGameplayAttribute Attribute = UBusyAscLibrary.GetAttribute(Role.Attributes, AttributeName);
return ASC.GetGameplayAttributeValue(Attribute, out bool IsFound);
}
}
return 0;
}
public float GetRoleAttribute(ABusyPawnBase Pawn, FName Attribute)
{
return 0;
}
protected void RegisterAttributeListener(UBusyAbilitySystemComponent ASC, FName AttributeName)
{
TDelegate<OnBusyAttributeChange> Delegate = new TDelegate<OnBusyAttributeChange>();
Delegate.BindUFunction(this, "OnAttributeChange");
ASC.BindEventToAttributeChange(typeof(UBusyPlayerRoleAttributeSet), AttributeName, Delegate);
}
[UFunction()]
protected void OnAttributeChange(FName AttributeName, float NewValue, float OldValue)
{
OnAttributeChangeDelegate.Invoke(AttributeName, NewValue, OldValue);
}
protected override void OnUIControllerDestroy()
{
base.OnUIControllerDestroy();
}
}