Files
Cielonos/Assets/Opsive/BehaviorDesigner/Add-Ons/CielonosPack/Conditionals/CheckAttribute.cs

80 lines
2.7 KiB
C#
Raw Normal View History

2025-12-08 05:27:53 -05:00
using Opsive.BehaviorDesigner.Runtime.Tasks;
using Opsive.BehaviorDesigner.Runtime.Tasks.Conditionals;
using Opsive.GraphDesigner.Runtime.Variables;
using Opsive.Shared.Utility;
using UnityEngine;
namespace Cielonos.MainGame.Characters.AI
{
2026-06-30 01:48:58 -04:00
public enum AttributeCompareMode
{
Value,
Percentage
}
2025-12-08 05:27:53 -05:00
[Category("Cielonos")]
2026-03-20 12:07:44 -04:00
[Description("检查一个属性是否满足条件")]
public class CheckAttribute : AutomataConditionalBase
2025-12-08 05:27:53 -05:00
{
private AttributeSubmodule attributeSm;
2026-06-30 01:48:58 -04:00
[Tooltip("检查的属性名,例如 Health")]
2025-12-08 05:27:53 -05:00
public string attributeName;
2026-06-30 01:48:58 -04:00
[Tooltip("比较模式:数值或百分比")]
public AttributeCompareMode compareMode = AttributeCompareMode.Value;
[Tooltip("百分比比较时作为分母的属性名。留空时默认使用 Maximum + attributeName (例如 MaximumHealth)")]
public string percentBaseAttribute;
2025-12-08 05:27:53 -05:00
public bool isBiggerThan;
public SharedVariable<float> biggerThanValue;
public bool isSmallerThan;
public SharedVariable<float> smallerThanValue;
public bool isEqual;
public SharedVariable<float> equalValue;
private float tolerance = 1e-5f;
public override void OnAwake()
{
2026-03-20 12:07:44 -04:00
base.OnAwake();
attributeSm = self.attributeSm;
2025-12-08 05:27:53 -05:00
}
public override TaskStatus OnUpdate()
{
float attributeValue = attributeSm[attributeName];
2026-06-30 01:48:58 -04:00
float compareBiggerValue = biggerThanValue.Value;
float compareSmallerValue = smallerThanValue.Value;
float compareEqualValue = equalValue.Value;
if (compareMode == AttributeCompareMode.Percentage)
{
string baseAttr = string.IsNullOrEmpty(percentBaseAttribute) ? "Maximum" + attributeName : percentBaseAttribute;
float baseValue = attributeSm[baseAttr];
// 使用逆运算进行比较,防止分母为 0 导致浮点数异常
compareBiggerValue = baseValue * compareBiggerValue;
compareSmallerValue = baseValue * compareSmallerValue;
compareEqualValue = baseValue * compareEqualValue;
}
2025-12-08 05:27:53 -05:00
2026-06-30 01:48:58 -04:00
if (isBiggerThan && attributeValue <= compareBiggerValue)
2025-12-08 05:27:53 -05:00
{
return TaskStatus.Failure;
}
2026-06-30 01:48:58 -04:00
if (isSmallerThan && attributeValue >= compareSmallerValue)
2025-12-08 05:27:53 -05:00
{
return TaskStatus.Failure;
}
2026-06-30 01:48:58 -04:00
if (isEqual && Mathf.Abs(attributeValue - compareEqualValue) > tolerance)
2025-12-08 05:27:53 -05:00
{
return TaskStatus.Failure;
}
return TaskStatus.Success;
}
}
}