FAQ по юнити

Начать новую тему   Ответить на тему

Перейти вниз

FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:00 pm

Писал три года назад. Надо бы проверить функции и исправить. И все это по большей части для 3d, не уверен, что для 2d подойдет идеально. Но пускай будет.


  • Игровой объект
  • Поиск объекта, его компонентов
  • Работа с компонентами
  • Положение игрового объекта
  • Работа с физическими объектами
  • Коллайдеры и триггеры
  • Трассировка лучей
  • Контроллер персонажа
  • Ввод с клавиатуры и мыши
  • Камера
  • Да будет свет!

События:

  • Регулярные события в Юнити
  • Нерегулярные события
  • События ввода и гуи
  • Физические и триггерные события
  • Еще есть события сервера и события отладки. Но о них здесь не написано!


Последний раз редактировалось: raingo (Вс Янв 28, 2018 4:51 pm), всего редактировалось 1 раз(а)

raingo
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:02 pm

Игровой объект


Создание нового игрового объекта с именем 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
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:04 pm

Поиск игрового объекта


Поиск объекта по его имени:
Код:
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
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:10 pm

Работа с компонентами


Получение доступа к скрипту, который лежит на этом же объекте:
Код:
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
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:13 pm

Положение игрового объекта

Обязательный компонент 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
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:17 pm

Работа с физическими объектами

Компонент 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
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:19 pm

Трассировка лучей

Один из самых часто используемых в разработке на 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
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:23 pm

Регулярные события в Юнити


Каждый раз, когда создается пользовательский класс ему автоматически прописываются два события, в теле которых и ведется вся работа движком

пример вновь созданного кода:
Код:
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
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:26 pm

НЕРЕГУЛЯРНЫЕ СОБЫТИЯ!!!

Состояние сцены


Данная функция вызывается при загрузке игрового уровня (сцены). Получает в качестве параметра порядковый номер загруженной сцены, в виде целого числа:
Код:
OnLevelWasLoaded(level:int)

Данная функция позволяет отправить всем игровым объектам сигнал паузы. Принимает в качестве параметра булево значение, определяющее состояние паузы:
Код:
OnApplicationPause(pause:boolean)

Данная функция вызывается при получении или потере фокуса игрового окна. Получает в качестве параметра булево значение, определяющее текущее состояние:
Код:
OnApplicationFocus(focus:boolean)

Данная функция вызывается при выходе из игры:
Код:
OnApplicationQuit()

Состояние объекта


Вызывается при активации объекта. Если объект определен в сцене в редакторе, вызывается на уровне первой загрузки сцена, СРАЗУ после Awake():
Код:
OnEnable()

Данная функция вызывается при отключении объекта:
Код:
OnDisable()

Данная функция вызывается при уничтожении объекта:
Код:
OnDestroy()

Отрисовка объекта


Вызывается, когда объект становится видимым:
Код:
OnBecameVisible()

Когда объект становится невидимым для любой камеры:
Код:
OnBecameInvisible()

raingo
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:28 pm

События ввода и гуи


Вызывается несколько раз в кадре в ответ на события интерфейса. События расположения и заполнения цветом обрабатываются в первую очередь, а затем события ввода с клавиатуры / мыши.
Код:
OnGUI()

Данная функция вызывается при входе курсора мыши на игровой объект, или на экземпляр объекта GUIElement (игровой интерфейс).
Код:
OnMouseEnter()

Данная функция вызывается при уходе курсора мыши с игрового объекта или экземляра объекта GUIElement.
Код:
OnMouseExit()

Данная функция вызывается постоянно, пока курсор мыши находится на игровом объекте, или на элементе игрового интерфейса.
Код:
OnMouseOver()

Данная функция вызывается при нажатии кнопки мыши на игровом объекте или элементе игрового интерфейса.
Код:
OnMouseDown()

Данная функция вызывается при отпускании кнопки мыши, после нажатия ее на игровом объекте или элементе игрового интерфейса.
Код:
OnMouseUp()

Данная функция вызывается, если игрок уведет курсор мыши с объекта или элемента игрового интерфейса, после того, как зажал кнопку мыши.
Код:
OnMouseUpAsButton()

Данная функция вызывается при нахождении курсора мыши с зажатой кнопкой на игровом объекте или элементе игрового интерфейса.
Код:
OnMouseDrag()

raingo
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:30 pm

Физические и триггерные события


Данная функция вызывается всякий раз при входе физического тела в зону триггера.
Код:
OnTriggerEnter(collider:Collider)

Данная функция вызывается каждый раз при выходе физического тела из зоны триггера.
Код:
OnTriggerExit(collider:Collider)

Данная функция вызывается постоянно, пока физическое тело находится внутри зоны триггера.
Код:
OnTriggerStay(collider:Collider)

Данная функция вызывается каждый раз при входе одного физического тела в другое физическое тело.
Код:
OnCollisionEnter(collider:Collider)

Данная функция вызывается каждый раз при выходе одного физического тела из другого физического тела.
Код:
OnCollisionExit(collider:Collider)

Данная функция вызывается постоянно, до тех пор пока одно физическое тело находится внутри другого физического тела.
Код:
OnCollisionStay(collider:Collider)

Сродни OnCollisionEnter(), но срабатывает и пересечении не физических объектов:
Код:
OnControllerColliderHit()

Вызывается, когда частица попадает в коллайдер:
Код:
OnParticleCollision()

Вызывается когда аниматор использует скелет:
Код:
OnAnimatorIK()

Вызывается когда аниматор движет:
Код:
OnAnimatorMove()

raingo
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:33 pm

Ввод с клавиатуры и мыши


Для проверки и получения информации ввода с клавиатуры или мыши существует класс 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
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:37 pm

Базовый коллайдер

Коллайдеры - это невидимые формы вокруг физических объектов, с помощью которых просчитываются столкновения. Есть пять видов: базовый 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
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:40 pm

Контроллер персонажа

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
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:43 pm

Получение камеры

Точка в пространстве экрана определяется в пикселях. Левая нижняя часть камеры соответствует (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
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 4:45 pm

Свет

Свет это по сути компонент игрового объекта. А значит основные принципы работы с ним идентичны (создание, копирование из префаба и т.п.). В 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
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор Winslow в Вс Янв 28, 2018 10:24 pm

Какова ценность этого гайда с учетом существования официальной документации по юнити? Риторический вопрос.

В миллиард раз полезнее была бы небольшая статья, описывающая вещи, специфичные для юнити и не такие очевидные. Но только для этого нужно иметь большой опыт разработки игр на том же юнити... OH WAIT~

Winslow

Сообщения : 9
Дата регистрации : 2017-12-30

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор raingo в Вс Янв 28, 2018 10:32 pm

Благодарю. Winslow, внатуре все так.

raingo
Отдел прокрастинации

Сообщения : 748
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор Pyro338 в Вс Янв 28, 2018 10:43 pm

эмм... нету смайла с поднятым большим пальцем. ну короче лайк. можно даже прикрепить наверх.
avatar
Pyro338
Админ

Сообщения : 587
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: FAQ по юнити

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Вернуться к началу


Начать новую тему   Ответить на тему
 
Права доступа к этому форуму:
Вы можете отвечать на сообщения