поворот камеры вокруг объекта

Рейтинг: 1Ответов: 0Опубликовано: 22.02.2023

Имеется камера и объект вокруг которого камера вращается, на камере весит скрипт который отвечает за вращение вокруг определенного объекта, зум к нему, и при двойном нажатии на кнопку мыши подлет к нему . Скрипт ниже. Но после того как происходит подлет к объекту камера перестает крутиться вокруг него.

[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();
        }
    }
}

Ответы

Ответов пока нет.