18:45

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Очень жаль, что вместе с синтаксисом js Unity взяла и часть проблем.(
Ну взяли бы только синтаксис и ничего больше, было бы ок. А так... неудобно, когда нельзя передать в функцию ссылку на переменную, а не её копию.

@темы: | soft |, | wtf |

Комментарии
14.09.2014 в 23:46

А чем объекты не устраивают?
Они вроде как раз по ссылке, не?
15.09.2014 в 09:09

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
JuraS, Та мне объекты не нужны как-то. На самом деле, оно очень странно работает.

Что имеем.
Имеем функцию вроде...

function superPuper(a, b, c) { ... }

Записать её можем несколькими способами.
1) function superPuper(a, b, c) { ... }
2) function superPuper(a:int, b:GameObject, c:boolean) { ... }
3) function superPuper(a:int, b, c) { ... }

Если нам надо просто передать в функцию значение переменной, то проблем нет.
Но! если нам надо передать указатель на переменную, чтобы она менялась, то возникает проблема.
В юнити (по крайней мере в js-синтаксисе) нельзя написать что-то вроде &$a как в php, или *a как в с.

Если бы это было однозначно, то ещё полбеды, но...

В одном случае function superPuper(a:int, b, c) { ... } меняет значение c, а в другом - нет.
И от чего это зависит я так и не понял.
Когда мне надо было перестроить массив,
то при function superPuper(myArray:Vector3[]) { ... } массив не менялся,
а при function superPuper(myArray) { ... } новые значения спокойно попадали в массив.

Казалось бы, всё ясно, если хочешь передать указатель на переменную, а не её значение, то в описании функции не надо указывать тип переменной. Но... тут я наткнулся на другой пример, когда function superPuper(myInt) { ... } значение переменной myInt меняло только в теле самой функции. То есть, это должен был быть счётчик - первая итерация = 1, вторая = 2, третья = 3 и так далее, начиная с 0. Но по факту, вывод лога показал что значение меняется 0-1-0-1-0-1-0-1. То есть, после всех изменений внутри функции, значение myInt так и не менялось, что говорит нам о том, что функция просто получила копию значения, а не указатель на переменную.

В общем, вот так оно. Было бы оно однозначно, не было бы проблем. Но чем больше общаюсь с юнити, тем больше понимаю, что ждать от неё однозначности более чем наивно.

В общем, вопрос решил путём объявления function superPuper() { ... } а внутри просто обращаюсь к переменным напрямую.
Не особо красиво получается, зато результат однозначен в любом случае. С другой стороны, не посмотришь какие параметры принимает функция, так что просто рядом в виде комментов расписал что есть что. + Надо следить за тем, что скармливаешь, иногда создавая дубликаты в области функции, чтобы не переписать нужную переменную.