10 Things You Should Know In Programming Unity3D Games

10 Things You Should Know In Programming Unity3D Games

Сообщение TexeL 16 апр 2012, 11:03

ИзображениеИзображение
Аватара пользователя
TexeL
UNITрон
 
Сообщения: 244
Зарегистрирован: 15 ноя 2009, 20:57
  • Сайт

Re: 10 Things You Should Know In Programming Unity3D Games

Сообщение Syberex 16 апр 2012, 12:25

А перевод? ;)
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: 10 Things You Should Know In Programming Unity3D Games

Сообщение seaman 16 апр 2012, 13:54

1. Называйте переменные myFooBar а не my_foo_bar.
Чисто для нормального отображения в инспекторе.
2. Будьте осторожны при прямом изменении transform.localPosition
Если у объекта, которым Вы управляете есть "родитель" в иерархии, то смещение Вашего объекта будет пересчитано в его координатную систему, и видимое смещение не соответствовать ожидаемому. Лучше использовать Transform.Translate(x,y,z)
3. Публичные переменные также доступны в окне анимации.
Просто напоминание, что там не только трансформ, но и любая публичная переменная, например альфа спрайта.
4. Наследование - великая вещь(!), и GetComponent.<base_class>() отлично работает!
Имеем два класса, унаследованные друг от друга:
Синтаксис:
Используется csharp
public class foo : MonoBehaviour {
    ...
}
 
public class bar : foo {
    ...
}

И две переменные этих типов:
Синтаксис:
Используется csharp
foo comp1 = A.GetComponent();
bar comp2 = B.GetComponent();

То переменная comp2 можно спокойно иметь тип foo, но содержать на самом деле bar:
Синтаксис:
Используется csharp
foo comp2 = B.GetComponent();

5. Invoke, yield зависят от timeScale.
Паузу в игре обычно делают, устанавливая timeScale = 0; Однако очень многие функции неожиданно зависят от timeScale. Среди них:
[list=]MonoBehaviour.Invoke(…)
MonoBehaviour.InvokeRepeating(…)
yield WaitForSeconds(…)
GameObject.Destroy(…)
Animation Component
Time.time, Time.deltaTime[/list]
Решение автор обещает в следующей заметке.
6. Instantiate() может ухудшать быстродействие.
Особенно на мобилах. Вместо этого можно заранее заготовить объекты, и перемещать их в нужное время в нужное место.
7. Различие между Awake() и Start()
Awake вызывается сразу при создании объекта, Start может быть вызвано в следующем кадре. Поэтому в этом примере:
player.cs:
Синтаксис:
Используется csharp
private Transform handAnchor = null;
private bool readyToGo = false;
void Awake () { handAnchor = transform.Find("hand_anchor"); }
void GetWeapon ( GameObject go ) { go.transform.parent = handAnchor; }
void Start () { readyToGo = true; }

other.cs:
Синтаксис:
Используется csharp
...
GameObject go = new GameObject("player");
go.AddComponent(); // Awake invoke right after this!
go.SendMessage( "GetWeapon", weapon_base.spawn("sword") );
...

handAnchor находится в Awake, чтобы гарантировать, что при go.SendMessage( "GetWeapon" он уже установлен.
8. List<T> может быть отображен в инспекторе, а Dictionary<K,V> нет
Если уж очень надо, можно использовать массив KeyValuePair
9. Вы можете ссылаться на Components в GameObject вместо самого GameObject
Обычно Вы определяете:
Синтаксис:
Используется csharp
GameObject otherGo = null;

Затем перетаскиваете нужный GameObject на эту переменную в инспекторе. Если же Вам нужен компонент на GameObject, Вы ищете его:
Синтаксис:
Используется csharp
otherGo.GetComponent();

Для ускорения делаете это в Start.
Однако можно сделать проще! Определяете переменную
Синтаксис:
Используется csharp
foobar otherFoobar = null;

А перетаскиваете в инспекторе на нее тот же объект! Юнити само найдет нужный компонент и присвоит его этой переменной.
10. #pragma strict
C# - строготипизированный язык, JS - нет. Однако для iOS требуется строгая типизация. Поэтому нужно писать
Синтаксис:
Используется javascript
var foobar:String = "Hello";

вместо
Синтаксис:
Используется javascript
var foobar = "Hello";

Ну, а чтобы не забыть в начале скрипта пишем #pragma strict.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: 10 Things You Should Know In Programming Unity3D Games

Сообщение Syberex 16 апр 2012, 15:22

Спасибо :-bd
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: 10 Things You Should Know In Programming Unity3D Games

Сообщение seaman 16 апр 2012, 18:31

Замечание.
10-й пункт устарел. в 3.5 по умолчанию в JS требуется строгая типизация.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: 10 Things You Should Know In Programming Unity3D Games

Сообщение Fenrir 19 фев 2013, 01:26

8. List<T> может быть отображен в инспекторе, а Dictionary<K,V> нет
Если уж очень надо, можно использовать массив KeyValuePair

Имеется ввиду KeyValuePair который находится в System.Collections.Generic ? или предлагается сделать собственный массив ключ-значение?
Если использовать KeyValuePair из System.Collections.Generic выдает
Assets/Scripts/SnailMovingScripts/SnailControl.cs(26,16): error CS0246: The type or namespace name `KeyValuePair' could not be found. Are you missing a using directive or an assembly reference?

Если по прямой ссылке - говорит, что нету такого в генерике. Хотя ктрл+пробел показывает как доступный и на мсдне есть инфа что такое доступно.
Аватара пользователя
Fenrir
UNIт
 
Сообщения: 52
Зарегистрирован: 08 мар 2012, 22:52
Откуда: Харьков

Re: 10 Things You Should Know In Programming Unity3D Games

Сообщение Woolf 19 фев 2013, 04:30

Будьте осторожны при прямом изменении transform.localPosition
Если у объекта, которым Вы управляете есть "родитель" в иерархии, то смещение Вашего объекта будет пересчитано в его координатную систему, и видимое смещение не соответствовать ожидаемому. Лучше использовать Transform.Translate(x,y,z)


Интересно, а кто когда работает с localPosition? Обычно работают с position. Еще, Transform.Translate работает с локальными координатами объекта, а не с мировыми (т.е. центр координат - это этот объект). Так что - тоже фейл. Странный совет какой-то.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: 10 Things You Should Know In Programming Unity3D Games

Сообщение pod4444 19 фев 2013, 11:21

с локалпозишин работают когда нужно смещать объект относительно родителя(ваш кэп), я лично использую.
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт


Вернуться в Tips & Tricks

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1