using System.Collections; using System.Collections.Generic; using UnityEngine; public class SafetyAreaFollower : FollowerBase { bool isInit = false; protected override void OnEnable() { base.OnEnable(); isInit = false; } protected override void Follow() { //if (API_GSXR_Slam.SlamManager?.head == null) //{ // return; //} if (isInit == false) { transform.position = CalculateWindowPosition(Camera.main.transform); transform.rotation = CalculateWindowRotation(Camera.main.transform); isInit = true; } transform.position = Vector3.Lerp(transform.position, CalculateWindowPosition(Camera.main.transform), WindowFollowSpeed * Time.deltaTime); transform.rotation = Quaternion.Slerp(transform.rotation, CalculateWindowRotation(Camera.main.transform), WindowFollowSpeed * Time.deltaTime); } protected override Vector3 CalculateWindowPosition(Transform cameraTransform) { Vector3 position = cameraTransform.position + (new Vector3(cameraTransform.forward.x, 0, cameraTransform.forward.z) * WindowDistance); Vector3 horizontalOffset = cameraTransform.right * windowOffset.x; Vector3 verticalOffset = cameraTransform.up * windowOffset.y; switch (windowAnchor) { case TextAnchor.UpperLeft: position += verticalOffset - horizontalOffset; break; case TextAnchor.UpperCenter: position += verticalOffset; break; case TextAnchor.UpperRight: position += verticalOffset + horizontalOffset; break; case TextAnchor.MiddleLeft: position -= horizontalOffset; break; case TextAnchor.MiddleRight: position += horizontalOffset; break; case TextAnchor.MiddleCenter: position += horizontalOffset + verticalOffset; break; case TextAnchor.LowerLeft: position -= verticalOffset + horizontalOffset; break; case TextAnchor.LowerCenter: position -= verticalOffset; break; case TextAnchor.LowerRight: position -= verticalOffset - horizontalOffset; break; } return position; } protected virtual Quaternion CalculateWindowRotation(Transform cameraTransform) { Quaternion rotation = Quaternion.Euler(0, cameraTransform.rotation.eulerAngles.y, 0); switch (windowAnchor) { case TextAnchor.UpperLeft: rotation *= windowHorizontalRotationInverse * windowVerticalRotationInverse; break; case TextAnchor.UpperCenter: rotation *= windowHorizontalRotationInverse; break; case TextAnchor.UpperRight: rotation *= windowHorizontalRotationInverse * windowVerticalRotation; break; case TextAnchor.MiddleLeft: rotation *= windowVerticalRotationInverse; break; case TextAnchor.MiddleRight: rotation *= windowVerticalRotation; break; case TextAnchor.LowerLeft: rotation *= windowHorizontalRotation * windowVerticalRotationInverse; break; case TextAnchor.LowerCenter: rotation *= windowHorizontalRotation; break; case TextAnchor.LowerRight: rotation *= windowHorizontalRotation * windowVerticalRotation; break; } return rotation; } }