unity скрипт управления камерой
Советы Доброго Змея 
Управление камерой в Unity3D, используя мышку
Одна из первых проблем, вставших передо мной — показать игроку мир вокруг него.
Но мы не ищем лёгких путей
Обращаю внимание, что в этой статье я «изобретаю велосипед» с целью познакомиться с элементарными операциями в Unity3D, изучения классов и операций с объектами. Поэтому, если Вы гуру программирования, то можете проходить мимо =)
Подготовка объектов.
Итак, начнём с того, что создадим какой-нибудь объект (например куб) и привяжем на него камеру (она у нас сейчас только одна — главная камера).
После этого создадим скрипт C#, и назовём его MoveMouse
Написание скрипта.
Изначально нужно было определить позицию мышки.
Это оказалось довольно просто — через класс Input и его параметр mousePosition, который содержит три координаты для каждой из осей — x, y и z.
Итак, заведём внутреннюю переменную MousePos, и будем сохранять в неё координаты текущей позиции мышки. Делать это лучше всего перед отрисовкой экрана в событии Update().
Для удобства, сохраним ссылку на камеру и ссылку на объект, к которому она привязана во внутренних переменных, чтоб всегда можно было к ним обратиться.
При этом мы считаем, что камера привязана именно к тому объекту, вокруг которого будет вращаться. Поэтому ищем этот объект через связь «Родитель-потомок».
Незачем это делать каждый раз, а достаточно будет сделать при создании самой камеры на сцене:
Итак, у нас уже есть ссылка на камеру, которую будем крутить, ссылка на объект, вокруг которого будем крутить, и координаты мышки.
Добавим условие, что крутить камеру будем только тогда, когда нажата правая клавиша мышки.
Узнать состояние клавиш мышки можно через всё тот-же класс Input. Специально для этого у него есть метод GetMouseButton.
Само перемещение камеры будем располагать в событии FixedUpdate():
И наконец, мы подошли к самому интересному — определить угол поворота в зависимости от позиции мышки и повернуть камеру.
Коэффициент поворота определить довольно просто: определяем позицию мышки, отнимаем от неё координату середины экрана, и делим получившееся число на размер экрана (отдельно для оси Х и отдельно для Y).
К примеру, мышка находится на координате 852 по оси Х, а размер экрана по ширине равен 1024. Тогда, согласно формуле:
Угол мы рассчитали, теперь осталось только повернуть камеру.
Сделать это можно, используя метод RotateAround класса transform.
Примечание.
Внимательные читатели могли заметить, что ось, указанная для поворота по горизонтали указана goCamera.transform.up. Честно говоря, я не знаю почему так, но именно так оно работает.
И теперь то-же самое для поворота по вертикали:
Вроде-бы можно и закругляться, но есть ещё один момент, который нужно учесть.
Пользователи всегда хотят настраиваемые параметры. И чувствительность мышки обычно стоит на одном из первых мест при настройке игры «под себя».
Давайте учтём это желание в нашем скрипте. Для этого введём параметр чувствительности sensitivity, и будем его использовать как коэффициент, влияющий на угол поворота:
Скрипт целиком.
Вот теперь точно всё, и осталось только показать весь скрипт целиком, с моими комментариями =)
Unity3D: камеры от третьего лица
Камера является одним из самых важных элементов в 3D-игре. Он действует как глаза игрока, позволяя им видеть игровой мир с разных точек зрения. В Unity3D 3D-камера работает так же, как пленочная камера. Его можно панорамировать, наклонять и масштабировать для кадрирования сцен. Из этого туториала вы узнаете, как создавать несколько перспектив камеры от третьего лица.
Для вдохновения или для использования в качестве отправной точки для своей работы ознакомьтесь с некоторыми из самых популярных 3D-моделей на Envato Market. Или получите помощь один на один, выбрав один из сервисов 3D-дизайна и моделирования в Envato Studio.
Настройка проекта
Нам нужен простой проект для тестирования скриптов нашей камеры. Нам понадобится сцена с земной плоскостью, на которой есть текстура. Это позволит легко увидеть, как каждая камера движется и реагирует на входы игроков. Когда мы закончим, это должно выглядеть так:
Выполните следующие шаги для настройки проекта:
Создать игрока
Все камеры, которые мы собираемся создать, будут нуждаться в цели: на что-то смотреть или следовать. Итак, давайте создадим основного игрока, которого мы можем перемещать с помощью клавиш со стрелками.
В сценарии Player добавьте два открытых свойства для движения и скорости поворота. Затем добавьте следующий код в ваш метод Update ():
Unity скрипт управления камерой
Нажимаем «Add component>>Physics>>Rigidbody» и «Add component>>Physics>>Capsule Collider». В «Capsule Collider» Выставляем размеры нашей капсулы что бы получилось как на картинке, слегка чуть больше модельки самой.
В «Rigidbody» ставим галочку «Use gravity». Раскрываем вкладку «Constraints» и ставим все 3 галочки на «Freeze Rotation». Это нужно для того что бы наш персонаж не проваливался сквозь землю, не падал на землю если вдруг окажется на неровности и тому подобное.
Программируем персонажа на перемещение.
Создадим c# скрипт «movePlayer».
200?’200px’:»+(this.scrollHeight+5)+’px’);»> using UnityEngine;
using System.Collections;
public class movePlayer : MonoBehaviour <
private GameObject player; //Переменна объекта персонажа с которым будем работать.
public static int speed = 6; //Скорость перемещения персонажа. Запись public static обозначает что мы сможем обращаться к этой переменной из любого скрипта
public static int _speed; //постоянная скорость перемещения персонажа
public int rotation = 250; //Скорость пповорота персонажа
public int jump = 3; //Высота прыжка
//Поворачиваем персонажа. Так как наша переменная x глобальна, из скрипта камеры в неё будем записывать длину на сколько сместился указатель мыши и по оси X и относительно этого будет повернут наш персонаж
Quaternion rotate = Quaternion.Euler (0,x,0); //Создаем новую переменную типа Quaternion для задавания угла поворота
player.transform.rotation = rotate; //Поворачиваем персонаж
200?’200px’:»+(this.scrollHeight+5)+’px’);»> codeusing UnityEngine;
using System.Collections;
private float x = 0.0f; //Угол поворота по Y?
private float y = 0.0f; //Уго поворота по X?
[AddComponentMenu(«Scripts/Mouse Orbit»)] //Добавляем в меню
public void Start() <
//переворачивам углы
Vector3 angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
if(rigidbody)
rigidbody.freezeRotation = true; //Если камера столкнется с физ.объектомона остановиться
>
y = ClampAngle(y,yMinLimit, yMaxLimit); //Вызыв самописной функции для ограничения углов поврот
movePlayer.x = x;
//Повернуть камеру согласно поченым данным
Quaternion rotation = Quaternion.Euler(y, x, 0);
transform.rotation = rotation;
200?’200px’:»+(this.scrollHeight+5)+’px’);»> using UnityEngine;
using System.Collections;
public class AnimatePlayer : MonoBehaviour <
Скрипт на камеру как в редакторе Unity3d
Нужен скрипт для облета вокруг объекта, приближения/отдаления и тд для мыши и тача. Может есть у кого готовый скрипт?
Добавлено через 1 час 7 минут
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Не работает скрипт в Unity3d
Написал вот такой скрипт для того чтобы поворачивать объект на N градусов по N оси для юнити 3д, но.
Скрипт показа видео через веб-камеру на сайте
Есть ли какое то готовое решение/сервис, который позволял бы разместить на сайте скрипт, который.
Quat1111, от третьего лица надо?
Quat1111, а какая разница? Механика поведения камеры точно такая же. Там на десяток строк кода. Примеры есть, адаптировать несложно.
Добавлено через 35 минут
Cr0c, под мышь сделал более-менее приемлемо
Делюсь наработками:
Quat1111, пустой го поставили, в него камеру дочерним поставили так, чтобы она на этот пустой го смотрела, но была от него отодвинута?
Cr0c, да, верно, пустой го, чтобы на него смотрела камера, только объект не дочерний.
Метод LookAtTarget поворачивает камеру на этот го и задает позицию камеры
Cr0c, сделал управление под тач
после else идет управление от мыши для пк.
Можете помочь сделать адекватное вращение вокруг объекта? Вокруг оси Y вращается нормально, а вокруг X как то плохо.
Quat1111, контейнер камеры крутить для этого. Я же объяснял, как это работает.
Добавлено через 38 секунд
Или пробуйте RotateAround
Cr0c, с контейнером сам боюсь с ходу не осилю, через RotateAround получилось более менее хорошо, но камера вращается по оси z и это все портит.
Quat1111, потому я контейнером и пользуюсь, это позволяет комбинировать вращение по локальной и глобальной оси
Добавлено через 8 минут
И какая сложность сделать камеру дочерней к пустому го, потом отодвинуть от этого го РОВНЕНЬКО назад (чтобы камера так и смотрела на этот го) и настроить cam_holder и чувствительность?
Для полета использовать пустышку, а саму камеру не трогать.
Добавлено через 3 часа 38 минут
проверки забыл добавить для тача, но Вы с этим должны справится.
gunderson / FlyCamera.cs
This comment has been minimized.
Copy link Quote reply
NaoWeik commented May 7, 2018
This comment has been minimized.
Copy link Quote reply
cloutiertyler commented May 12, 2018
Awesome, thanks so much for posting it.
This comment has been minimized.
Copy link Quote reply
Wingspear commented May 26, 2018
This comment has been minimized.
Copy link Quote reply
RyanBreaker commented Jun 23, 2018 •
Check my fork for a cleaned-up copy. Also reduced default values because they were crazy fast in my project and made them public for easy modification in Unity’s Inspector, as well as changing Space to instead move the camera up and adding Left Control for moving it down.
This comment has been minimized.
Copy link Quote reply
zetaFairlight commented Oct 30, 2018
Thank you! BTW Me too I had to adjust the sensitivity.
This comment has been minimized.
Copy link Quote reply
arthurmarquis commented Apr 3, 2019
The associated script can not be loaded. Please fix any complie errors and assign a valid script.
This comment has been minimized.
Copy link Quote reply
PittMichelmann commented Jun 12, 2019
Perfect! Thank you for the saved time =)
This comment has been minimized.
Copy link Quote reply
sirmagid commented Jul 19, 2019
This comment has been minimized.
Copy link Quote reply
Amshu commented Sep 14, 2019
You saved a lot of peoples time, thanks
This comment has been minimized.
Copy link Quote reply
apoteet commented Dec 5, 2019
The associated script can not be loaded. Please fix any compiler errors and assign a valid script.
This happens if the class name doesn’t match the file name
This comment has been minimized.
Copy link Quote reply
ToniHiTriplix commented Dec 21, 2019
What needs to be done so that the camera does not fly?
This comment has been minimized.
Copy link Quote reply
RandGor commented Jan 1, 2020
What needs to be done so that the camera does not fly?
I guess you should add this script to MainCamera
This comment has been minimized.
Copy link Quote reply
altysheff commented Jan 21, 2020
the mouse cursor rests on the edge of the monitor