Merge pull request #1886 from ousttrue/feature/spring_manual_update

[1.0][0.x] SpringBone の手動更新
This commit is contained in:
ousttrue
2022-10-26 17:16:23 +09:00
committed by GitHub
3 changed files with 60 additions and 5 deletions

View File

@@ -23,11 +23,11 @@ namespace VRM
[Header("Settings")]
public float m_stiffnessForce = 1.0f;
[SerializeField] [Range(0, 2)] public float m_gravityPower;
[SerializeField][Range(0, 2)] public float m_gravityPower;
[SerializeField] public Vector3 m_gravityDir = new Vector3(0, -1.0f, 0);
[SerializeField] [Range(0, 1)] public float m_dragForce = 0.4f;
[SerializeField][Range(0, 1)] public float m_dragForce = 0.4f;
[SerializeField] public Transform m_center;
@@ -46,6 +46,7 @@ namespace VRM
{
LateUpdate,
FixedUpdate,
Manual,
}
[SerializeField]
public SpringBoneUpdateType m_updateType = SpringBoneUpdateType.LateUpdate;
@@ -263,6 +264,15 @@ namespace VRM
}
}
public void ManualUpdate(float deltaTime)
{
if (m_updateType != SpringBoneUpdateType.Manual)
{
throw new System.ArgumentException("require SpringBoneUpdateType.Manual");
}
UpdateProcess(deltaTime);
}
public struct SphereCollider
{
// public Transform Transform;

View File

@@ -13,7 +13,7 @@ namespace UniVRM10.FastSpringBones.System
_bufferCombiner = bufferCombiner;
}
public JobHandle Schedule()
public JobHandle Schedule(float deltaTime)
{
var handle = default(JobHandle);
handle = _bufferCombiner.ReconstructIfDirty(handle);
@@ -34,7 +34,7 @@ namespace UniVRM10.FastSpringBones.System
Logics = _bufferCombiner.Logics,
Springs = _bufferCombiner.Springs,
Transforms = _bufferCombiner.Transforms,
DeltaTime = Time.deltaTime,
DeltaTime = deltaTime,
}.Schedule(_bufferCombiner.Springs.Length, 1, handle);
handle = new PushTransformJob

View File

@@ -3,8 +3,41 @@ using UnityEngine;
namespace UniVRM10.FastSpringBones.System
{
[DefaultExecutionOrder(11000)]
/// <summary>
/// VRM-1.0 ではコンポーネントの処理順が規定されている
///
/// 1. ヒューマノイドボーンを解決
/// 2. 頭の位置が決まるのでLookAtを解決
/// 3. ExpressionUpdate
/// 4. コンストレイントを解決
/// 5. SpringBoneを解決
///
/// 1~4 は Vrm10Runtime が管理し LateUpdate で処理される。
/// このクラスは DefaultExecutionOrder(11000) によりその後ろにまわる。
///
/// # [Manual update]
///
/// foreach(var vrmInstance in allVrm)
/// {
/// vrmInstance.UpdateType = None;
/// vrmInstance.Runtime.Process();
/// }
/// FastSpringBoneService.Instance.UpdateType = Manual;
/// FastSpringBoneService.Instance.ManualUpdate();
///
/// </summary>
public sealed class FastSpringBoneService : MonoBehaviour
{
public enum UpdateTypes
{
Manual,
LateUpdate,
}
[SerializeField, Header("Runtime")]
public UpdateTypes UpdateType = UpdateTypes.LateUpdate;
public FastSpringBoneBufferCombiner BufferCombiner { get; private set; }
private FastSpringBoneScheduler _fastSpringBoneScheduler;
@@ -50,7 +83,19 @@ namespace UniVRM10.FastSpringBones.System
private void LateUpdate()
{
_fastSpringBoneScheduler.Schedule().Complete();
if (UpdateType == UpdateTypes.LateUpdate)
{
_fastSpringBoneScheduler.Schedule(Time.deltaTime).Complete();
}
}
public void ManualUpdate(float deltaTime)
{
if (UpdateType != UpdateTypes.Manual)
{
throw new global::System.ArgumentException("require UpdateTypes.None");
}
_fastSpringBoneScheduler.Schedule(deltaTime).Complete();
}
}
}