using System.Collections; using System.Collections.Generic; using UnityEngine; namespace MyFrameworkPure { /// /// 像子物体一样跟随目标 /// 要确保上层物体缩放是等比的,否则旋转时可能会发生缩放扭曲 /// public class FollowLikeChild : MonoBehaviour { private Vector3 relativePos; private Quaternion relativeRot; [SerializeField] private Transform target; [SerializeField] private bool tween = false; [SerializeField] private float rotSpeed = 90; [SerializeField] private float moveSpeed = 1; // Start is called before the first frame update void Start() { if (target != null) { Target = target; } } // Update is called once per frame void LateUpdate() { if (target == null) return; Vector3 pos = target.TransformPoint(relativePos); Quaternion rot = relativeRot * target.rotation; transform.position = tween ? Vector3.Lerp(transform.position, pos, Time.deltaTime * moveSpeed) : pos; transform.rotation = tween ? Quaternion.Lerp(transform.rotation, rot, Time.deltaTime * rotSpeed) : rot; } /// /// 目标变换 /// public Transform Target { get => target; set { target = value; relativePos = target.InverseTransformPoint(transform.position); relativeRot = Quaternion.Inverse(target.rotation) * transform.rotation; } } } }