/** * Copyright(c) Live2D Inc. All rights reserved. * * Use of this source code is governed by the Live2D Open Software license * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. */ using Live2D.Cubism.Core; using UnityEngine; namespace Live2D.Cubism.Framework.Physics { /// /// Physics simulation controller. /// [CubismMoveOnReimportCopyComponentsOnly] public class CubismPhysicsController : MonoBehaviour, ICubismUpdatable { /// /// Simulation target rig. /// private CubismPhysicsRig Rig { get { return _rig; } set { _rig = value; } } [SerializeField] private CubismPhysicsRig _rig; /// /// Cubism model parameters for simulation. /// public CubismParameter[] Parameters { get; private set; } /// /// Model has update controller component. /// [HideInInspector] public bool HasUpdateController { get; set; } public int ExecutionOrder { get { return CubismUpdateExecutionOrder.CubismPhysicsController; } } public bool NeedsUpdateOnEditing { get { return false; } } public void OnLateUpdate() { var deltaTime = Time.deltaTime; // Use fixed delta time if required. if (CubismPhysics.UseFixedDeltaTime) { deltaTime = Time.fixedDeltaTime; } // Evaluate rig. Rig.Evaluate(deltaTime); } /// /// Sets rig and initializes . /// /// public void Initialize(CubismPhysicsRig rig) { Rig = rig; Awake(); } #region Unity Event Handling /// /// Called by Unity or . Initializes if exists. /// public void Awake() { // Check rig existence. if (Rig == null) { return; } // Initialize rig. Rig.Controller = this; for (var i = 0; i < Rig.SubRigs.Length; ++i) { Rig.SubRigs[i].Rig = Rig; } Parameters = this.FindCubismModel().Parameters; Rig.Initialize(); } /// /// Called by Unity. /// public void Start() { // Get cubism update controller. HasUpdateController = (GetComponent() != null); } /// /// Called by Unity. Updates controller. /// /// Must be call after animation update. private void LateUpdate() { if (!HasUpdateController) { OnLateUpdate(); } } #endregion } }