FAQ по юнити
Участников: 3
Страница 1 из 1
FAQ по юнити
Писал три года назад. Надо бы проверить функции и исправить. И все это по большей части для 3d, не уверен, что для 2d подойдет идеально. Но пускай будет.
События:
- Игровой объект
- Поиск объекта, его компонентов
- Работа с компонентами
- Положение игрового объекта
- Работа с физическими объектами
- Коллайдеры и триггеры
- Трассировка лучей
- Контроллер персонажа
- Ввод с клавиатуры и мыши
- Камера
- Да будет свет!
События:
- Регулярные события в Юнити
- Нерегулярные события
- События ввода и гуи
- Физические и триггерные события
- Еще есть события сервера и события отладки. Но о них здесь не написано!
Последний раз редактировалось: raingo (Вс Янв 28, 2018 4:51 pm), всего редактировалось 1 раз(а)
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
Игровой объект
Создание нового игрового объекта с именем MyGameObject. Созданный объект будет доступен по ссылке myObject.
- Код:
var myObject = new GameObject("MyGameObject");
Уничтожение объекта:
- Код:
Destroy(myObject);
Уничтожение объекта через минуту, после его создания:
- Код:
Destroy(myObject, 60);
Получение имени объекта:
- Код:
string name = myObject.name;
//или
Debug.Log(myObject); //используется встроенная функция ToString(), возвращает имя
Работа с transform (обязательный компонент всех объектов):
- Код:
Transform myTransform = myObject.transform;
Аналогично с тегом, слоем, состоянием:
- Код:
myObject.tag = "Player";
myObject.layer = 2;
gameObject.SetActive(false);
Создаем объект уже после загрузки сцены в реальном времени:
- Код:
GameObject thePrefab; //оригинальный объект
void Start () {
GameObject instance = new GameObject(); //вновь созданный
instance = Instantiate(thePrefab, //копируем префаб в instance
transform.position, //в позицию префаба
transform.rotation) as GameObject; //с ротацией префаба
}
Последний раз редактировалось: raingo (Вс Янв 28, 2018 4:18 pm), всего редактировалось 6 раз(а)
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
Поиск игрового объекта
Поиск объекта по его имени:
- Код:
var myObject = GameObject.Find("MyObject");
Поиск объекта по тегу, возвращает единственный объект:
- Код:
var myObject = GameObject.FindWithTag("MyTag");
Возвращает список всех объектов с указанным тегом:
- Код:
var objectList = GameObject.FindGameObjectsWithTag("MyTag");
Проверка на наличие у объекта требуемого тега. Возвращает true, если у указанного объекта имеется тег MyTag:
- Код:
var isCompare = GameObject.CompareTag("MyTag");
Поиск компонента
Возвращает компонент component, привязанный к объекту GameObject, либо null, если объект не содержит данного компонента. Может использоваться, например, для доступа к другим скриптам, привязанным к объекту.
- Код:
var objectComponent = GameObject.GetComponent<component>();
Возвращает все имеющиеся у объекта компоненты типа componentType.
- Код:
var objectComponents = GameObject.GetComponents<componentType>();
Ищем первый дочерний или родительский компонент:
- Код:
var HingeJoint hinge = gameObject.GetComponentInChildren<HingeJoint>();
var hinge = gameObject.GetComponentInParent<HingeJoint>();
Аналогично с массивом:
- Код:
var HingeJoint[] hingeJoints = gameObject.GetComponentsInChildren<HingeJoint>();
var hinge = gameObject.GetComponenstInParent<HingeJoint>();
Поиск по типу
Поиск объекта по типу:
- Код:
var GUITexture texture = FindObjectOfType(GUITexture);
Возвращает все объекты по типу:
- Код:
var HingeJoint[] hinges = FindObjectsOfType(HingeJoint) as HingeJoint[];
Последний раз редактировалось: raingo (Вс Янв 28, 2018 4:18 pm), всего редактировалось 1 раз(а)
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
Работа с компонентами
Получение доступа к скрипту, который лежит на этом же объекте:
- Код:
test2 tt = GetComponent<test2>;
tt.one = 5;
Если скрипт на другом объекте, сначала нужно найти этот объект:
- Код:
test1 tt = Find("nameObject").GetComponent<test1>();
tt.one = 5;
Компонент Transform добывается проще, т.к. используется часто:
- Код:
Transform tratata = Find("nameObject").transform;
Привязать компонент myComponent к объекту GameObject и получить ссылку:
- Код:
myComponent component = gameObject.AddComponent("myComponent") as myComponent;
myComponent component = gameObject.AddComponent<myComponent>(); //равноценно
Отвязать:
- Код:
Destroy(GetComponent<MeshRenderer>());
В остальном работа с компонентами аналогична манипуляциями игровыми объектами.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
Положение игрового объекта
Обязательный компонент transform игрового объекта содержит в себе данные о положении объекта в игровом мире. Рекомендуется использовать transform только если нет физического тела <RigidBody>Возвращает глобальные координаты объекта в игровом мире. Возвращаемая величина имеет тип Vector3, который представляет из себя список из 3 координат — x, y и z:
- Код:
Vector3 pos = GameObject.transform.position;
int x = pos.x;
Текущий угол поворота объекта, основанный на кватернионах. Возвращает объект типа Quaternion:
- Код:
Quaternion target = transform.rotation;
Масштабирование объекта возможно только в локальных координатах (что естественно):
- Код:
transform.localScale += new Vector3(0.1F, 0, 0);
Тоже самое, что и в случае глобальных координат, но с локальными. Локальные координаты рассчитываются относительно родительского объекта. В случае отсутствия родительского объекта локальные координаты совпадают с глобальными:
- Код:
transform.localPosition = new Vector3(0, 0, 0);
Текущий поворот объекта, основанный на кватернионах, но относительно родительского объекта:
- Код:
Quaternion target = transform.localRotation;
Поворот объекта в углах Эйлера. Метод также возвращает координаты в виде объекта Vector3:
- Код:
Vector3 eulerAngle = GameObject.transform.eulerAngles;
Vector3 localEulerAngle = GameObject.transform.localEulerAngles;
Перемещение
Переместить объект в точку 0, 10, 0 игрового мира:
- Код:
transform.position = Vector3(0, 10, 0);
Двигаем наш объект в указанном направлении со скоростью 1 юнит в секунду в заданной системе координат. Также принимает в качестве координат объект класса Vector3:
- Код:
transform.Translate(Vector3.up * Time.deltaTime);
transform.Translate(Vector3.forward * Time.deltaTime, Space.World);
transform.Translate(Time.deltaTime, 0, 0, Camera.main.transform);
Ротация
Вращаем наш объект в указанную сторону со скоростью 1 градус в секунду. Принимает в качестве координат объект типа Vector3. Метод deltaTime объекта Time содержит время в секундах, затраченное на выполнение предыдущего кадра:
- Код:
GameObject.transform.Rotate(Vector3.left * Time.deltaTime);
Тоже самое, что и предыдущий пример, но вращение объекта относительно координат родителя:
- Код:
GameObject.transform.localRotate(Vector3.left * Time.deltaTime);
Сброс угла поворота объекта:
- Код:
GameObject.transform.rotation = Quaternion.identity;
GameObject.transform.localRotation = Quaternion.identity;
Поворачивает объект лицом к заданной точке (трансформу или вектору):
- Код:
Transform target;
transform.LookAt(target);
transform.LookAt(Vector3.zero);
Вращение вокруг оси, проходящей через точку:
- Код:
Vector3 point;
Vector3 axis = Vector3.up;
transform.RotateAround(point, axis, 20 * Time.deltaTime);
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
Работа с физическими объектами
Компонент rigidbody объекта GameObject хранит в себе его физические свойства. Прежде, чем использовать rigidbody, его необходимо добавить к игровому объекту.Получаем/задаем вектор скорости объекта:
- Код:
Rigidbody rb = GetComponent<Rigidbody>();
rb.velocity = new Vector3(0, 10, 0);
Сила противодействия объекта. Может использоваться для замедления скорости, в среде с отсутствующей силой трения. Наиболее часто используется для замедления падающих объектов, например при создании парашюта. Принимает в качестве параметра целое число:
- Код:
GetComponent<Rigidbody>().drag = 100;
Задание массы объекту. Рекомендуется использовать массу в пределах от 0.1 до 10. Использование слишком больших значений может привести к непредсказуемым результатам при расчете физики:
- Код:
GetComponent<Rigidbody>().mass = 5;
Влияние на объект гравитации. Принимает в качестве параметра булево значение. Позволяет отключить влияние гравитации на отдельные объекты:
- Код:
GetComponent<Rigidbody>().useGravity = false;
Влияние физики на игровой объект. Позволяет отключить частично, либо полностью влияние физических законов на объект:
- Код:
GetComponent<Rigidbody>().isKinematic = true;
Запрет на вращение объекта. Наиболее часто используется, когда необходимо сохранить определенный угол поворота даже после столкновения с другими объектами:
- Код:
GetComponent<Rigidbody>().freezeRotation = true;
Указание координат точки центра массы объекта. Применяет координаты в виде уже знакомого нам объекта Vector3.
- Код:
GetComponent<Rigidbody>().centerOfMass = Vector3(1, 0, 0);
Использовать ли для объекта обнаружение столкновений с другими объектами. Можно выключить, тогда ваш объект будет игнорировать любые столкновения:
- Код:
GetComponent<Rigidbody>().detectCollisions = false;
Режим определения столкновений между объектами. Можно указать несколько разных режимов:
CollisionDetectionMode.ContinuousDynamic для быстро движущихся объектов;
CollisionDetectionMode.Continuous для столкновений с быстро движущимися объектами;
CollisionDetectionMode.Discrete (по умолчанию) для обычных столкновений;
В случае отсутствия проблем с определением столкновений рекомендуется использовать свойство по умолчанию.
Задать плотность объекта:
- Код:
GetComponent<Rigidbody>().SetDensity(1.5);
Применить импульс к объекту с указанным вектором. В результате применения импульса объект придет в движение пропорционально силе импульса.
- Код:
GetComponent<Rigidbody>().AddForce(5, 0, 0);
Применить импульс к объекту с вектором в его (объекта) системы координат:
- Код:
GetComponent<Rigidbody>().AddRelativeForce(0, 0, 5);
Добавить объекту крутящий момент. Применение данного метода заставит объект вращаться вокруг своего центра масс centerOfMass.
- Код:
GetComponent<Rigidbody>().AddTorque(0, 1, 0);
Тоже самое, что и предыдущий пример, но относительно координат объекта:
- Код:
GetComponent<Rigidbody>().AddRelativeTorque (1, 0, 0);
Применение импульса к объекту из внешней указанной точки. Заставляет объект двигаться и вращаться одновременно. Может использоваться, например, для симуляции попадания в объект пули. Первый параметр указывает вектор направления силы, второй параметр — исходную точку направления силы.
- Код:
GetComponent<Rigidbody>().AddForceAtPosition(Vector3(0, 5, 7), Bomb.transform.position);
Для полноценной симуляции объемных взрывов в Unity3D есть отдельный метод. Первый параметр метода позволяет указать мощность импульса, второй параметр — точку, из которой исходит импульс, третий параметр — радиус распространения импульса, четвертый параметр — модификатор сжатия сферы распространения силы, пятый, необязательный, параметр указывает тип используемого импульса:
- Код:
GetComponent<Rigidbody>().AddExplosionForce(power, explosionPos, radius, 2.0);
Заставить объект «уснуть», и запретить дальнейший расчет физических показателей для него:
- Код:
GetComponent<Rigidbody>().Sleep();
Проверить «заснул» ли объект:
- Код:
GetComponent<Rigidbody>().IsSleeping();
«Разбудить» объект для возможности дальнейшего применения влияния физики на него:
- Код:
GetComponent<Rigidbody>().WakeUp();
Последний раз редактировалось: raingo (Вс Янв 28, 2018 4:47 pm), всего редактировалось 1 раз(а)
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
Трассировка лучей
Один из самых часто используемых в разработке на Unity3D объект, это Ray. Данный объект позволяет выпустить луч из указанной точки, в указанном направлении, и вернуть некоторые свойства объектов, которых он смог достичь.Создаем объект класса RaycastHit, который содержит информацию об объекте, с которым столкнулся луч:
- Код:
RaycastHit hit;
Отправляем луч длиной в 50 юнитов из позиции rayPosition в направлении rayVector, и заносим объект, с которым столкнулся луч в переменную hit:
- Код:
Physics.Raycast(rayPosition, rayVector.forward, hit, 50);
Получаем дистанцию до объекта, с которым столкнулся луч. Дистанция не может быть больше, чем протяженность луча:
- Код:
float distance = hit.distance;
Иногда бывает необходимо получить имя объекта, с которым произошло столкновение луча. Наиболее простой способ это сделать:
- Код:
string objectName = hit.collider.gameObject.name;
Для получения тега объекта используем следующий способ:
- Код:
string Tag = hit.collider.tag;
Получение ссылки на "просвеченный" лучом объект
- Код:
GameObject Target;
Target = hit.collider.gameObject;
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
Регулярные события в Юнити
Каждый раз, когда создается пользовательский класс ему автоматически прописываются два события, в теле которых и ведется вся работа движком
- пример вновь созданного кода:
- Код:
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
Все эти события наследуются от MonoBehaviour. В Юнити множество разных дефолтных функций, отвечающих на самые разные запросы, от рендера, до ввода и гуи. По сути функции Awake() и Start() не являются регулярными, но я внес их сюда для более облегченного понимания порядка вызовов. Они логически связаны и при написании игры используются в единой структуре.
Данная функция вызывается до начала всех остальных скриптов. При первой загрузки сцены. Обычно используется для установки определенных параметров и инициализации переменных:
- Код:
Awake()
Вызывается один раз перед прорисовкой первого фрейма. До Update, но после выполнения Awake():
- Код:
Start()
FixedUpdate не зависит от Update(), и может вызываться как чаще него так и реже (обычно вызывается реже, если FPS достаточно высок). Это событие может быть вызвано несколько раз в кадре, если FPS низкий а может быть и вообще не вызвано между кадрами, если FPS высокий. Все физические расчеты движка и обновление происходит сразу после FixedUpdate(). При применении расчетов движения внутри FixedUpdate(), вам не нужно умножать ваше значение на Time.deltaTime. Это потому, что FixedUpdate() вызывается из таймера, независимого от частоты кадров. Все расчеты физики следует проводить именно в ней.
- Код:
FixedUpdate()
Вызывается один раз за кадр. Это основное событие для прорисовки кадра.
- Код:
Update()
Вызывается один раз в кадре, после завершения Update(). Любые расчеты, которые осуществляются в Update() будет завершены, при вызове LateUpdate(). Основным использованием LateUpdate() обычно является слежение за камерой. Если Вы осуществите движение Вашего персонажа в событии Update(), то движения камеры и расчётов её месторасположения можете вести в событии LateUpdate(). Это будет гарантировать, что персонаж прошел полностью перед камерой, и закрепил свое расположение.
- Код:
LateUpdate()
Рендеринг
Данная функция вызывается перед определением списка объектов, которые будут рендериться в кадре.
- Код:
OnPreCull()
Данная функция вызывается лишь один раз для каждой камеры при первом рендеринге игрового объекта.
- Код:
OnWillRenderObject()
Данная функция вызывается перед рендерингом сцены в кадре.
- Код:
OnPreRender()
Данная функция вызывается в момент рендеринга текущего игрового объекта в сцене.
- Код:
OnRenderObject()
Данная функция вызывается после рендеринга сцены в кадре.
- Код:
OnPostRender()
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
НЕРЕГУЛЯРНЫЕ СОБЫТИЯ!!!
Данная функция вызывается при загрузке игрового уровня (сцены). Получает в качестве параметра порядковый номер загруженной сцены, в виде целого числа:
Данная функция позволяет отправить всем игровым объектам сигнал паузы. Принимает в качестве параметра булево значение, определяющее состояние паузы:
Данная функция вызывается при получении или потере фокуса игрового окна. Получает в качестве параметра булево значение, определяющее текущее состояние:
Данная функция вызывается при выходе из игры:
Вызывается при активации объекта. Если объект определен в сцене в редакторе, вызывается на уровне первой загрузки сцена, СРАЗУ после Awake():
Данная функция вызывается при отключении объекта:
Данная функция вызывается при уничтожении объекта:
Вызывается, когда объект становится видимым:
Когда объект становится невидимым для любой камеры:
Состояние сцены
Данная функция вызывается при загрузке игрового уровня (сцены). Получает в качестве параметра порядковый номер загруженной сцены, в виде целого числа:
- Код:
OnLevelWasLoaded(level:int)
Данная функция позволяет отправить всем игровым объектам сигнал паузы. Принимает в качестве параметра булево значение, определяющее состояние паузы:
- Код:
OnApplicationPause(pause:boolean)
Данная функция вызывается при получении или потере фокуса игрового окна. Получает в качестве параметра булево значение, определяющее текущее состояние:
- Код:
OnApplicationFocus(focus:boolean)
Данная функция вызывается при выходе из игры:
- Код:
OnApplicationQuit()
Состояние объекта
Вызывается при активации объекта. Если объект определен в сцене в редакторе, вызывается на уровне первой загрузки сцена, СРАЗУ после Awake():
- Код:
OnEnable()
Данная функция вызывается при отключении объекта:
- Код:
OnDisable()
Данная функция вызывается при уничтожении объекта:
- Код:
OnDestroy()
Отрисовка объекта
Вызывается, когда объект становится видимым:
- Код:
OnBecameVisible()
Когда объект становится невидимым для любой камеры:
- Код:
OnBecameInvisible()
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
События ввода и гуи
Вызывается несколько раз в кадре в ответ на события интерфейса. События расположения и заполнения цветом обрабатываются в первую очередь, а затем события ввода с клавиатуры / мыши.
- Код:
OnGUI()
Данная функция вызывается при входе курсора мыши на игровой объект, или на экземпляр объекта GUIElement (игровой интерфейс).
- Код:
OnMouseEnter()
Данная функция вызывается при уходе курсора мыши с игрового объекта или экземляра объекта GUIElement.
- Код:
OnMouseExit()
Данная функция вызывается постоянно, пока курсор мыши находится на игровом объекте, или на элементе игрового интерфейса.
- Код:
OnMouseOver()
Данная функция вызывается при нажатии кнопки мыши на игровом объекте или элементе игрового интерфейса.
- Код:
OnMouseDown()
Данная функция вызывается при отпускании кнопки мыши, после нажатия ее на игровом объекте или элементе игрового интерфейса.
- Код:
OnMouseUp()
Данная функция вызывается, если игрок уведет курсор мыши с объекта или элемента игрового интерфейса, после того, как зажал кнопку мыши.
- Код:
OnMouseUpAsButton()
Данная функция вызывается при нахождении курсора мыши с зажатой кнопкой на игровом объекте или элементе игрового интерфейса.
- Код:
OnMouseDrag()
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
Физические и триггерные события
Данная функция вызывается всякий раз при входе физического тела в зону триггера.
- Код:
OnTriggerEnter(collider:Collider)
Данная функция вызывается каждый раз при выходе физического тела из зоны триггера.
- Код:
OnTriggerExit(collider:Collider)
Данная функция вызывается постоянно, пока физическое тело находится внутри зоны триггера.
- Код:
OnTriggerStay(collider:Collider)
Данная функция вызывается каждый раз при входе одного физического тела в другое физическое тело.
- Код:
OnCollisionEnter(collider:Collider)
Данная функция вызывается каждый раз при выходе одного физического тела из другого физического тела.
- Код:
OnCollisionExit(collider:Collider)
Данная функция вызывается постоянно, до тех пор пока одно физическое тело находится внутри другого физического тела.
- Код:
OnCollisionStay(collider:Collider)
Сродни OnCollisionEnter(), но срабатывает и пересечении не физических объектов:
- Код:
OnControllerColliderHit()
Вызывается, когда частица попадает в коллайдер:
- Код:
OnParticleCollision()
Вызывается когда аниматор использует скелет:
- Код:
OnAnimatorIK()
Вызывается когда аниматор движет:
- Код:
OnAnimatorMove()
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
Ввод с клавиатуры и мыши
Для проверки и получения информации ввода с клавиатуры или мыши существует класс Input.
Например, узнать была ли нажата какая-нибудь кнопка клавы или мыши:
- Код:
if (Input.anyKey) { }
Возвращает положение мыши:
- Код:
Vector3 Pos = Input.mousePosition;
Проверяет, зажата ли заданная клавиша:
- Код:
if (Input.GetButton("Jump")) { }
Возвращает true в момент нажатия клавиши:
- Код:
Input.GetButtonDown("Fire1")
Возвращает true в момент отжатия клавиши:
- Код:
Input.GetButtonUp("Fire2")
Тоже самое, но с определенными клавишами:
- Код:
Input.GetKey("up")
Input.GetKeyDown("space")
Input.GetKeyUp(KeyCode.Space)
Обрабатываем нажатие кнопок мыши:
- Код:
Input.GetMouseButton(2))
Input.GetMouseButtonDown(0))
Input.GetMouseButtonUp(1))
Переводит перемещение по заданной оси в переменные. Например, при нажатии клавиш влево/вправо, значение "h" будет меняться от -1 до 1. Очень удобно использовать с перемещением мышки по осям:
- Код:
float h = Input.GetAxis("Horizontal");
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
Базовый коллайдер
Коллайдеры - это невидимые формы вокруг физических объектов, с помощью которых просчитываются столкновения. Есть пять видов: базовый Collider, BoxCollider и Sphere Collider, Capsule Collider для персонажей, MeshCollider для сложных форм. Триггеры - это производные от коллайдеров, которые не ведут себя как твердые объекты, служат для обнаружения столкновений без создания коллизий. Иначе говоря - это область на карте, в которую могут входить твердые объекты, и при нахождении внутри области срабатывают триггерные события.Возвращает присоединенное физическое тело:
- Код:
Rigidbody rb = collider.attachedRigidbody;
Состояние коллайдера. Включенные коллайдеры сталкиваются с другими коллайдерами, а выключенные коллайдеры - нет:
- Код:
collider.enabled = false;
Создать из коллайдера триггер:
- Код:
collider.isTrigger = true;
Свойство материалов коллайдера:
- Код:
collider.material.dynamicFriction = 0;
collider.material.staticFriction = 0;
Общий физический материал данного коллайдера:
- Код:
PhysicMaterial material;
collider.sharedMaterial = material;
Возвращает ближайшую точку на границе коллайдера к заданной нами точке:
- Код:
Vector3 explosionPos; //точка вне коллайдера
Vector3 contactPoint = collider.ClosestPointOnBounds(explosionPos); //ближайшая к ней точка
BoxCollider
Кроме базовый свойств BoxCollider обладает полем center:
- Код:
collider.center = Vector3.zero; //центр куба в локальном пространстве объекта
и размером куба, измеряемый в его локальном пространстве:
- Код:
collider.size = Vector3(10, 1, 1);
SphereCollider
Центр сферического коллайдера:
- Код:
collider.center = Vector3.zero;
Радиус в локальных координатах:
- Код:
collider.radius = 10;
CapsuleCollider
Центр капсулы:
- Код:
collider.center = Vector3.zero;
Радиус:
- Код:
collider.radius = 1;
Направление капсулы:
- Код:
collider.direction = 0;
Высота капсулы измеряется в локальном пространстве объекта:
- Код:
collider.height = 5;
MeshCollider
Ссылка на меш, используемый для создания коллайдера:
- Код:
Mesh meshToCollide;
collider.sharedMesh = meshToCollide;
Флажок. При включении, нормали столкновений мешей сглаживаются. Это следует применять на сглаженных поверхностях, напр. для холмистого ландшафта, не имеющего резких граней, по которому будет катиться сфера.
- Код:
collider.smoothSphereCollisions = true;
При включении, текущий меш коллайдер будет взаимодействовать с другими меш коллайдерами. Выпуклые (Convex) меш коллайдеры ограничены 255 треугольниками.
- Код:
collider.convex = true;
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
Контроллер персонажа
CharacterController не зависит от сил и будет двигаться только тогда, когда вы вызываете функцию Move. Она будет выполнять движение, но будет ограничена столкновениями.
Имеет все наследуемые от Collider атрибуты плюс center, height и radius, как у капсулы (без direction). А так же дополнительные свойства.
Флаг, указывающий на части капсулы, которые столкнулись с окружающей средой во время последнего вызова CharacterController.Move:
Определяет, могут ли другие жесткие тела или контроллеры персонажей сталкиваться с данным контроллером:
Касался ли CharacterController земли в последнем передвижении:
Ограничивает возможность коллайдер взбираться по склонам только по склонам равным или меньше чем указанное значение:
Персонаж переступит на поверхность, только если она ближе к земле, чем заданное значение:
Текущая относительная скорость персонажа:
Передвигает персонажа со скоростью speed.
Скорость относительно оси-Y игнорируется. Скорость в метрах/сек. Гравитация применяется автоматически. Возвращает если персонаж на земле.
Более сложная функция движения, принимающая абсолютные дельты перемещения.
Пытается двигать контроллер на motion, движение будет ограничено только столкновениями. Будет скользить вдоль коллайдеров. Эта функция не применяет никакой гравитации.
CharacterController
CharacterController - производное от Collider'а. Компонент игрового персонажа, который используется для управления от третьего или первого лица, где не требуется физика Rigidbody. Позволяет легко делать движение ограниченное столкновениями.CharacterController не зависит от сил и будет двигаться только тогда, когда вы вызываете функцию Move. Она будет выполнять движение, но будет ограничена столкновениями.
Имеет все наследуемые от Collider атрибуты плюс center, height и radius, как у капсулы (без direction). А так же дополнительные свойства.
Флаг, указывающий на части капсулы, которые столкнулись с окружающей средой во время последнего вызова CharacterController.Move:
- Код:
CollisionFlags collisionFlags = GetComponent<CharacterController>().collisionFlags;
Определяет, могут ли другие жесткие тела или контроллеры персонажей сталкиваться с данным контроллером:
- Код:
CharacterController controller = GetComponent<CharacterController>();
controller.detectCollisions = false
Касался ли CharacterController земли в последнем передвижении:
- Код:
if (controller.isGrounded)
print("We are grounded");
Ограничивает возможность коллайдер взбираться по склонам только по склонам равным или меньше чем указанное значение:
- Код:
controller.slopeLimit = 45.0F;
Персонаж переступит на поверхность, только если она ближе к земле, чем заданное значение:
- Код:
controller.stepOffset = 2.0F;
Текущая относительная скорость персонажа:
- Код:
Vector3 horizontalVelocity = controller.velocity;
CharacterController.SimpleMove(Vector3 speed)
Передвигает персонажа со скоростью speed.
Скорость относительно оси-Y игнорируется. Скорость в метрах/сек. Гравитация применяется автоматически. Возвращает если персонаж на земле.
- Код:
float speed = 3.0F;
float rotateSpeed = 3.0F;
transform.Rotate(0, Input.GetAxis("Horizontal") * rotateSpeed, 0);
Vector3 forward = transform.TransformDirection(Vector3.forward);
float curSpeed = speed * Input.GetAxis("Vertical");
controller.SimpleMove(forward * curSpeed);
CharacterController.Move(Vector3 motion)
Более сложная функция движения, принимающая абсолютные дельты перемещения.
Пытается двигать контроллер на motion, движение будет ограничено только столкновениями. Будет скользить вдоль коллайдеров. Эта функция не применяет никакой гравитации.
- Код:
float speed = 6.0F;
float jumpSpeed = 8.0F;
float gravity = 20.0F;
Vector3 moveDirection = Vector3.zero;
if (controller.isGrounded) {
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if (Input.GetButton("Jump"))
moveDirection.y = jumpSpeed;
}
moveDirection.y -= gravity * Time.deltaTime;
controller.Move(moveDirection * Time.deltaTime);
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
Получение камеры
Точка в пространстве экрана определяется в пикселях. Левая нижняя часть камеры соответствует (0,0); верхняя правая - (1,1). Положение z в мировых единицах от камеры.Возвращает все включенные камеры на сцене:
- Код:
Camera[] allCameras = Camera.allCameras;
Количество камер в текущей сцене:
- Код:
int count = Camera.allCamerasCount;
Первая включенная камера с тегом "MainCamera" (Только чтение):
- Код:
Camera main = Camera.main;
Копирует настройки с другой камеру на эту:
- Код:
camera.CopyFrom(Camera.main);
Изменение свойств камеры
Глубина камеры в порядке отрисовки камеры. Камеры с низкой глубиной отрисовываются раньше, чем камерами с большей глубиной. Используйте это, чтобы управлять порядком, в котором камеры отрисовываются, если у вас есть несколько камер и некоторые из них не располагаются на весь экран.
- Код:
camera.depth = Camera.main.depth + 1;
Включение технологии High Dynamic Range:
- Код:
Camera.hdr = true;
Переключает способность камеры симулировать перспективу:
- Код:
camera.orthographic = true;
Размер зоны видимости камеры для ортографического режима:
- Код:
camera.orthographicSize = 5;
Ширина угла обзора камеры, измеряется в градусах по локальной оси Y (когда выбран режим перспективы):
- Код:
camera.fieldOfView = 60;
Дистанция, на которой камера начинает и заканчивает рендеринг.
Ближайшая точка относительно камеры, которая будет рисоваться:
- Код:
camera.nearClipPlane = 0.1F;
Дальняя точка относительно камеры, которая будет рисоваться:
- Код:
camera.farClipPlane = 100.0F;
Область экрана, на которой рисуется камера
Высота и ширина камеры (Read Only):
- Код:
Camera.pixelHeight;
Camera.pixelWidth;
Где на экране камера рендерится в пиксельных координатах:
- Код:
Rect r = camera.pixelRect;
Где на экране камера рендерится в в нормализированных координатах. Значения в rect диапазоне от нуля (слева/снизу) до одного (справа/сверху):
- Код:
camera.rect = Rect (1, 0, 1, 1);
Из камеры в мир
Возвращает луч, идущий от камеры через точку на экране:
- Код:
Ray ray = camera.ScreenPointToRay(new Vector3(200, 200, 0));
Преобразует position (позицию) из экранного пространства в мировое пространство:
- Код:
Vector3 p = camera.ScreenToWorldPoint(new Vector3(100, 100, camera.nearClipPlane));
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
Свет
Свет это по сути компонент игрового объекта. А значит основные принципы работы с ним идентичны (создание, копирование из префаба и т.п.). В Unity существует четыре типа источников света:- Источник света типа Directional lights расположен бесконечно далеко и оказывает влияние на все объекты сцены. Эффект схож с солнечным светом.
- Источник света типа Point lights светит со своего местоположения одинаково во всех направлениях, как лампочка.
- Источник света типа Spot lights светит из точки в некотором направлении и освещает объекты только внутри конуса - как автомобильные фары.
- Источник света типа Area lights (доступно только с запеканием карт освещения) светит во всех направлениях на одной стороне прямоугольной области плоскости.
Задаем тип света:
- Код:
light.type = LightType.Spot;
Дальность излучения света из центра объекта. Только для источников света типа Point и Spot:
- Код:
light.range = 0.5F;
Задает угол конуса в градусах. Используется только для источника света типа Spot:
- Код:
light.spotAngle =0.3F;
Цвет источника света:
- Код:
light.color -= Color.white / 2.0F * Time.deltaTime;
Яркость света:
- Код:
light.intensity = 0.5F;
Альфа-канал данной текстуры используется как маска, которая задает яркость света в разных местах. Для источника света типа Spot или Directional эта текстура должна быть 2D. В случае Point это должен быть Cubemap:
- Код:
Texture2D newCookie;
light.cookie = newCookie;
Размер области источника света:
- Код:
light.areaSize = new Vector2(5, 2);
Интенсивность теней:
- Код:
light.shadowStrength = 0.3F;
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
Какова ценность этого гайда с учетом существования официальной документации по юнити? Риторический вопрос.
В миллиард раз полезнее была бы небольшая статья, описывающая вещи, специфичные для юнити и не такие очевидные. Но только для этого нужно иметь большой опыт разработки игр на том же юнити... OH WAIT~
В миллиард раз полезнее была бы небольшая статья, описывающая вещи, специфичные для юнити и не такие очевидные. Но только для этого нужно иметь большой опыт разработки игр на том же юнити... OH WAIT~
Winslow- Сообщения : 9
Дата регистрации : 2017-12-30
Re: FAQ по юнити
Благодарю. Winslow, внатуре все так.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: FAQ по юнити
эмм... нету смайла с поднятым большим пальцем. ну короче лайк. можно даже прикрепить наверх.
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения