Страница 1 из 1

10 Things You Should Know In Programming Unity3D Games

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

Re: 10 Things You Should Know In Programming Unity3D Games

СообщениеДобавлено: 16 апр 2012, 12:25
Syberex
А перевод? ;)

Re: 10 Things You Should Know In Programming Unity3D Games

СообщениеДобавлено: 16 апр 2012, 13:54
seaman
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.

Re: 10 Things You Should Know In Programming Unity3D Games

СообщениеДобавлено: 16 апр 2012, 15:22
Syberex
Спасибо :-bd

Re: 10 Things You Should Know In Programming Unity3D Games

СообщениеДобавлено: 16 апр 2012, 18:31
seaman
Замечание.
10-й пункт устарел. в 3.5 по умолчанию в JS требуется строгая типизация.

Re: 10 Things You Should Know In Programming Unity3D Games

СообщениеДобавлено: 19 фев 2013, 01:26
Fenrir
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?

Если по прямой ссылке - говорит, что нету такого в генерике. Хотя ктрл+пробел показывает как доступный и на мсдне есть инфа что такое доступно.

Re: 10 Things You Should Know In Programming Unity3D Games

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


Интересно, а кто когда работает с localPosition? Обычно работают с position. Еще, Transform.Translate работает с локальными координатами объекта, а не с мировыми (т.е. центр координат - это этот объект). Так что - тоже фейл. Странный совет какой-то.

Re: 10 Things You Should Know In Programming Unity3D Games

СообщениеДобавлено: 19 фев 2013, 11:21
pod4444
с локалпозишин работают когда нужно смещать объект относительно родителя(ваш кэп), я лично использую.