100 lines
3.1 KiB
C#

using Unity.Jobs;
using UnityEngine;
using UnityEngine.Profiling;
using VRM.FastSpringBones.Registries;
using VRM.FastSpringBones.Schedulers;
namespace VRM.FastSpringBones.Components
{
/// <summary>
/// Jobを連続して発火させるComponent
/// シーンに1つだけあればいい
/// </summary>
[DefaultExecutionOrder(11000)]
public sealed class FastSpringBoneScheduler : MonoBehaviour
{
[SerializeField] private bool showGizmos;
private CustomSampler _updateSampler;
private PullTransformJobScheduler _pullTransformJobScheduler;
private PushTransformJobScheduler _pushTransformJobScheduler;
private UpdateSpringBoneJobScheduler _updateSpringBoneJobScheduler;
private RootBoneRegistry _rootBoneRegistry;
private ColliderGroupRegistry _colliderGroupRegistry;
private JobHandle _prevJobHandle;
public bool ShowGizmos { get => showGizmos; set => showGizmos = value; }
public void Initialize(
RootBoneRegistry rootBoneRegistry,
TransformRegistry transformRegistry,
ColliderGroupRegistry colliderGroupRegistry)
{
_rootBoneRegistry = rootBoneRegistry;
_colliderGroupRegistry = colliderGroupRegistry;
_updateSampler = CustomSampler.Create("FastSpringBone(Update)");
_pullTransformJobScheduler = new PullTransformJobScheduler(transformRegistry);
_pushTransformJobScheduler = new PushTransformJobScheduler(transformRegistry);
_updateSpringBoneJobScheduler = new UpdateSpringBoneJobScheduler(_rootBoneRegistry);
_rootBoneRegistry.SubscribeOnValueChanged(OnRootBoneChanged);
}
private void OnDestroy()
{
_rootBoneRegistry.UnSubscribeOnValueChanged(OnRootBoneChanged);
_prevJobHandle.Complete();
_pullTransformJobScheduler.Dispose();
_pushTransformJobScheduler.Dispose();
_updateSpringBoneJobScheduler.Dispose();
}
private void OnRootBoneChanged()
{
_prevJobHandle.Complete();
}
#if UNITY_EDITOR
private void OnDrawGizmos()
{
if (!ShowGizmos) return;
_prevJobHandle.Complete();
Gizmos.color = Color.blue;
foreach (var rootBoneWrapper in _rootBoneRegistry.Items)
{
rootBoneWrapper.Value.DrawGizmos();
}
Gizmos.color = Color.yellow;
foreach (var colliderGroup in _colliderGroupRegistry.Items)
{
colliderGroup.DrawGizmos();
}
}
#endif
private void LateUpdate()
{
_updateSampler.Begin();
_prevJobHandle.Complete();
var tempJobHandle = default(JobHandle);
tempJobHandle = _pullTransformJobScheduler.Schedule(tempJobHandle);
tempJobHandle = _updateSpringBoneJobScheduler.Schedule(tempJobHandle);
tempJobHandle = _pushTransformJobScheduler.Schedule(tempJobHandle);
_prevJobHandle = tempJobHandle;
_updateSampler.End();
}
}
}