поворот камеры вокруг объекта
Имеется камера и объект вокруг которого камера вращается, на камере весит скрипт который отвечает за вращение вокруг определенного объекта, зум к нему, и при двойном нажатии на кнопку мыши подлет к нему . Скрипт ниже. Но после того как происходит подлет к объекту камера перестает крутиться вокруг него.
[SerializeField] private Transform _target; // Во круг чего вращаемся
[SerializeField] private float _zoomMax; // макс. увеличение
[SerializeField] private float _zoomMin; // мин. увеличение
[SerializeField] private float _zoom = 0.25f; // чувствительность при увеличении, колесиком мышки
[SerializeField] private float _sensitivity; // чувствительность мышки
[SerializeField] private float _dist; // Дистанция до объекта во круг которого будем вращаться
private Vector2 posOnSphere = Vector2.up;
private bool _moveCamera;
private bool _startPosCamera;
private bool _finishPosCamera;
void Update()
{
if (RotateCamera())
{
posOnSphere.x += _sensitivity * Mathf.Deg2Rad * Input.GetAxis("Mouse X");
posOnSphere.y += _sensitivity * Mathf.Deg2Rad * Input.GetAxis("Mouse Y");
}
transform.position = SphericalCoodinateSystem(_dist, posOnSphere) + _target.position;
transform.LookAt(_target, Vector3.up);
ZoomController();
if(_moveCamera == true)
{
LerpMovePosition(CurrentObject.TargetCamera.transform.position, 5);
}
}
public Vector3 SphericalCoodinateSystem(float r, Vector2 pos)
{
return new Vector3(r * Mathf.Sin(pos.y) * Mathf.Cos(pos.x), r * Mathf.Cos(pos.y), r * Mathf.Sin(pos.y) * Mathf.Sin(pos.x));
}
private bool RotateCamera()
{
if (Input.GetMouseButton(1))
{
return true;
}
return false;
}
private void ZoomController()
{
if (Input.GetAxis("Mouse ScrollWheel") != 0f)
{
float ScrollAmount = Input.GetAxis("Mouse ScrollWheel") * _zoom;
ScrollAmount *= (_dist * 0.3f);
_dist += ScrollAmount * -1f;
//Минимальная и максимальная дистанция
_dist = Mathf.Clamp(_dist, _zoomMin, _zoomMax);
}
}
private async Task MoveCameraToObj(Vector3 targetPosition, float time, float duration) // перемещение объекта из одной точки к другой
{
transform.position = Vector3.Lerp(transform.position, targetPosition, time / duration);
}
private async void LerpMovePosition(Vector3 target, float duration)
{
if (StartPosMove == Vector3.zero)
{ StartPosMove = transform.position; }
float time = 0;
while (time < duration && _startPosCamera == true)
{
time += 0.01f;
await MoveCameraToObj(target, time, duration);
if (transform.position == target && _finishPosCamera == false)
{
_finishPosCamera = true;
transform.position = target;
await Task.Yield();
}
}
}
Источник: Stack Overflow на русском