using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UniRx; using Unity.Mathematics; using UnityEngine; using UnityEngine.Events; namespace Ichni.RhythmGame { public class TransformSubmodule : SubmoduleBase { public Vector3 originalPosition; public Vector3 originalEulerAngles; public Vector3 originalScale; public List positionOffset; public List eulerAnglesOffset; public List scaleOffset; public Vector3 currentPosition; public Vector3 currentEulerAngles; public Vector3 currentScale; public bool positionDirtyMark; public bool eulerAnglesDirtyMark; public bool scaleDirtyMark; public bool eulerAnglesOffsetLock; public UnityAction OnPositionChanged; public UnityAction OnEulerAnglesChanged; public UnityAction OnScaleChanged; public TransformSubmodule() { this.originalPosition = Vector3.zero; this.originalEulerAngles = Vector3.zero; this.originalScale = Vector3.one; positionOffset = new List(); eulerAnglesOffset = new List(); scaleOffset = new List(); currentPosition = Vector3.zero; currentEulerAngles = Vector3.zero; currentScale = Vector3.one; positionDirtyMark = false; eulerAnglesDirtyMark = false; scaleDirtyMark = false; eulerAnglesOffsetLock = false; } public TransformSubmodule(Vector3 originalPosition, Vector3 originalEulerAngles, Vector3 originalScale) { this.originalPosition = originalPosition; this.originalEulerAngles = originalEulerAngles; this.originalScale = originalScale; positionOffset = new List(); eulerAnglesOffset = new List(); scaleOffset = new List(); currentPosition = originalPosition; currentEulerAngles = originalEulerAngles; currentScale = originalScale; positionDirtyMark = false; eulerAnglesDirtyMark = false; scaleDirtyMark = false; eulerAnglesOffsetLock = false; } public void SetObserver(BaseElement target) { Observable.EveryUpdate().Subscribe(_ => { if (positionDirtyMark) { Vector3 offset = Vector3.zero; foreach (var positionOffset in positionOffset) { offset += positionOffset; } currentPosition = originalPosition + offset; positionDirtyMark = false; } positionOffset.Clear(); }).AddTo(target); } } }