protected override void Awake() { base.Awake(); if (_SelectedMode == null && Modes != null && Modes.Length > 0) { _SelectedMode = Modes[0]; } _PreSelectedMode = _SelectedMode; }
protected virtual void LateUpdate() { if (Modes != null) { if (_SelectedMode != null && _SelectedMode.Target != null) { if (_ChangeModeTW.IsEnabledAndOver) { _PreSelectedMode = _SelectedMode; _PrePosition = null; _ChangeModeTW.End(); } float horizontal = GetDeltaX() * _SelectedMode.RotationSpeedX * ((InvertX) ? -1 : 1); Pitch += GetDeltaY() * _SelectedMode.RotationSpeedY * ((InvertY) ? 1 : -1); RotateTarget(horizontal); float pitch = Pitch; Vector3 targetPosition = _SelectedMode.Target.position + CovertToTargetSpace(_SelectedMode.TargetOffset); Vector3 dir = new Vector3(0, 0, _SelectedMode.Offset); _Camera.fieldOfView = _SelectedMode.FieldOfView; if (_ChangeModeTW.IsEnabled && _PreSelectedMode != null && _PreSelectedMode.Target != null && _PreSelectedMode != _SelectedMode) { _PrePitch += GetDeltaY() * _PreSelectedMode.RotationSpeedY * ((InvertY) ? 1 : -1); float lerpFactor = _ChangeModeTW.Percent; pitch = Mathf.SmoothStep(_PrePitch, pitch, lerpFactor); targetPosition = MathHelper.SmoothStep(_PreSelectedMode.Target.position + CovertToTargetSpace(_PreSelectedMode.TargetOffset), targetPosition, lerpFactor); dir.z = Mathf.SmoothStep(_PreSelectedMode.Offset, dir.z, lerpFactor); _Camera.fieldOfView = Mathf.SmoothStep(_PreSelectedMode.FieldOfView, _SelectedMode.FieldOfView, lerpFactor); } float desiredAngle = GetTargetRotation(); Quaternion rotation = Quaternion.Euler(pitch, desiredAngle, 0); Vector3 finalPosition = targetPosition - (rotation * dir); // apply camera limits if (_Limits != null && _Limits.Length > 0 && _PrePosition != null) { for (int i = 0; i < _Limits.Length; i++) { _Limits[i].ApplyLimit(ref finalPosition, _PrePosition.Value); } } transform.position = finalPosition; transform.rotation = rotation; _PrePosition = finalPosition; } } }