Перемещение камеры

Программирование на Юнити.

Перемещение камеры

Сообщение DanilaDIV 05 сен 2017, 08:38

Добрый день. Не могу как можно реализовать следующее перемещение: если нажата ЛКМ то перемещать камеру так как будто перемещаешь объект то есть как будто земля точно перемещается за курсором но должна перемещаться камера. Если просто делать примерно transform.localPosition += new Vector3(Input.GetAxis("Mouse X"), 0f, Input.GetAxis("Mouse Y")); то курсор не совпадает с позицией когда нажали первый раз на землю.Еще высота камеры может быть разной. Пример: нажали на дерево ЛКМ и начинаем перемещать и дерево должно совпадать с позицией курсора на экране. Думаю понятно объяснил) Еще пример: перемещение такое же и в синема когда нажимаешь альт+нажатие колесика.
DanilaDIV
UNITрон
 
Сообщения: 247
Зарегистрирован: 06 май 2014, 12:10

Re: Перемещение камеры

Сообщение MrDmitry 05 сен 2017, 10:06

Синтаксис:
Используется csharp
        void FixedUpdate()
    {
        if(Input.GetMouseButton(0))
        {
            transform.position = new Vector3(transform.position.x + Input.GetAxis("Mouse X"), transform.position.y, 0);
        }
    }

Как то так думаю.
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: Перемещение камеры

Сообщение DanilaDIV 05 сен 2017, 10:47

Не так( Объект по которому нажали перемещается быстрее/медленнее относительно указателя(курсора) мыши в зависимости от высоты камеры. Надо что местность точно перемещалась за курсором, то есть создать вид как будто местность двигаем, но двигать буду камеру как в синема4D.
DanilaDIV
UNITрон
 
Сообщения: 247
Зарегистрирован: 06 май 2014, 12:10

Re: Перемещение камеры

Сообщение DanilaDIV 06 сен 2017, 15:56

Никто не знает? :-?
DanilaDIV
UNITрон
 
Сообщения: 247
Зарегистрирован: 06 май 2014, 12:10

Re: Перемещение камеры

Сообщение DanilaDIV 08 сен 2017, 07:59

Может не понятно объяснил задачу?
DanilaDIV
UNITрон
 
Сообщения: 247
Зарегистрирован: 06 май 2014, 12:10

Re: Перемещение камеры

Сообщение Tolking 08 сен 2017, 09:29

Ты третий день не можешь "придумать" двигать камеру с корректирующим коэффициентом? Может не стоит на это свое время тратить?
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2714
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Перемещение камеры

Сообщение DanilaDIV 11 сен 2017, 09:28

Да не могу. Тут походу коэффициенты не так просто подобрать. Это хотелка заказчика.
DanilaDIV
UNITрон
 
Сообщения: 247
Зарегистрирован: 06 май 2014, 12:10

Re: Перемещение камеры

Сообщение DanilaDIV 11 сен 2017, 14:53

Вот скрипт который перемещает местность точно за мышкой. Скрипт висит на камере.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class T2 : MonoBehaviour
{
// местность
    public GameObject Zemlya;
    public GameObject TempGo;


    void Start()
    {
        TempGo = new GameObject();
        TempGo.name = "TempGo";
       
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            TempGo.transform.position = Zemlya.transform.position;
            RaycastHit hit;
            Ray ray = GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit))
                TempGo.transform.position = hit.point;
            Zemlya.transform.parent = TempGo.transform;
        }

        if (Input.GetMouseButton(0))
        {
            RaycastHit hit;
            Ray ray = GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit))
                TempGo.transform.position = hit.point;
        }

        if (Input.GetMouseButtonUp(0))
            Zemlya.transform.parent = null;
       

    }
}

 

Нужен точно такой же эффект но чтоб перемещалась камера а не местность.
DanilaDIV
UNITрон
 
Сообщения: 247
Зарегистрирован: 06 май 2014, 12:10

Re: Перемещение камеры

Сообщение DanilaDIV 12 сен 2017, 11:01

