96 lines
3.1 KiB
C#
96 lines
3.1 KiB
C#
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<Vector3> positionOffset;
|
|
public List<Vector3> eulerAnglesOffset;
|
|
public List<Vector3> 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<Vector3>();
|
|
eulerAnglesOffset = new List<Vector3>();
|
|
scaleOffset = new List<Vector3>();
|
|
|
|
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<Vector3>();
|
|
eulerAnglesOffset = new List<Vector3>();
|
|
scaleOffset = new List<Vector3>();
|
|
|
|
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);
|
|
}
|
|
}
|
|
} |