68 lines
2.6 KiB
C#
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);
|
|
}
|
|
}
|
|
} |