using MessagePack; using Newtonsoft.Json; using Unity.Mathematics; using static Unity.Mathematics.math; [MessagePackObject, JsonObject(MemberSerialization.OptIn), RuntimeInspectable] public class VelocityLimitData : BehaviorData { [InspectableField, JsonProperty("topSpeed"), Key(1), RuntimeInspectable] public PerformanceStat TopSpeed = new PerformanceStat(); public override IBehavior CreateInstance(ItemManager context, Entity entity, EquippedItem item) { return new VelocityLimit(context, this, entity, item); } } [Order(100)] public class VelocityLimit : IBehavior { public Entity Entity { get; } public EquippedItem Item { get; } public ItemManager Context { get; } public float Limit { get; private set; } public BehaviorData Data => _data; private VelocityLimitData _data; public VelocityLimit(ItemManager context, VelocityLimitData data, Entity entity, EquippedItem item) { Context = context; _data = data; Entity = entity; Item = item; } public void Initialize() { } public bool Update(float delta) { Limit = Context.Evaluate(_data.TopSpeed, Item.EquippableItem, Entity); if (length(Entity.Velocity) > Limit) Entity.Velocity = normalize(Entity.Velocity) * Limit; return true; } public void Remove() { } }