riversong code showcase
This commit is contained in:
68
Source/Riversong/Game/World/Agents/AgentAnimationSystem.cs
Normal file
68
Source/Riversong/Game/World/Agents/AgentAnimationSystem.cs
Normal file
@@ -0,0 +1,68 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user