Flight Dream Studio, Unity3D

Unity3D => Программирование на Unity3D => Тема начата: Mimi Neko от Июль 08, 2012, 20:25:20 pm

Название: Общие обзоры событий, методов и программных решений, в Unity3D
Отправлено: Mimi Neko от Июль 08, 2012, 20:25:20 pm
Своего рода быстрые и краткие, справочные русскоязычные материалы по Юнити, актуальные для работы на любом скрипте:

Порядок событий в Unity3D (http://habrahabr.ru/post/147315)

Погружение в скрипты игрового движка Unity3d, ч.1 (http://habrahabr.ru/post/128711)

Погружение в скрипты игрового движка Unity3d, ч.2 (http://habrahabr.ru/post/128948)

C чего начать (http://shgames.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8:C_%D1%87%D0%B5%D0%B3%D0%BE_%D0%BD%D0%B0%D1%87%D0%B0%D1%82%D1%8C)

Как писать скрипты (http://shgames.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8:%D0%9A%D0%B0%D0%BA_%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B)

Как скрипты общаются (http://shgames.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8:%D0%9A%D0%B0%D0%BA_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B_%D0%BE%D0%B1%D1%89%D0%B0%D1%8E%D1%82%D1%81%D1%8F)

Импорт моделей с анимацией (http://shgames.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8:%D0%98%D0%BC%D0%BF%D0%BE%D1%80%D1%82_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B5%D0%B9_%D1%81_%D0%B0%D0%BD%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D0%B5%D0%B9)

Кватернионы (http://shgames.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8:%D0%9A%D0%B2%D0%B0%D1%82%D0%B5%D1%80%D0%BD%D0%B8%D0%BE%D0%BD%D1%8B)

Сопрограммы (Coroutine) (http://shgames.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8:%D0%A1%D0%BE%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B_(Coroutone))

Простейший искусственный интеллект (http://shgames.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8:%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%B5%D0%B9%D1%88%D0%B8%D0%B9_%D0%B8%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B8%D0%BD%D1%82%D0%B5%D0%BB%D0%BB%D0%B5%D0%BA%D1%82)

Работа с тегами (http://shgames.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8:%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D1%82%D0%B5%D0%B3%D0%B0%D0%BC%D0%B8)

Шейдеры (http://shgames.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8:%D0%A8%D0%B5%D0%B9%D0%B4%D0%B5%D1%80%D1%8B)



-----------------------------------------------------------------------------------

Расширения, плагины и кастомизация редактора Unity3d

Расширение редактора (http://shgames.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8:%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B0)

Расширение редактора (Часть 2) (http://shgames.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8:%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B0_(%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2))

Расширение редактора (Часть 3) (http://shgames.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8:%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B0_(%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3))

Создание своих собственных инструментов для редактора Unity3d (http://unity3dsources.wordpress.com/2012/09/10/создание-своих-собственных-инструме/)

Extending the Editor (unity3d.ru manual) (http://docs.unity3d.com/Manual/ExtendingTheEditor.html)

Property Drawers in Unity 4 (http://blogs.unity3d.com/2012/09/07/property-drawers-in-unity-4/)

Коллекция Property Drawers (http://www.unity3d.ru/distribution/viewtopic.php?f=69&t=22895)

Property-drawer-collection (https://github.com/anchan828/property-drawer-collection)

Расширение редактора Unity3D 4 (http://hghltd.yandex.net/yandbtm?fmode=inject&url=http%3A%2F%2Fweb-zone.com.ua%2Frasshirenie-redaktora-unity3d%2F&tld=ru&lang=ru&la=&text=unity3d%20%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B0%20Property%20Drawers&l10n=ru&mime=html&sign=a8a2098c7a7859a57f7c439e985d1074&keyno=0)

коллекция built in аттрибутов (unity3d.ru manual) (http://docs.unity3d.com/ScriptReference/30_search.html?q=Attribute)

CustomPropertyDrawer in C# (http://unitycoder.com/blog/2013/08/23/custompropertydrawer-in-c/)

Custom Data, an introduction to serialized classes and property drawers (http://catlikecoding.com/unity/tutorials/editor/custom-data/)



---------------------------------------


Простое чтение и сохранение ini-файлов (http://shgames.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8:%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B5_%D1%87%D1%82%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8_%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_ini-%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2)

Источник тут (http://shgames.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0)

Англоязычный ресурс, с множеством полезной информации, решений, примеров и уроков по Unity3d:
Unity Game Engine (http://www.scoop.it/t/unity-game-engine)

Русскоязычные материалы и новости по Unity3d
Что нового в Unity 3.4 (На русском!) (http://unity3d.vx0.ru/chto_novogo_v_unity_3_4_)


---------------------------------------

Оптимизация:
Оптимизация Производительности (http://www.unitydev.ru/tutorials/scripting/optimizaciya-proizvoditelnosti.html)

Интересные англоязычные мануалы и статьи по оптимизации и правильных подходах:
Unity Optimization Tips (http://unitycoder.com/blog/2014/04/23/unity-optimization-tips/)

Название: Re: Общие обзоры событий, методов и программных решений, в Unity3D
Отправлено: Sanek312 от Июль 09, 2012, 09:09:17 am
О, я как раз по этим урокам с blitz3d на юнити переходил:D
Название: Re: Общие обзоры событий, методов и программных решений, в Unity3D
Отправлено: Mimi Neko от Июль 25, 2012, 01:56:38 am
Функции Update, FixedUpdate, LateUpdate

Update функция  - вызывается каждый кадр, всё что там запускается, влияет на FPS, и будет вызываться с разной частотой, на разных компьютерах.

FixedUpdate функция вызывается по таймеру, через равные промежутки времени (по умолчанию через 0,02) тоесть, не влияет на FPS.

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

FixedUpdate рекомендуется в основном, размещать рассчёты физики, если они есть.
А вот Update, тяжёлыми рассчётами или манипуляциями, лучше не загружать, так как это подсаживает FPS.
В этом может помочь использование корутин, или другая разбивка операций по кадрам.
Название: Re: Общие обзоры событий, методов и программных решений, в Unity3D
Отправлено: Alcatraz от Июль 25, 2012, 09:29:51 am
Такс, опишу тоже функции, только постараюсь захватить по-больше:

Методы: OnGUI, OnTriggerEnter, OnTriggerStay, OnTriggerExit, OnCollisionEnter,OnCollisionStay, OnCollisionExit, Awake, Start.

* OnGUI - Выполняется прорисовку каждый кадр, элементов GUI. В Unity3D 3.5, и меньше, GUI довольно слабый, сам с этим сталкивался не раз, в методе OnGUI, лучше не брать \ искать компоненты, запускать циклы, и выполнять операции, которые могут легко посадить оптимизацию.

* OnTriggerEnter (tr : Collider) , OnTriggerStay, OnTriggerExit- Проверка входа игрока(или другого объекта) в объект-триггер (объект с коллайдером, и стоящей галочкой в коллайдере "is trigger"), и происходит действие, OnTriggerEnter- проверяет при входе в триггер, OnTriggerStay - проверяет нахождение в триггере, OnTriggerExit - проверяет выход из триггера пример:

function OnTriggerEnter (tr : Collider) {
if(tr.transform.tag == "Player") {
Debug.Log("Player In Trigger");
}
}

* OnCollisionExter(col : Collision), OnCollisionStay, OnCollisionExit - То же что и OnTrigger, только проверка столкновений:

function OnCollisionEnter(col : Collision) {
if(col.transform.tag == "Player") {
Debug.Log("Collsion With Player");
}
}

Функции Awake и Start:
Awake - Инициализация переменных, мгновенно,идёт перед функцией Start.
Start - Вызывается при запуске игры, после уже её начала.
Название: Re: Общие обзоры событий, методов и программных решений, в Unity3D
Отправлено: Mimi Neko от Август 28, 2012, 14:57:04 pm
Анимация объектов
Часто с этим бывают у народа непонятки.

Примеры приведены на С#!

Запуск проигрывания анимации:

animation.Play("walk"); - простой запуск
animation.CrossFade("walk"); - запуск, обеспечивающий более гладкие переходы, в начале и оконьчании клипа.
animation.CrossFade("Walk", 0.5F); - А вот так можно задавать сглаживание переходов между анимациями!


Анимирование объекта, на котором висит этот скрипт:
using UnityEngine;
using System.Collections;
 
public class example : MonoBehaviour {
    void Awake() {

        animation.Play("walk");//можно опустить все параметры, тогда будет играться анимация по дефолту
        animation.Play("walk", PlayMode.StopAll);
    }
}

Анимация объекта, на который указывает переменная Object:
Object.animation.Play("walk");


Параметр PlayMode может быть:
StopAll - остановить все анимации объекта
StopSameLayer - остановить проигрывание анимаций всего слоя

Для того чтоб указать как проигрывать анимацию (раз,зациклено и т.д) можно проставить это в меню визуального редактора:
(http://docs.unity3d.com/Documentation/Images/manual/Meshes-2.jpg)
 - Вот тут, в разделе Animations, целую дорожку анимации нужно разделить на клипы, и назначить каждому клипу имя. 
Обратите внимание, что тут же сразу можно задать режим, в котором будет проиграна анимация.
Общий режим для всех анимаций: Animation Wrap Mode, или Wrap Mode для любого клипа отдельно.


Или, режим проигрывания анимации, можно менять прямо в скриптах, с помощью animation.wrapMode или animationState.wrapMode:

Повторяющаяся анимация:
using UnityEngine;
using System.Collections;
 
public class example : MonoBehaviour {
    void Awake() {

        // Анимация ходьбы должна повторяться (персонаж идёт)
        animation["Walk"].wrapMode = WrapMode.Loop;
    }
}

Неповторяющаяся анимация:
using UnityEngine;
using System.Collections;
 
public class example : MonoBehaviour {
    void Awake() {

        // Анимация ходьбы проигрывается 1 раз (персонаж делает 1 шаг)
        animation["Walk"].wrapMode = WrapMode.Once;
    }
}

Где WrapMode может быть следующим:
Once - проигрывает анимацию и останавливает её.  (Перематывая на начало! - бред конечно...)
Loop - зацикливает анимацию,останавливается принудительно.
PingPong - зацикливает анимацию,но она проигрывается сначала вперёд,потом назад.
Default - проигрывает анимацию согласно установкам в визуальном редакторе.
ClampForever - проигрывает ВСЮ анимацию и встаёт на последнем кадре. ( На самом деле, нихрена не встаёт!
 при этой опции, процесс проигрывания достигает конца анимации, и затем идёт бесконечно долго так, как будто дальше пустая дорожка.  - Очень досадная недоделка разработчиков!)


Чтоб установить скорость анимации используется визуальный редактор, либо функция AnimationState.speed:

using UnityEngine;
using System.Collections;
 
public class example : MonoBehaviour {
    void Awake() {

        // Проиграть анимацию в обратном направлении
        animation["Walk"].speed = -1.0F;

        // Проиграть анимацию с удвоенной скоростью
        animation["Walk"].speed = 2;
    }
}

источник (http://shgames.ru/index.php?title=3D_%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B_%D0%90%D0%BD%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0:Animate)

---------------- Компонент animation: -----------------

Переменные:
clip    - Анимация по умолчанию.
playAutomatically    - Должен ли анимационный клип (Animation.clip) воспроизводиться автоматически при старте.
wrapMode    - Каким образом должна воспроизводиться часть клипа.
isPlaying    - Воспроизводится ли сейчас какая-либо анимация
this [string name]    - Возвращает состояние анимации с именем name.
animatePhysics    - Если включено - анимация выполняется в цикле физики. Используется только для рассчета кинематики тела
cullingType    - Управляет отбраковкой текущего компонента Animation
localBounds    - AABB этой анимации компонента Animation в локальных координатах

Функции:
Stop    - Останавливает все воспроизводящиеся анимации текущего компонента Animation
                   (при этом, Stop перематывает остановленые анимации на начало)
Rewind    - Перематывает на начало анимацию с именем name.
Sample    - Образцы анимации в текущем состоянии
IsPlaying    - Воспроизводится ли сейчас анимация с именем name
Play    - Воспроизводит анимацию без смешиваний.
CrossFade    - Заставляет затухать анимацию с именем animation в течение периода времени time в секундах и проявляет другую анимацию.
Blend    - Смешивает анимацию с именем animation с targetWeight в течение следующих time секунд.
CrossFadeQueued    - Кроссфейд анимации после того, как предыдущая анимация закончит воспроизводиться.
PlayQueued    - Воспроизводит анимацию после того, как предыдущая анимация закончит воспроизводиться.
AddClip    - Добавляет clip в анимацию с именем newName.
RemoveClip    - Удаляет клип из списка анимаций.
GetClipCount    - Получает количество клипов добавленных к текущей анимации
SyncLayer    - Синхронизирует скорость воспроизведения всех анимаций в слое layer.

Унаследованные члены:
Унаследованные переменные enabled   - При Enabled происходит обновление, при disabled Behaviours нет.
 transform   - Transform, присоединенный к данному игровому объекту GameObject (если нет добавленных возвращает null).
 rigidbody    - Компонент Rigidbody, добавленный к тому же объекту GameObject (если нет добавленных возвращает null).
 camera    - Компонент Camera, добавленный к тому же объекту GameObject (если нет добавленных возвращает null).
 light    - Источник света Light, добавленный к тому же объекту GameObject (если нет добавленных возвращает null).
 animation    - Компонент Animation, добавленный к тому же объекту GameObject (если нет добавленных возвращает null).
 constantForce    - Компонент ConstantForce, добавленный к тому же объекту GameObject (если нет добавленных возвращает null).
 renderer    - Компонент Renderer, добавленный к тому же объекту GameObject (если нет добавленных возвращает null).
 audio    - Источник звука AudioSource, добавленный к тому же объекту GameObject (если нет добавленных возвращает null).
 guiText    - Компонент GUIText, добавленный к тому же объекту GameObject (если нет добавленных возвращает null).
 networkView    - Компонент NetworkView, добавленный к тому же объекту GameObject (Только для чтения). (если нет добавленных возвращает null)
 guiTexture    - Компонент GUITexture, добавленный к тому же объекту GameObject (Только для чтения). (если нет добавленных возвращает null)
 collider    - Компонент Collider, добавленный к тому же объекту GameObject (если нет добавленных возвращает null).
 hingeJoint    - Компонент HingeJoint, добавленный к тому же объекту GameObject (если нет добавленных возвращает null).
 particleEmitter    - Компонент ParticleEmitter, добавленный к тому же объекту GameObject (если нет добавленных возвращает null).
 particleSystem    - Компонент ParticleSystem, добавленный к тому же объекту GameObject (если нет добавленных возвращает null).
 gameObject    - Игровой объект, к которому присоединен текущий компонент. Компонент всегда присоединен к игровому объекту.
 tag    - Тэг игрового объекта.
 name    - Имя объекта.
 hideFlags    - Является ли объект скрытым, сохраненным в сцене или изменяемым пользователем.

Унаследованные функции:
GetComponent    - Возвращает компонент типа type если такой присоединен к игровому объекту. Если нет - null.
 GetComponentInChildren    - Возвращает компонент типа type в GameObject или любой из его дочерних в зависимости от глубины поиска.
 GetComponentsInChildren    - Возварщает все компоненты типа type в GameObject or any of its children.
 GetComponents    - Возварщает все компоненты типа type в GameObject.
 CompareTag    - Имеет ли этот текущий игровой объект тэг tag?
 SendMessageUpwards    - Вызывает метод с именем methodName в каждом MonoBehaviour в текущем игровом объекте и в каждом родительском.
 SendMessage    - Вызывает метод с именем methodName в каждом MonoBehaviour в текущем игрвом объекте.
 BroadcastMessage    - Вызывает метод с именем methodName в каждом MonoBehaviour в текущем игровом объекте и во всех дочерних по отношению к нему.
 GetInstanceID    - Возвращает идентификатор экземпляра объекта.
 ToString    - Возвращает имя игрового объекта.

Унаследованные функции класса:
operator bool    - Существует ли объект.
 Instantiate    - Клонирует объект original и возвращает его копию.
 Destroy    - Удаляет игрвой объект, компонент или ассет.
 DestroyImmediate    - Уничтожает объект obj . Рекомендуем использовать вместо Destroy.
 FindObjectsOfType    - Возвращает список всех активных загруженных объектов типа type.
 FindObjectOfType    - Возвращает первый активный загруженный объект типа type.
 operator ==    - Сравнивает являются ли два объекта идентичными
 operator !=    - Сравнивает являются ли два объекта не идентичными
 DontDestroyOnLoad    - Делает объект target не уничтожаемым автоматически при загрузке новой сцены.

Так же полезный материал, в  виде перевода официальной документации, касающейся анимаций и работы с ними, можно прочесть на этой странице: Character Animation (http://docs.unity3d.ru/Manual/Character-Animation.html)



Получение состояние любой анимации:

AnimationState state = animation["walk"];

Теперь мы можем получить почти любую информацию об данной анимации и её состоянии

if(state.enabled) ... //Проигрывается ли данная анимация

Но к большому сожалению, пока что в Unity3d непредусмотрено никаких средств узнать, что анимация добавлена в очередь стека
отсроченого проигрывания анимаций, с помощью
PlayQueued;

Однако, можно организовать параллельный стек, для хранения последовательности анимаций, и с помощью него определять, присутствует ли там анимация, и данные о ней:
void Start () {

Queue state = new Queue();

animation.Play("idle");

animation.PlayQueued("walk");
state.Enqueue(animation["walk"]);

Debug.Log(state.Count);//1
Debug.Log((state.Peek() as AnimationState).clip.GetInstanceID());//(6578)
Debug.Log((state.Peek() as AnimationState).name);//walk
Debug.Log(state.Contains(animation["walk"]));//true
Debug.Log(state.Count);//0

}

Разумеется, придётся заботится и о том, чтобы снимать из этого стека анимации, начавшие играть.

Подробнее об AnimationState:
http://docs.unity3d.com/ScriptReference/AnimationState.html

Подробнее об Queue:
http://msdn.microsoft.com/ru-ru/library/system.collections.queue.aspx
http://www.dotnetperls.com/queue





Проверки оконьчания проигрывания анимации:

Самый простой конечно способ:
if(animation["Анимация"].IsPlaying) //анимация проигрывается!
else //анимация не проигрывается

- однако же, не проигрываться анимация может по разным причинам. может быть она и не запускалась?

Способ с корутиной:
IEnumerator Example() {
    animation.Play();
    yield return new WaitForSeconds(animation["Анимация"].clip.length);
}

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

И третий вариант - непосредственное получение временного кадра, на котором в данный момент находится указатель проирывания:

Для этого, в свойствах анимации нужно установить "Clamp Forever"

А затем, где надо, проверяем анимацию:

if(animation["Анимация"].time >= animation["Анимация"].length) //эта анимация была проиграна до конца!
Анимация проигрывается, и её указатель остаётся там где закончилось проигрывание.
Чтобы проиграть снова - нужно перемотать анимацию в начало клипа:

animation.Rewind("Анимация");Так же этот способ, требует ручной остановки анимации через Stop. иначе, пустая дорожка так и будет проигрываться бесконечно.




Название: Re: Общие обзоры событий, методов и программных решений, в Unity3D
Отправлено: Mimi Neko от Сентябрь 02, 2012, 17:05:29 pm
Raycast, Работа с рейкастом:

Простейший рейкаст

Самый простой рейкаст, может быть задан двумя путями:
 - с помощью Ray
 - с помощью Position и Direction

Что такое Ray? - это луч.
Цитировать
Ray (Луч) - это линия бесконечной длины, начинающаяся в origin и идущая в направлении direction
http://docs.unity3d.com/ru/current/ScriptReference/Ray.html
Ray ray = new Ray(координаты начальной точки, направление луча);

Что такое Direction? - это направление луча.


Визуализация рейкаста для отладки
Для визуализации, можно использовать два метода:
- Debug.DrawLine  (рисовать линию, тоесть отрезок от точки до точки)
- Debug.DrawRay   (рисовать луч)

Документация:
http://docs.unity3d.com/ru/current/ScriptReference/Debug.DrawLine.html
http://docs.unity3d.com/ru/current/ScriptReference/Debug.DrawRay.html

Есть моменты, которые могут сбить с толку новичков и не только, при работе с рейкастом.
Важно понимать, что Debug.DrawLine рисует отрезок от точки до точки, поэтому он удобен для визуализации попаданий рейкаста, когда у нас есть конкретная точка попадания луча.

А вот для для визуализации направления луча (даже без рейкаста), используется другой схожий метод:
Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward), Color.blue, 0, false);
- Как видно, он принимает исходную отправную точку, и направление луча (дирекшн), что весьма удобно, если точка столкновения, пока ещё неизвестна.


Пример использования рейкаста без Ray:
float distance = 10f;//Дистанция луча
RaycastHit hit;//Хит попадание луча в коллайдер
Vector3 direction = this.transform.TransformDirection(Vector3.forward);//Задаём направление луча - вперёд

Debug.DrawRay(this.transform.position, direction * distance , Color.blue, 0, false);//визуализация направления луча

if(Physics.Raycast (this.transform.position, direction, out hit, distance)){ //Пускаем луч, и проверяем, попали ли в коллайдер

      Debug.DrawLine(this.transform.position, hit.point, Color.red, 0, false);//Попали в коллайдер - рисуем красный отрезок
}


Пример использования рейкаста с Ray:
    float distance = 10f;//Дистанция луча
    RaycastHit hit;//Хит попадание луча в коллайдер
    Ray ray = new Ray(this.transform.position, this.transform.forward);//Формируем луч
    Debug.DrawRay(ray.origin, ray.direction * distance, Color.blue, 0, false);//визуализация направления луча
    if(Physics.Raycast(ray, out hit, distance)){ //Пускаем луч, и проверяем, попали ли в коллайдер

Debug.DrawLine(ray.origin, hit.point, Color.red, 0, false);//Попали в коллайдер - рисуем красный отрезок
    }



//Пример рейкаста, и данных, которые могут быть получены с его помощью:
public float Distance = 20f;// Задаём дальность действия луча (пулей)

//weapon.transform.position - за  начало луча, можно взять центр нашего оружия, или ствола оружия, или добавить к нему корректировку, при необходимости
//weapon.transform.forward - указывает, что луч идёт ровно вперёд.

Ray ray = new Ray(weapon.transform.position, weapon.transform.forward);

RaycastHit hit;//Переменная для приёма результата попадания луча

//Стреляем лучём вперёд:
if(Physics.Raycast (ray, out hit, Distance)){

    //Для теста и отладки: Показываем визуально лучём, попадание нашей   "пули". 
    //цифра 2 тут - время показа луча, после он исчезает.
    Debug.DrawLine (ray.origin, hit.point, Color.red, 2, false);

     //Теперь мы можем узнать:

     //hit.distance - дистанция до обьекта, в который попал луч (пуля)

     //hit.collider - сам объект в который мы попали

     //hit.collider.name - имя  объекта, в который мы попали

     //Destroy (hit.collider.gameObject); - уничтожить объект вкоторый мы попали

     //Destroy (hit.collider.gameObject, 5); - уничтожить объект вкоторый мы попали, через 5 секунд после попадания

     //hit.collider.animation.Play(); - проиграть анимацию "поражения" объекта

}

Документация:
http://docs.unity3d.com/ru/current/ScriptReference/Physics.Raycast.html
http://docs.unity3d.com/ru/current/ScriptReference/RaycastHit.html
Название: Re: Общие обзоры событий, методов и программных решений, в Unity3D
Отправлено: Mimi Neko от Сентябрь 27, 2012, 04:33:32 am
Использование глобальных переменных:

В главном скрипте, в самом начале объявляем статический класс глобальных переменных:
public static class Global  {

   public static string text;// объявляем статическую глобальную переменную.
}


Доступ к переменной в любом скрипте:

Global.text = "123";

или

x = Global.text;
--------------------------------

Либо так:

public class Global{
     
     public static Global var = new Global();
     public float x = 10f;

}

И обращение в любом скрипте:
Global.var.x  += 5;
int  x = Global.var.x;

--------------------------------------------------------

Или вот так, набор глобальных переменных, по типам объектов:
public static class Global {

public static class Player {

    public static string name;

}

public static class Mob {

    public static string name;

}

public static class GO {

    public static string name;

}
}

И потом в любом скрипте:
Имя_персонажа = Global.Player.name;
 Имя_моба = Global.Mob.name;
 Название_геймобъекта = Global.GO.name;
Название: Re: Общие обзоры событий, методов и программных решений, в Unity3D
Отправлено: Mimi Neko от Сентябрь 27, 2012, 04:37:19 am
Доступ к переменным JS скрипта, из C# скрипта:

Создаём в папке Assets проекта, папку Plugins
И в неё помещаем js скрипты, с которыми хотим работать, из наших C# скриптов.
(Это важно! так как компилятор будет в первую очередь компилировать скрипты из этой папки, чтобы перевести их в общий код проекта)

На сцене объект (примитив куб), на который повешены 2 скрипта: test.js из папки Plugins, и test2.cs из корня или папки Scripts.

Далее, в js скрипте с именем test.js:
#pragma strict

public var x:String;
function Update () {
 x = ""+10;
}


А в нашем C# скрипте:
using UnityEngine;

public class test2 : MonoBehaviour {

  private test script; // переменная, в которой будет храниться ссылка на наш js скрипт

  private string message = "";// переменная вывода тестовых данных на экран

  // Получаем ссылку на нужный нам скрипт 1 раз, при запуске:
  void Awake() {
    script = this.GetComponent<test>();// И сохраняем в переменной.
  }

...
...
...

  void Update () {

      message = " X = " + script.x; // выводим значение переменной, из js скрипта

  }

   // Функция вывода данных на экран:
   public void OnGUI() {
      GUI.color = Color.white;
      GUI.Box( new Rect(10,10,250,200), message);
    }

}
Название: Re: Общие обзоры событий, методов и программных решений, в Unity3D
Отправлено: Mimi Neko от Октябрь 18, 2012, 10:15:15 am
Динамическое добавление и удаление ресурсов на сцену

В окне Project необходимо создать папочку Resources, которая и будет содержать, все наши ресурсы, для динамичной подгрузки.

Допустим, там у нас лежит префаб, по имени pref1
Который мы можем загрузить в сцену, с приведением типа объекта к геймобъекту так:
go =(GameObject)Instantiate(Resources.Load("pref1"), TargetPoint, AngleRotation);
go.name = "go1";

 go - это ГеймОбъект, которому лучше сразу задать уникальное имя, оно пригодится для обращения к нему или удаления.

 TargetPoint - Координаты Vector3, обозначающие точку, куда поместить объект.

 AngleRotation - Как и куда будет повёрнут объект. (если Quaternion.identity - значит без поворота.)
 Также возможно и
  Instantiate(Resources.Load("pref1"), TargetPoint, Quaternion.Euler(0f, 0f, 0f));
 Замечу, что префаб разместится на сцене, в виде ГеймОбъекта с именем pref1 (Сlone), а не с именем pref1, как ожидалось.
И все остальные клоны данного префаба, по умолчанию, будут иметь тоже самое имя, тоесть, получим массу гейм объекстов с одним и тем же именем.
Чтобы этого избежать, - переименовываем объект, сразу после установки на сцену.

Возможные варианты:

Установка префаба, как юнити-объект (не путать с гейм-объект!):
Object  o = Instantiate(Resources.Load("pref1"), TargetPoint, AngleRotation);
Установка префаба, c объявлением переменной GameObject, и приведением к типу GameObject:
GameObject go  = (GameObject)Instantiate(Resources.Load("pref1"), TargetPoint, AngleRotation);
Или аналогично:

Установка префаба, c объявлением переменной GameObject, и приведением к типу GameObject:
GameObject go  =Instantiate(Resources.Load("pref1"), TargetPoint, AngleRotation) as  GameObject;
Установка префаба как геймобъекта, без присваивания ему  переменной-ссылки, как на геймобъект:
Instantiate(Resources.Load("pref1"), TargetPoint, AngleRotation) as  GameObject;
 - В таком случае, префаб будет так же загружен и установлен, но на него, как на гейм объект, не будет готовой ссылки, а значит,  обратится к нему будет можно, лишь найдя его через функции поиска (только если имя его уникально).


Установить префаб на сцену, как трансформ:
private Transform prefab;
...
...
Transform tr = Instantiate(prefab, TargetPoint, AngleRotation) as Transform;

или аналогично:
Transform tr = Instantiate(prefab, new Vector3(TargetPoint.x, TargetPoint.y, TargetPoint.z), Quaternion.identity) as Transform;

Варианты минимальной установки:
Transform tr = Instantiate(prefab);Instantiate(prefab);

Установка префаба как Гейм Объекта:

public GameObject prefab;

GameObject go = Instantiate(prefab) as GameObject;
go.name = "Имя игрового объекта";


Подробности тут: http://docs.unity3d.com/Documentation/ScriptReference/Object.Instantiate.html

========================================

Удаление динамически подгруженого гейм объекта со сцены, вопреки здравому смыслу, походу возможно лишь так:

Если не переименовывали, то по имени префаба + (Сlone)
Destroy(GameObject.Find("pref1 (Сlone)"));
А если переименовали - по имени, которое задали этому объекту:
Destroy(GameObject.Find("go1"));
 - Другого метода, увы, я пока нигде не нашёл... :(  Если кто найдёт - прошу его тут описать.
 Непонимаю, почему нельзя просто дестроить геймобъект, по ссылке (GameObject go  =) на него?!


=======================================


Ещё очень важны функции выгрузки ресурсов, которые больше не используются в сцене, чтобы освобождать память.


  Resources.UnloadUnusedAssets();    - выгрузит все неиспользуемые ресурсы (которые например, удалены со сцены, или находились на предыдущей сцене, которую сменила новая)

 Также можно выгружать из памяти, только выбранные ресурсы, что в отличии от предыдущей функции, гораздо быстрее:
 Resources.UnloadAsset(assetToUnload:Object);

===================

 Ну и в догонку, проверить, удалился ли объект, можно так:  if(go == null)...
Название: Re: Общие обзоры событий, методов и программных решений, в Unity3D
Отправлено: Mimi Neko от Июнь 06, 2013, 01:09:52 am
Экономия системных ресурсов

Один из вариантов, не транжирить зря системные ресурсы - это стремиться выполнять как можно меньше операций в вызовах Update() и LateUpdate(), а то что выполнять необходимо - выполнять как можно реже.

Один из очень удачных вариантов тут - это вот этот хитрый трюк с таймером:
if(Time.frameCount % 20 == 0 ) ...
 - Это условие срабатывает каждый 20 кадр. Думаю излишне дальше объяснять, всю пользу такого условия!  ;)


А так же, очень полезны Coroutine
Coroutone - это метод разбивки какой-либо операции или процесса, на равномерное выполнение в каждом кадре.
В итоге получается, что вместо того, чтобы выполнить за один кадр, весь объём действий (что вызовет заметный фриз приложения), это будет выполняться понемногу, каждый кадр, пока не выполнится весь объём действий.

Coroutine - это функция вида:

StartCoroutine(Coroutine()); //первоначальный запуск корутины

//Сама функция корутины:
public IEnumerator Coroutine()
{
    //{ возможный цикл
      // Выполняемые действия

        yield return (условие, управляющее корутиной);
   //} возможный цикл

    //StartCoroutine(Coroutine()); - возможный запуск корутины снова,
}

Возможные прерывания корутины:
 yield return null; - прерывает выполнение корутины до следующего кадра.
 yield break; завершает выполнение корутины.
 yield return new WaitForSeconds( количество секунд ); - прерывает на время.
 yield return new WaitForEndOfFrame(); - прерывает выполнение до конца кадра.
 yield return new WaitForFixedUpdate(); - прерывает выполнение до кадра, в котором обновляется физика.
 yield return www; - прерывание по факту завершения получения в переменной www, интернет-контента
(например, по факту  завершения загрузки чего-либо)

Полезные подробности по корутинам, можно почитать тут:
http://docs.unity3d.com/Documentation/ScriptReference/Coroutine.html
http://docs.unity3d.com/Documentation/ScriptReference/YieldInstruction.html
http://docs.unity3d.com/Documentation/ScriptReference/MonoBehaviour.StartCoroutine.html?from=YieldInstruction
Сопрограммы (Coroutone) (http://shgames.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8:%D0%A1%D0%BE%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B_(Coroutone))
Название: Re: Общие обзоры событий, методов и программных решений, в Unity3D
Отправлено: Mimi Neko от Ноябрь 15, 2013, 01:26:21 am
Статья на Хабре: 6 полезных трюков в Unity3D (http://habrahabr.ru/post/202198/)

Документашка по Юнити, в русском переводе, на официальном сайте:
http://docs.unity3d.com/ru/current/Manual/class-Rigidbody.html
Название: Re: Общие обзоры событий, методов и программных решений, в Unity3D
Отправлено: Mimi Neko от Ноябрь 06, 2016, 14:08:56 pm
Работа с векторами:

Vector3.Lerp(startPosition, endPosition, Time.deltaTime(Time.tim/60)) — плавное передвижение объекта c одной точки в другую (вычитание промежуточных переменных называется Интерполяцией)

Vector3.Slerp(startPosition, endPosition, Time.deltaTime(Time.tim/60)) — плавное передвижение объекта по дуге c одной точки в другую

Vector(2,3,4).Magnitude — Находит длину вектора, это может быть вектор скорости, растояния, силы.

Vector(2,3,4).sqrMagnitude — тоже самое что и выше только без вычитания корня

Vector(2,3).ClampMagnitude(вектор, ограничитель) — ограничения вектора заданными параметрами,
используется для ограничения передвижения по диагонали.

Vectror(2,3) A — Vectror(2,3) B — вычитание векторов используется чтобы получить вектор движения, перемещения. порядок имеет значение.

Vector(2,3) A * speed — умножение вектора на скаляр speed используется чтобы ускорить или замедлить обьект, например можно использовать для влияние с помощью сил: дождь, ветер, солнце.

Vestor(2,3,4).Distance(endPos,startPos) аналогично (endPos-startPos).Magnitude — расстояние между двумя точками (вычитаение точек и находим длину найденного вектора)

public Vector3.normalized — возвращает копию вектора, который нормализирован, тоесть длина вектора (magnitude) составляет 1, направление копии такое же как и оригинала

public void Normalize() — функция выполняет нормализацию вектора, если значения слишком малы для нормализации, то возвращает 0 ( Нормализация производится просто, каждый параметр делится на длину вектора). Нормализированный вектор используется для контроля, чтобы точно управлять, например, скоростью.

Vector(2,3).Dot (Vector3 A, Vectror3 B) — скалярное произведение векторов (Dot Product), возвращает скаляр от -1 до 1. По сути, это перемножение двух векторов после чего умноженных на косинус угла между векторами. Используется в игре, например, для проверки находится ли герой в поле зрения врага.
Если 1 — то векторы паралельный,
если больше 0, то векторы направлены в одну сторону, но не паралельны,
если 0 , то векторы перпендикулярны,
если меньше 0, то векторы направлены в разные стороны,
если -1, то векторы паралельны но направлены в разные стороны.cos 0 — 1
cos 60 — 0.5
cos 90 — 0

Vector3.Cross(Vector3 A, Vector3 B) — использует для поиска нормали (перпендикуляра) к плоскости, чтобы узнать куда смотрит тот или иной обьект.Величина результата равна произведению величин исходных векторов, умноженному на синус угла между ними. Для поиска направления вектора используется правило левой руки (большой палец, это первый вектор, указательный второй, средний палец укажет направление перпендикуляра)

Поворот точки на угол angle: 
rotated_point.x = point.x * cos(angle) — point.y * sin(angle); rotated_point.y = point.x * sin(angle) + point.y * cos(angle);

Vector3.SmoothDamp плавное перемещение параметры описаны тут
public static Vector3 SmoothDamp(Vector3 current, Vector3 target, ref Vector3 currentVelocity, float smoothTime, float maxSpeed = Mathf.Infinity, float deltaTime = Time.deltaTime);

Дополнительные материалы:
Таблицы Брадиса — http://uchim.org/matematika/tablica-bradisa — опеределение угла cos sin с помощью числа.

источник: https://unity-help.tk
Название: Re: Общие обзоры событий, методов и программных решений, в Unity3D
Отправлено: Mimi Neko от Ноябрь 06, 2016, 14:14:10 pm
Полезные функции:

Light.
intensity — интенсивность
range — расстояние
color — цвет
———
enabled — влючено или выключено (=true/false)
tag — ярлык объекта
name -название объекта
gameObject — объект к которому присоединен компонент
transform — доступ к компоненту Transform подключенному к данному обьекту( если такого нет то null)

Mathf.
PingPong(float t, float Length) — значение t никогда не будет меньше 0 или больше Length;
Pi — число пи 3.14
Deg2Rad — градусы в радианы (deg * Mathf.Deg2Rad)
Rad2Deg — радианы в градусы (rad * Mathf.Rad2Deg)
MIn (float one, float two) — минимальное значение
Max(float one, float two) — максимальное из двух
Roud — округление до ближайшего целочисленного
Lerp (min,max,t) — линейная интерполяция (вычисление промежуточных значений), где t — промежуточное значение которое необходимо просчитать ( как правило используют Time.time, если необходимо выполнить расчет от начала до конца) (Color.Lerp — интерполяция по цвету)
LerpAngle — интеполяция для угла поворота.
public static float SmoothDamp(float current, float target, ref float currentVelocity, float smoothTime, float maxSpeed = Mathf.Infinity, float deltaTime = Time.deltaTime); — постепенно меняет значение через определенный период времени пока не достигнута цель, где

float current — текущая позиция
float target — позиция к которой мы пытаеся дойти
ref float currentVelocity — скорость передвижения, меняется функцией при каждом вызове.
float smoothTime — примерное время передвижения
float maxSpeed — максимальная скорость передвижения, можно ограничить
float deltaTime — время последнего вызова функции по умолчанию Time.deltaTime
void Update() {
float newPosition = Mathf.SmoothDamp(transform.position.y, target.position.y, ref yVelocity, smoothTime);
transform.position = new Vector3(transform.position.x, newPosition, transform.position.z);
}

.

GameObject.

activeSelf — возможно только читать, не проверяет предков , вернет true, даже если предки не активны
public bool activeInHierarchy — делает проверку активен ли данный GameObject в игре, проверяет предков, вернет true если и предки активны
public void SetActive(bool value); — устанавливает значения true/false чтобы активировать или деактивировать обьект.
GameObject — создает новый игровой объект с именем name, всегда прикрепляется Transform

// Создает обьект с именем Player и добавляет 2 компонента
// Rigidbody и BoxCollider
GameObject player;
player = new GameObject("Player");
player.AddComponent<Rigidbody>();
player.AddComponent<BoxCollider>();

источник: https://unity-help.tk
Название: Re: Общие обзоры событий, методов и программных решений, в Unity3D
Отправлено: Mimi Neko от Ноябрь 06, 2016, 14:16:16 pm
Передвижение персонажа в 3D: (один из вариантов)
http://flight-dream.com/forum/index.php?topic=1709.msg11524#msg11524

Передвижение персонажа в 2D: (один из вариантов)
http://flight-dream.com/forum/index.php?topic=1709.msg11525#msg11525

Передвижение камеры RPG в 3D:  (один из вариантов)
http://flight-dream.com/forum/index.php?topic=1710.msg11523#msg11523