using System.Collections; namespace LibMMD.Unity3D.Physics { internal sealed class NoneMmdPhysicsBackend : IMmdPhysicsBackend { public IEnumerator Build(MmdPhysicsBuildContext context) { yield break; } public bool CalculateMorphBeforePhysics => false; public bool[] TransformSkipMask => null; public void Reset() { } public void Step(float deltaTime, float physicsFps, int maxSubSteps) { } public void Dispose() { } } internal sealed class UnityMmdPhysicsBackend : IMmdPhysicsBackend { private UnityEngine.Rigidbody[] _rigidbodies; public bool CalculateMorphBeforePhysics => false; public bool[] TransformSkipMask { get; private set; } public IEnumerator Build(MmdPhysicsBuildContext context) { var builder = new MmdGameObjectPhysicsBuilder(context.Owner, context.Model, context.Bones, context.BoneRoot.gameObject, (System.Collections.Generic.List>)context.PartIndexes); TransformSkipMask = builder.BuildUnityPhysicsComponents(); _rigidbodies = context.Owner.GetComponentsInChildren(true); yield break; } public void Reset() { if (_rigidbodies == null) return; foreach (var body in _rigidbodies) { if (body == null || body.isKinematic) continue; body.linearVelocity = UnityEngine.Vector3.zero; body.angularVelocity = UnityEngine.Vector3.zero; } } public void Step(float deltaTime, float physicsFps, int maxSubSteps) { } public void Dispose() { } } }