Сделал. Вот код. Только камера перемещается параллельно той плоскости на которую нажали. Все зависит от объекта который перемещается за мышкой по плоскости, его координаты = пересечения луча от мыши к земле с определенным тегом. Если плоскость вертикальная то камера поднимается/отпускается , хочу переделать чтоб камера все равно перемещалась вперед/назад. Пробовал разницу по высоте прибавлять к Z а высоту не менять но какая-ты фигня получается.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class T2 : MonoBehaviour
{
    [Tooltip("Объект с моделями")]
    public GameObject ModelGO;
    // в этот объект будем помещать объект со всеми моделями
    private GameObject TempGo;
    // запомним позицию TempGo перед перемещение
    private GameObject SavePosGO;
    // знак можно ли перемещаться по местности
    private bool isDrag;

    void Start()
    {
        TempGo = new GameObject();
        TempGo.name = "TempGo";
        SavePosGO = new GameObject();
        SavePosGO.name = "SavePosGO";
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            Ray ray = GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit))
                // данный тег должен быть на объекте за который можно тянуть, он должен быть горизонтальным
                // иначе камера будет перемещаться не горизонтально а так по какой плоскости тянем
                // если тянуть по вертикальной плоскости то камера будет перемещаться вверх/вниз
                // иначе говоря камера перемещается паралельно плоскости
                if (hit.transform.gameObject.tag == "EarthMoved")
                {
                    TempGo.transform.position = hit.point;
                    // запомним начальную позицию
                    SavePosGO.transform.position = TempGo.transform.position;
                    ModelGO.transform.parent = TempGo.transform;
                    isDrag = true;
                }
        }
        if (Input.GetMouseButton(0))
        {
            if (!isDrag)
                return;
            // пустим луч и найдем объект с тегом
            RaycastHit hit;
            Ray ray = GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit))
            {
                if (hit.transform.gameObject.tag == "EarthMoved")
                {
                            // точка перемещения = точка луча
                            TempGo.transform.position = hit.point;
                            // перенесем камеру в точку пересечения луча с землей
                            transform.parent = TempGo.transform;
                            // теперь точку осмотра вместе с моделями и камерой вернем на стартовую позицию
                            // тем самым мы передвинем камеру а модели остануться на своих позициях
                            TempGo.transform.position = SavePosGO.transform.position;
                            // без этой строчки камера будет трястись
                            TempGo.transform.position = hit.point;
                            // уберем камеру с точки пересечения чтоб могли двигать землю а камера оставалась на месте
                            transform.parent = null;
                }
                else
                {
                    // если на объекте который на земле какой то коллайдер то проигнорируем его и пустим луч дальше чтоб достать до земли
                    GameObject _go = hit.transform.gameObject;
                    // если на нем боксколлайдер/мешколлайдер то отключим на мгновенье
                    if (_go.GetComponent<BoxCollider>())
                        _go.GetComponent<BoxCollider>().enabled = false;
                    if (_go.GetComponent<MeshCollider>())
                        _go.GetComponent<MeshCollider>().enabled = false;
                    // пустим луч еще раз сквозь попавшего ненужного нам объетка
                    RaycastHit hit2;
                    if (Physics.Raycast(ray, out hit2))
                    {
                        if (hit2.transform.gameObject.tag == "EarthMoved")
                        {
                            TempGo.transform.position = hit2.point;
                            transform.parent = TempGo.transform;
                            TempGo.transform.position = SavePosGO.transform.position;
                            transform.parent = null;
                        }
                    }
                    // включим обратно
                    if (_go.GetComponent<BoxCollider>())
                        _go.GetComponent<BoxCollider>().enabled = true;
                    if (_go.GetComponent<MeshCollider>())
                        _go.GetComponent<MeshCollider>().enabled = true;
                }
            }
        }
        if (Input.GetMouseButtonUp(0))
        {
            transform.parent = TempGo.transform;
            TempGo.transform.position = SavePosGO.transform.position;
            transform.parent = null;
            ModelGO.transform.parent = null;
            isDrag = false;
        }
    }
}

 
DanilaDIV
UNITрон
 
Сообщения: 247
Зарегистрирован: 06 май 2014, 12:10


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 11