using UnityEngine; namespace ECM2.Examples.ThirdPerson { /// /// This example extends a Character (through inheritance), implementing a typical Third Person control. /// public class ThirdPersonCharacter : Character { [Space(15.0f)] public GameObject followTarget; [Tooltip("The default distance behind the Follow target.")] [SerializeField] public float followDistance = 5.0f; [Tooltip("The minimum distance to Follow target.")] [SerializeField] public float followMinDistance; [Tooltip("The maximum distance to Follow target.")] [SerializeField] public float followMaxDistance = 10.0f; protected float _cameraYaw; protected float _cameraPitch; protected float _currentFollowDistance; protected float _followDistanceSmoothVelocity; /// /// Add input (affecting Yaw). /// This is applied to the camera's rotation. /// public virtual void AddControlYawInput(float value) { _cameraYaw = MathLib.ClampAngle(_cameraYaw + value, -180.0f, 180.0f); } /// /// Add input (affecting Pitch). /// This is applied to the camera's rotation. /// public virtual void AddControlPitchInput(float value, float minValue = -80.0f, float maxValue = 80.0f) { _cameraPitch = MathLib.ClampAngle(_cameraPitch + value, minValue, maxValue); } /// /// Adds input (affecting follow distance). /// public virtual void AddControlZoomInput(float value) { followDistance = Mathf.Clamp(followDistance - value, followMinDistance, followMaxDistance); } /// /// Update camera's rotation applying current _cameraPitch and _cameraYaw values. /// protected virtual void UpdateCameraRotation() { cameraTransform.rotation = Quaternion.Euler(_cameraPitch, _cameraYaw, 0.0f); } /// /// Update camera's position maintaining _currentFollowDistance from target. /// protected virtual void UpdateCameraPosition() { _currentFollowDistance = Mathf.SmoothDamp(_currentFollowDistance, followDistance, ref _followDistanceSmoothVelocity, 0.2f); cameraTransform.position = followTarget.transform.position - cameraTransform.forward * _currentFollowDistance; } /// /// Update camera's position and rotation. /// protected virtual void UpdateCamera() { UpdateCameraRotation(); UpdateCameraPosition(); } protected override void Start() { base.Start(); Vector3 eulerAngles = cameraTransform.eulerAngles; _cameraPitch = eulerAngles.x; _cameraYaw = eulerAngles.y; _currentFollowDistance = followDistance; } private void LateUpdate() { UpdateCamera(); } } }