diff --git a/Assets/Script/Venue/Characters/CharacterManager.cs b/Assets/Script/Venue/Characters/CharacterManager.cs index ab1c14601c..ad7f1d63fd 100644 --- a/Assets/Script/Venue/Characters/CharacterManager.cs +++ b/Assets/Script/Venue/Characters/CharacterManager.cs @@ -19,6 +19,11 @@ public class CharacterManager : GameplayBehaviour [SerializeField] private GameObject _venue; + [SerializeField] + private Vector3 _wind; + private Vector3 _lastUpdatedWind = Vector3.zero; + private bool _lastKnownPausedState = false; + private readonly Dictionary _characters = new(); public Dictionary Characters => _characters; @@ -236,7 +241,20 @@ private void Update() ProcessDrums(character); break; } + + if (_lastKnownPausedState != GameManager.Paused && character is VRMCharacter) + { + ((VRMCharacter) character).SetSpringPause(GameManager.Paused); + } + + if (_wind != _lastUpdatedWind && character is VRMCharacter) + { + ((VRMCharacter) character).SetWind(_wind); + } } + + _lastKnownPausedState = GameManager.Paused; + _lastUpdatedWind = _wind; } public void ResetTime(double time) diff --git a/Assets/Script/Venue/Characters/VRMCharacter.cs b/Assets/Script/Venue/Characters/VRMCharacter.cs index c877803418..f0063a4e08 100644 --- a/Assets/Script/Venue/Characters/VRMCharacter.cs +++ b/Assets/Script/Venue/Characters/VRMCharacter.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using DG.Tweening; +using UniGLTF.SpringBoneJobs.Blittables; using UnityEngine; using UniVRM10; using YARG.Core.Chart; @@ -36,8 +37,9 @@ public class VRMCharacter : VenueCharacter [Tooltip("Set to true if you want to use custom animations instead of the default ones.")] public bool UseCustomAnimations; - private ExpressionKey _lipsyncKey; - private bool _hasVrmInstance; + private ExpressionKey _lipsyncKey; + private bool _hasVrmInstance; + private BlittableModelLevel _modelLevels; private Vector3 _initialPosition; @@ -81,6 +83,7 @@ public override void Initialize(CharacterManager characterManager = null) _characterManager = characterManager; VrmInstance = GetComponent(); _hasVrmInstance = VrmInstance != null; + _modelLevels = new BlittableModelLevel(); _expression = VrmInstance.Runtime.Expression; if (_characterManager != null) @@ -159,6 +162,35 @@ private void SetExpression(LipsyncEvent lipsyncEvent) _expression.SetWeight(_lipsyncKey, lipsyncEvent.Value); } + public void SetWind(Vector3 wind) + { + if (!_hasVrmInstance) + { + return; + } + + //update external force + _modelLevels = new BlittableModelLevel(externalForce: wind, + stopSpringBoneWriteback: _modelLevels.StopSpringBoneWriteback, + supportsScalingAtRuntime: _modelLevels.SupportsScalingAtRuntime); + //push model level changes to VRM runtime + VrmInstance.Runtime.SpringBone.SetModelLevel(VrmInstance.transform, _modelLevels); + } + + public void SetSpringPause(bool paused) + { + if (!_hasVrmInstance) + { + return; + } + //set spring bone paused state + _modelLevels = new BlittableModelLevel(externalForce: _modelLevels.ExternalForce, + stopSpringBoneWriteback: paused, + supportsScalingAtRuntime: _modelLevels.SupportsScalingAtRuntime); + //push model level changes to VRM runtime + VrmInstance.Runtime.SpringBone.SetModelLevel(VrmInstance.transform, _modelLevels); + } + public override void OnChartEvent(ChartEvent e) {