diff options
| author | chai <215380520@qq.com> | 2023-11-02 11:51:31 +0800 |
|---|---|---|
| committer | chai <215380520@qq.com> | 2023-11-02 11:51:31 +0800 |
| commit | 7f493f682503f5186308de7b8f74b5b49233cfe4 (patch) | |
| tree | 8a91e2056bc79788ee4735dce88b8d516ba12beb /GameCode/KeepRelativeRotationTo.cs | |
+init
Diffstat (limited to 'GameCode/KeepRelativeRotationTo.cs')
| -rw-r--r-- | GameCode/KeepRelativeRotationTo.cs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/GameCode/KeepRelativeRotationTo.cs b/GameCode/KeepRelativeRotationTo.cs new file mode 100644 index 0000000..94dbe16 --- /dev/null +++ b/GameCode/KeepRelativeRotationTo.cs @@ -0,0 +1,59 @@ +using UnityEngine; + +public class KeepRelativeRotationTo : MonoBehaviour +{ + [SerializeField] + private Transform transformToKeepRelativeRotationTo; + + [SerializeField] + private Vector3 upVector = Vector3.up; + + private Quaternion initialOffset; + + private Vector3 selfPosition; + + private Vector3 otherPosition; + + private Quaternion localRotationStart; + + private Vector3 upVectorAdjusted; + + private void PrepareData() + { + if ((bool)base.transform.parent) + { + selfPosition = base.transform.localPosition; + otherPosition = base.transform.parent.worldToLocalMatrix.MultiplyPoint(transformToKeepRelativeRotationTo.position); + upVectorAdjusted = upVector; + } + else + { + selfPosition = base.transform.position; + otherPosition = transformToKeepRelativeRotationTo.position; + upVectorAdjusted = upVector; + } + } + + private void Start() + { + if ((bool)base.transform.parent) + { + upVector = base.transform.localToWorldMatrix.MultiplyVector(upVector); + upVector = base.transform.parent.localToWorldMatrix.MultiplyVector(upVector); + upVector = upVector.normalized; + } + localRotationStart = base.transform.localRotation; + PrepareData(); + initialOffset = Quaternion.Inverse(Quaternion.LookRotation(otherPosition - selfPosition, upVectorAdjusted)); + } + + private void Update() + { + if ((bool)transformToKeepRelativeRotationTo) + { + PrepareData(); + Quaternion quaternion = Quaternion.LookRotation(otherPosition - selfPosition, upVectorAdjusted); + base.transform.localRotation = quaternion * initialOffset * localRotationStart; + } + } +} |
