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); } } }