Files
riversong-code-showcase/Source/Riversong/Game/World/Agents/AgentAnimationSystem.cs
2026-05-21 16:04:49 +02:00

68 lines
2.6 KiB
C#

using Unity.Mathematics;
using UnityEngine;
namespace DanieleMarotta.RiversongCodeShowcase
{
[GameSystemGroup(typeof(DefaultAgentsSystemGroup))]
[UpdateAfter(typeof(IntentExecutionSystem))]
public class AgentAnimationSystem : GameSystem, IUpdatable
{
[InjectService]
private IEntityCollection _entityCollection;
[InjectService]
private IAgentVisualizationCollection _agentVisualizationCollection;
[InjectService]
private IProductCatalog _productCatalog;
public AgentAnimationSystem(IServiceLocator serviceLocator) : base(serviceLocator)
{
}
public void Update()
{
foreach (Agent agent in _entityCollection.GetInternalEntityList(typeof(Agent)))
{
if (!_agentVisualizationCollection.TryGetVisualization(agent.Id, out var visualization)) continue;
const float minVelocitySq = 0.01f;
visualization.UpdateAnimationState(math.lengthsq(agent.Velocity) > minVelocitySq);
UpdateCarriedProduct(agent, visualization);
}
}
private void UpdateCarriedProduct(Agent agent, AgentVisualization visualization)
{
var carriedProduct = visualization.CarriedProductVisualization;
if (!carriedProduct) return;
var isCarryingProduct = agent.CarriedProductHandle != IProductCatalog.InvalidHandle;
var targetWeight = isCarryingProduct ? 1 : 0;
var weight = Mathf.MoveTowards(carriedProduct.GetAnimatorLayerWeight(), targetWeight, 10 * Time.deltaTime);
carriedProduct.SetAnimatorLayerWeight(weight);
if (isCarryingProduct)
SetProductVisualization(carriedProduct, agent.CarriedProductHandle);
else
ClearProductVisualization(carriedProduct);
}
private void SetProductVisualization(AgentCarriedProductVisualization carriedProduct, int productHandle)
{
if (carriedProduct.IsShowingCarriedProduct()) return;
var product = _productCatalog.GetProduct(productHandle);
var productVisualization = (GameObject)Object.Instantiate(product.CarriedVisualization.Asset);
carriedProduct.SetProductVisualization(productVisualization);
}
private void ClearProductVisualization(AgentCarriedProductVisualization carriedProduct)
{
if (!carriedProduct.ClearProductVisualization(out var productVisualization)) return;
Object.Destroy(productVisualization);
}
}
}