bodyakurbanov
@bodyakurbanov
Учусь программировать на python

Не получается настроить камеру в Unity, где мне нужно изменить код?

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

using UnityEngine;

public class CarCam : MonoBehaviour
{
    Transform rootNode;
    Transform carCam;
    Transform car;
    Rigidbody carPhysics;
    private bool isRightMouseButtonDown = false;
    private bool isReturning = false;
    private float returnTimer = 0f;
    private float returnDelay = 10f; // Время до возвращения камеры в исходное положение

    [Tooltip("If car speed is below this value, then the camera will default to looking forwards.")]
    public float rotationThreshold = 1f;

    [Tooltip("How closely the camera follows the car's position. The lower the value, the more the camera will lag behind.")]
    public float cameraStickiness = 10.0f;

    [Tooltip("How closely the camera matches the car's velocity vector. The lower the value, the smoother the camera rotations, but too much results in not being able to see where you're going.")]
    public float cameraRotationSpeed = 5.0f;

    void Awake()
    {
        carCam = Camera.main.GetComponent<Transform>();
        rootNode = GetComponent<Transform>();
        car = rootNode.parent.GetComponent<Transform>();
        carPhysics = car.GetComponent<Rigidbody>();
    }
    void Update()
    {
        // Проверяем, нажата ли правая кнопка мыши
        if (Input.GetMouseButtonDown(1))
        {
            isRightMouseButtonDown = true;
        }
        else if (Input.GetMouseButtonUp(1))
        {
            isRightMouseButtonDown = false;
        }

        // Проверяем, нужно ли вернуть камеру в исходное положение
        if (isReturning)
        {
            returnTimer += Time.deltaTime;
            if (returnTimer >= returnDelay)
            {
                isReturning = false;
                returnTimer = 0f;
            }
        }
    }

    void Start()
    {
        // Detach the camera so that it can move freely on its own.
        rootNode.parent = null;
    }

    void FixedUpdate()
    {
        Quaternion look;

        // Если камера не возвращается в исходное положение
        if (!isReturning)
        {
            // Moves the camera to match the car's position.
            rootNode.position = Vector3.Lerp(rootNode.position, car.position, cameraStickiness * Time.fixedDeltaTime);

            // If the car isn't moving, default to looking forwards. Prevents camera from freaking out with a zero velocity getting put into a Quaternion.LookRotation
            if (carPhysics.velocity.magnitude < rotationThreshold)
                look = Quaternion.LookRotation(car.forward);
            else
                look = Quaternion.LookRotation(carPhysics.velocity.normalized);

            // Rotate the camera towards the velocity vector.
            look = Quaternion.Slerp(rootNode.rotation, look, cameraRotationSpeed * Time.fixedDeltaTime);
            rootNode.rotation = look;

            if (isRightMouseButtonDown)
            {
                // Обрабатываем вращение камеры
                RotateCamera();
            }
        }
    }

    void RotateCamera()
    {
        // Получаем ввод с осей мыши для вращения камеры
        float mouseX = Input.GetAxis("Mouse X");
        float mouseY = Input.GetAxis("Mouse Y");

        float rotationX = mouseY * cameraRotationSpeed;
        float rotationY = mouseX * cameraRotationSpeed;

        // Поворачиваем камеру вокруг машины
        rootNode.Rotate(Vector3.right, rotationX);
        rootNode.Rotate(Vector3.up, rotationY);

        // Сбрасываем таймер возврата камеры
        returnTimer = 0f;
    }

    // Метод для запуска возврата камеры в исходное положение
    public void StartReturnToDefaultPosition()
    {
        isReturning = true;
    }
}
  • Вопрос задан
  • 58 просмотров
Пригласить эксперта
Ответы на вопрос 1
@DrRen7
using UnityEngine;


public class CamHolder : MonoBehaviour
{
    [Header("TargetObj")]
    [SerializeField] Rigidbody carPhysics;
    [Header("CamSettings")]
    [SerializeField] Transform _сamHolder;
    [SerializeField] float _camSpeedRotate=1f;
    [SerializeField] bool _rotateMode;
    [SerializeField] float _speedToDefault = 360f;
    [SerializeField] float _timerToSetDefoult=1f;
    float _currentTimerToSet;

    float mouseX, mouseY;

    float _camYaw;
    float _camPitch;


    const float k_bottomClamp=-90f;
    const float k_topClamp = 90f;

    private void Update()
    {
        GetMouseInput();
    }

    void GetMouseInput()
    {
        mouseX = Input.GetAxis("Mouse X");
        mouseY = Input.GetAxis("Mouse Y");
        if (Input.GetMouseButton(1))
        {
            Debug.Log("Test");
            _rotateMode=true;
            _currentTimerToSet = _timerToSetDefoult;
        }
        if (_rotateMode)
        {
            _currentTimerToSet -= Time.deltaTime;
            if(!(_currentTimerToSet>0))_rotateMode = false;
        }
    }
    private void FixedUpdate()
    {
        transform.position = carPhysics.transform.position;
        transform.rotation = carPhysics.transform.rotation;
    }
    private void LateUpdate()
    {
        CameraRotation();
    }

    private void CameraRotation()
    {
        if (_rotateMode)
        {
            _camYaw += mouseX * _camSpeedRotate;
            _camPitch -= mouseY * _camSpeedRotate;
            _camYaw = Clamper(_camYaw, float.MinValue, float.MaxValue);
            _camPitch = Clamper(_camPitch, k_bottomClamp, k_topClamp);
            _сamHolder.transform.rotation = Quaternion.Euler(_camPitch,
                _camYaw, 0.0f);
        }
        else
        {
            _сamHolder.transform.localRotation = Quaternion.RotateTowards(_сamHolder.transform.localRotation,Quaternion.Euler(Vector3.zero),_speedToDefault*Time.deltaTime);
        }
    }

    float Clamper(float curAngle,float clampMin,float clampMax)
    {
        if (curAngle < -360f) curAngle += 360f;
        if (curAngle > 360f) curAngle -= 360f;
        return Mathf.Clamp(curAngle, clampMin, clampMax);
    }
}

665e0921d2dcc917802879.png
скрипт на самый верхний объект

надо еще поправить что б при включении камеры брался настоящий трансформ с камеры а то она прыгать будет, плюс если будет дергаться надо менять порядок вызова
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы