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, Вы ищете его:
Для ускорения делаете это в Start.
Однако можно сделать проще! Определяете переменную
Используется csharp
foobar otherFoobar = null;
А перетаскиваете в инспекторе на нее тот же объект! Юнити само найдет нужный компонент и присвоит его этой переменной.
10. #pragma strict C# - строготипизированный язык, JS - нет. Однако для iOS требуется строгая типизация. Поэтому нужно писать
Используется javascript
var foobar:String = "Hello";
вместо
Ну, а чтобы не забыть в начале скрипта пишем #pragma strict.