Задать вопрос
BRO_TIGER
@BRO_TIGER
Indie Developer (C#, JS)

Как сделать так, что бы камера двигалась за персонажем и при этом Вращалась и Увеличивалась?

Всем доброго времени суток... Для своей игры хотел сделать камеру как в MMO типа World of Warships...
Я её сделал, но конечно без вида от переднего борта и пушки))) Прицепив камеру к Воображаемому, будущему кораблю я понял - Что-то это не то... Пытался делать следование камеры разными способами... И делал [ offset = transform.position - target.position ] дальше просто [ position = target.position + offset ], но вращать камеру тогда нельзя... По-разному издевался над Дистанцией и [ transform.forward ], это вроде уже получше, но... из-за [ transform.forward ] камера в прямом смысле улетала))) Уже второй день придумываю изощренный план как сделать это и не делать капитальный "Ремонт" скрипта...
Заранее Спасибо!
Вот скрипт, написан на C#:

using UnityEngine;
using System.Collections;


public class MouseOrbitCamera : MonoBehaviour
{

    public Transform target;
    public float xSpeed = 12.0f;
    public float ySpeed = 12.0f;
    public float scrollSpeed = 10.0f;

    public float smoothing = 4f;

    public float zoomMin = 1.0f;

    public float zoomMax = 20.0f;

    float distance;

    public Vector3 position;


    float x = 0.0f;

    float y = 0.0f;


    void Start()
    {

        Cursor.lockState = CursorLockMode.Locked;

        Vector3 angles = transform.eulerAngles;

        x = angles.y;
        y = angles.x;

    }

 /* void DidLockCursor()
    {
        Debug.Log("Курсор зафиксирован");
    }
    void DidUnlockCursor()
    {
        Debug.Log("Курсор свободен");
    }
    */   
    

    void LateUpdate()
    {
        if (Input.GetKeyDown("escape"))
            Cursor.lockState = CursorLockMode.None;
            //DidUnlockCursor();

        if (Input.GetMouseButtonDown(0))
        {
            Cursor.lockState = CursorLockMode.Locked;
            //DidLockCursor();
        }

        x += Input.GetAxis("Mouse X") * xSpeed;
        y -= Input.GetAxis("Mouse Y") * ySpeed;

        transform.RotateAround(target.position, transform.up, x);    
        transform.RotateAround(target.position, transform.right, y);

        x = 0;
        y = 0;

        distance = Vector3.Distance(transform.position, target.position);

        distance = ZoomLimit(distance, zoomMin, zoomMax);

        position = -(transform.forward * distance) + target.position;

        if (Input.GetAxis("Mouse ScrollWheel") != 0)

        {

            distance = Vector3.Distance(transform.position, target.position);
            distance = ZoomLimit(distance - Input.GetAxis("Mouse ScrollWheel") * scrollSpeed, zoomMin, zoomMax);
            position = -(transform.forward * distance) + target.position;

            transform.position = Vector3.Lerp(transform.position, position, smoothing * Time.deltaTime);
        }

    }

    public static float ZoomLimit(float dist, float min, float max)

    {

        if (dist < min)

            dist = min;

        if (dist > max)

            dist = max;

        return dist;
    }

}
  • Вопрос задан
  • 2166 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
MrMureno
@MrMureno Куратор тега Unity
VR for all
Вы уж извините, но описание как в World of Warships - так себе пояснение. или видео искать или вообще качать игру, чтоб посмотреть как камера вращается. а вам "так же как там" только без пары режимов.(слава богу по коду вроде понятно что вы хотите)

так вот, на сколько я понял, вы хотите по сфере вокруг цели вращаться камерой и иметь возможность менять радиус.

тогда предложил бы просто использовать сферические координаты
relativePosition = SphericalToCartesian(longitude, latitude, orbitRadius);
transform.position = target.transform.position + relativePosition;

private Vector3 SphericalToCartesian(float longitude, float latitude, float radius)
    {
        float x = radius * Mathf.Sin(latitude) * Mathf.Cos(longitude);
        float y = radius * Mathf.Cos(latitude);
        float z = radius * Mathf.Sin(latitude) * Mathf.Sin(longitude);
        return new Vector3(x, y, z);
    }


По сути у вас есть долгота и широта (как на глобусе) и радиус сферы.
Вычисляете координаты на сфере и плюсуете их к позиции target.

Менять широту, долготу и радиус на основе инпута - тут я вижу вы в курсе как.

ну и так к слову- скрипт тут на пару десятков строк, и мало связанный с другим функционалом - даже весь переписав - капитальным ремонтом это сложно назвать
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы