Unity3d

Unity3D это игровой движок 3D-игр в основном стрелялок и аркад, но при большой сноровке можно реализовать и RPG, RTS, квесты, 2D-игры, встраиваемые в браузер, iPhone и с использованием сети. Движок понимает множество разные форматы файлов

  • 3д модели и анимация из Maya, Cinema 4D, 3ds Max, Cheetah3D, Modo, Lightwave, Blender. Форматы 3ds, fbx и dae
  • практически все растровые изображения для маск и текстур
  • звуковые mp3, wav форматы для эффектов и фона

Профессиональная версия имеет более расширенные возможности по работе с динамическим освещением, сетевыми возможностями. Но даже без наличия блокбастерных игр о которых все бы слышали, unity успешно продвигается в плане комьюнити и «народного движка» и вполне возможно что с бесплатными плагинами можно будет написать игру ничем не уступающую платным.

IDE

Графическая оболочка разработчика (IDE) состоит из 4 основных панелей

  1. Графическое поле, переключающееся / вид игры (Game & Scene)
  2. Иерархия объектов (Hierarchy)
  3. Инспектор объекта (Inspector)
  4. Библиотека доступных ресурсов (Assets)
По используемости самое важное место это Инспектор, потому что именно в нём видны внутренности объекта (GameObject).

Создание карты

Карта (Terrain) создаётся очень просто из меню и по умолчанию уже есть. Курсором как в фотошопе можно изменять высоту рельефа (в том числе используя Shift). Более продвинутые господа придумали как импортировать карты из реального мира с помощью google earth, openTDD, делая так называемые heightmaps. Встроенный импорт работает только с raw форматами, надо использовать хак. Недавно вышел генератор карт.

Игровой объект Unity

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

Свои скрипты добавляются очень легко перетаскиванием в инспектор и публичные переменные сразу переводятся в названия с пробелами и значением по умолчанию. Для игрового объекта добавленные компоненты и с точки зрения ООП являются инкапсулированными объектами, хотя и играют в большинстве своём роль свойств (т.е. прилагательных - движущийся, крутящийся, выбираемый и тп.). По синтаксису скрипты пишутся на Javascript, C# или Boo скриптах со своими прибамбасами - глобальными объектами Unity, некоторыми своими ключевыми словами..

Взаимодействие объектов

Теперь когда понятно что игровое пространство состоит из кучи моделей у которых есть свои свойства и своё поведение встаёт вопрос а как же сама игра должна писаться. В отличие от desktop- и web- приложений, игры и сетевые приложения более асинхронны и поточны, тут как правило нет монолитных глобальных классов - объекты общаются между собой и в этом сила масштабирования - надо просто объекту написать события которые он поддерживает согласно игровой механике.

Поскольку объекты можно вкладывать друг в друга как dom-блоки, то искать по иерархии объекты можно несколькими путями. Жалко что ребята изобретали велосипед, вместо того что-бы взять существующие аналоги из html/js

  • Сразу писать название компонента скажем myWorkerGuy.someColorParam
  • Поиск по иерархии - transform.Find("MyWorkerGuy") - аналог html'ного getElementById
  • По тєгам, через GameObject.FindWithTag ("Worker")

Компонент объекта доступен через - GetComponent("Moveable").

Ещё одно мощное решение - вместо поиска объекта с проверкой наличия метода и затем вызова его, можно просто послать сообщение - gameObject.SendMessage("BegForFood",true), причём метод вызывается у всех компонентов.

Каждый компонент наследует класс Monobehaviour (в Javascript синтаксисе объявлять не нужно) и именно с ним приходится работать описывая логику и расширяя наследуемые методы которые сами вызываются когда движок решит это нужным, например:

  • Invoke - вызов третьего метода, в том числе периодический, аналог call_user_method в php + cron
  • Awake - своего рода конструктор, вызывающийся когда все объекты уже существуют.
  • Start - конструктор второго рода, вызывается после Awake
  • Update - вызывается каждый фрейм. Сюда идёт основная логика.
  • FixedUpdate - вызывается каждый n-фрейм, полезен для вычислений твёрдых тел
  • LateUpdate - вызов после всех Update вызовов, полезен для камеры
  • OnGui - сюда идёт показ кнопок, цифр для управления

Реальные нужды

После того как вы придумаете историю, надо продумать основные технические моменты. К этому моменту вы знаете что есть объекты и их характеристики (компоненты), но из чего состоит процесс игры?

  1. Рождение (Spawn) юнитов и врагов. Объект создаётся с указанием, где и с каким вращательным моментом. Как оказывается нарожать много умных юнитов с поддержкой всех фич (в частности физики) очень нагружает процессор.
    GameObject go = Instantiate (building,hit.point,Quaternion.identity) as GameObject;
  2. Управление камерой. Существуют уже заранее сделанные компоненты-скрипты на всякие случаи жизни, которые учитывают в том числе столкновение камеры со стеной и тп. Вот часть кода для изометрической камеры (добавьте остальные направления сами)

    if (Input.GetKey ("up") && transform.position.z<terrain.terrainData.size.z) {
    transform.position += linearSpeed*Vector3.forward* Time.deltaTime;
    }

    if(Input.GetAxis("Mouse ScrollWheel")>0  && transform.position.y>1){
    transform.position -= linearSpeed*Vector3.up* Time.deltaTime;
    }
  3. Выделение юнитов мышкой. Достаточно сложная задача - в кратце на камеру вешается обработчик нажатий и передвижения курсора. Независимо создаётся singleton-объект для хранения всех юнитов. При нажатии и передвижении курсора происходит проекция прямоугольника с маской ландшафта. Задача не из лёгких, потому что обрабатывать надо и deselect, учитывать клики для передвижения и атаки, рождение юнитов и тп. Возможно singleton не самое хорошее решение и лучше это сделать тэгами.
    mouseButton1UpPoint = screenPosition;
           
            var hit : RaycastHit;
            ray = Camera.main.ScreenPointToRay (screenPosition);        
            if ( Physics.Raycast (ray, hit, raycastLength, terrainLayerMask) )
            {

                selectionPointEnd = hit.point;

                UnitManager.GetInstance().SelectUnitsInArea(selectionPointStart, selectionPointEnd);
            }   
  4. Поиск пути (Pathfinding) и передвижение юнита кликами мышки очень алгоритмически увлекательная задача. К счастью существует отличное решение Арона Гранберга. Алгоритм A* интересно в теории, но в редакторе можно и запутаться. Основная идея в том что юниты имеют дискретную сетку клеток для расчёта передвижения. Сетка генерируется из ландшафта и можно задать ограничения по углу наклона, максимальной высоте и тп. В плане кода - очень сложная штука. На практике его решение подразумевает что у каждого передвигаемого объекта есть Seeker компонент которому прицеплена цель куда надо дойти. При установки цели буквально надо выполнить
    GetComponent("Seeker").StartPath (transform.position,destinationPoint);
    Seeker расчитает путь по которому можно добраться до цели (обычно это ломанная кривая из 3х отрезков) и дальше уже своими силами надо реализовывать передвижение по этим точкам.
  5. Движение юнитов. Пожалуй самое сложное, поскольку если юниты обладают физикой то это усложняет задачу. Надо просто понимать что нельзя сказать юниту x=x+1 через фиксированные участки времени. По идее надо использовать rigidbody.AddForce и учитывать ситуации OnCollision. Ещё одна проблема - повороты объекта. Они далеко не простые
    transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);

Минусы и сложности

К этому времени вы вероятно заметили что спецификация есть, IDE работает, комьюнити и примеров хватает - можно попробовать. Но надо и холодный душ принять. Вот список недочётов что я заметил
  1. Падения. Движок падает в разных случаях - как от неосторожного движения с интерфейсом, пробного Run с косячным скриптом, так и просто при работе. Порой обидно что «не сохранился».
  2. Глюки интерфейса. Это не так критично как падения, но мозги плавятся. Например проблема с зумом колёсиком мышки - камера перелетает килопиксели , не давая плавно подобраться к нужной сцене. Или например если вы импортировали модель с большим числом текстур или mesh-форм, будьте уверены что в следующий раз диалоги с таким содержанием будут забиты ненужными значениями.
  3. Глупый GUI. Во времена когда HTML5 реализуется всеми браузерами, тут приходится писать очень странный код, напоминающий layout в Java Swing (sic!) и порой вычитывать недокументированные особенности на форуме (например что при декларации кнопки его onclick event сразу внутри скобок, а вот как получить onmouseover и другие события или изменить её дизайн - та ещё тайна).
  4. Синтаксис. Согласен - трёхмерный мир это сложно и я даже могу понять почему используются математические термины типа кватерниона вместо "поворота в пространстве", но почему нельзя использовать короткие методы для основных функций, или почему нельзя в JS создавать глобальные объекты.
  5. Дебаг. Из-за того что код размыт на объекты-компоненты очень сложно организовывать нормально проект и как следствие сложно дебагить, даже несмотря на консоль, подсветку и возможность поменять значения на лету. Сложно и оттого что Scite который по умолчанию редактирует скрипты не знает никаких подсказок о пространстве переменных Unity, не умеет ничего подсказать, нельзя перепрыгнуть в нужное место как то привычно в других языка и IDE.

Расширения

Unity позволяет не только писать скрипты под существующие объекты, но и изменять саму IDE добавляя новые панели управления и меню, то движок можно расширить своими мини-фреймворками
  • Explosion- многопараметрические взрывы (цвет, взрывная волна, дым, размеры)
  • Locomotion - движение людей и зверюшек c вызовом нужной анимации при соответсвующих вводах с клавиатуры
  • Skydome - динамическое небо
  • Last Bastion Games - диалоги, recorder, прототип RTS и гонок
Обязательно гляньте:
  • LearnMeSilly - набор основных уроков по работе с редактором, объектами
  • Blender - бесплатный редактор. Можно в нём создать модели и экспортировать в 3ds
  • Turbosquid - коллекции 3д моделей (в т.ч. платные)
  • Unity3D Answers - своего рода база проблем и решений

A serious man

Жизненный и в то же время многозначительный фильм. Можно сказать что фильм о профессоре математической физики из семидесятых у которого куча всяких проблем или же о евреях - ведь фильм о еврейской семье, школе и раввинах. Но если копать глубже то фильм о мировоззрении или даже.. Восприятии — с большой буквы.

snapshot20100307023925.jpg

Ларри — рациональный и пожалуй слишком серьёзный человек, со своими проблемами. Но он начинает замечать знаки. Ведь именно так Бог говорит с людьми. Неважно событие - важно что человек чувствует что это знак. Ларри попал в аварию и так же сделал любовник его жены. Знак.

В середине фильма Ларри беседует с Сайем о том что математика — самая что ли не настоящая рациональность. Проблема в том что теория вероятности самая хаотичная её часть. И именно так определяются знаки — это ценимая получателем информация среди фонового шума (это сцена с антенной).

Брат Ларри - немного чокнутый-гений пытается обрабатывать весь шум вселенной и пишет «Mentaculus» - карту вероятностей вселенной. Правда безуспешно, поскольку ему самому нужна помощь, потому что он более потерян чем Ларри.

«Спасите меня» — такой знак находит ортодонт Ли и теряет сон. Он всячески пытается интерпретировать и получить ответ на неизвестный вопрос. Но не получив никаких доказательств он теряет веру в знак и живёт «нормальной жизнью дальше».

Вопросы возникают ежедневно и ответы посетители пытаются получить у раввинов, как у психологов. А как тут ответишь, когда тут столько неопределённостей? Вот и раввин Маршак выглядит как господь — сидит в кабинете и «думает». А между тем он не может как-то существенно повлиять на действия обкурившегося мальчика или проблемы Ларри. 

Я думаю Ларри это прототип поколения 20 века, когда на науку возлагались гигантские надежды, но которые мало что развивали внутри, в этике и социологии. Как раз пример брата-гения говорит об обратном. И косвенно это подтверждает телефонный разговор «но я же ничего не делал!».

Торнадо, врач, подкуп, ничего не делание — все эти сценарные точки так и тянет провести как аналогии с торой, мировоззрением евреев не принявших спасение христианства, современным поколением ожидающую смертельную воронку конца света, на внутреннюю коррупцию духа, даже на экологические последствия.

Советую посмотреть, подумать о преддверии новой эры, расслабиться и увидеть знаки для себя.

Viimsi SPA

На выходные к 14 февраля решили с женой съездить отдохнуть в Viimsi SPA. Собственно маленькое мнение о сием заведении.

Плюсы

  1. Недалеко от Таллинна (хотя мы и попали в какую-то чудовищную пробку в Пирита.. все хотели искупаться в шоколаде по какой-то кампании)
  2. Неплохой массаж (ног)
  3. Пресная нехлорированная вода.. по крайней мере глаза не щипет
  4. Не глубокий бассейн (1.3-1.6 м) вместо 3м. Идеален для того что-бы научиться плавать :)
  5. Соляная баня (!), турецкая (паровая) и обычная бани, но всех - по одной.

Минусы

  1. Долгое обслуживание в приёмной — пол часа ждали что-бы сначала написать бумагу о том кто мы такие (сказали - надо для департамента Миграции), а потом (после первой очереди) - вторую бумагу о том что мы хотим на ужин (а то в другое время это не спросить?). Вобщем из-за этого опоздал на массаж.
  2. Долгое обслуживание в ресторане «Морская звезда». Конечно нам спешить некуда, но сначала попутали блюда (нафига на бумаге тогда их мы выбирали?), потом хлеб пришлось спросить у трёх официанток, да и размер порции в три картошины не понравились.
  3. Устаревший ремонт. Не то что-бы я сильно привередлив, но ламинат с громадными щелями, покоцаный плинтус или ковролин, какие-то потёки на стенах..
  4. Старый телек. Опять же — я не приехал сюда кино смотреть, но вечером можно расслабится и под чем-то менее шипящим
  5. Вид из окошка — склады, заброшенные помещения, трубы.. хорошо что хоть море видно

На завтрак был неплохой шведский стол, впрочем мы чуть опоздали и вместо макарон остались их пережареные костяшки. Из аудитории - полно финнов и русских. В общем позитив есть если его уметь искать — отдыхайте чаще :)

Цифровая подпись документов в Эстонии с помощью DigiDocService

В Эстонии с 2000 года вступил в силу закон о цифровых подписях, которые стали юридически равноценны обычным рукописным. Вскоре была создана и техническая основа - компания SertifitseerimisKeskus (буквально - «центр сертификации») принадлежащая банкам и телекоммуникацонным операторам (а не государству, представляете себе!) и схема обмена данными по X.509 стандарту. Эта статья расчитана в большей мере на программистов.

Цифровая подпись?

Подпись как оказывается очень важна, а признаваемая государством - тем более. Снижаются затраты на распечатку и/или доставку счетов по оплате, договоров между работником и работодателем. Я уже не говорю про обычное подтверждение что документ прислан точно нужным человеком, а не хакером. Спасает положение то что у каждого гражданина Эстоини есть сертификат подписи, но его недостаточно. Проблема в том что одной подписи-закарючки в IT-мире недостаточно. Подпись в расширенном виде на самом деле включает в себя набор данные, в том числе не статичные.

test_signature.png

  1. Стороны подписывающие документ
  2. Собственно документ или его отпечаток (говорящий о неизменном состоянии со времени подписания)
  3. Свидетели (нотариус) и роль сторон
  4. Время, место

DigiDoc контейнер Контейнер всей этой информации решили сделать на XML и назвать .ddoc расширением и связать с онлайн-сервисом создания и подтверждения подписей — Digidoc. За основу берутся основные свойства эстонской ID-карточки - авторизация, подпись и шифрование и в результате имеем:

  • цифровая подпись файлов (DigiDoc клиент, портал или третья сторона через DigiDocService)
  • шифрование и дешифрование файлов (DigiDoc клиент)
  • подтверждение действительности (digidoccheck)
  • подпись электронной почты
  • подпись или авторизация с помощью мобильного телефона (Mobiil-ID)

Контейнер со времени создания претерпел некоторые изменения, сейчас есть версия 1.3 основана на стандарте XAdES-X-L расширенных электронных подписей.

Процесс создания подписи с DigiDocService

Теперь собственно о главном что может понадобится на любом сайте. Допустим вы продаёте рога и копыта и хотите всё юридически правильно оформить. По-старинке это было бы типичный checkbox мол «согласен с условиями». Теперь же можно получить юридически действительную подпись клиента под любым договором, распиской купли-продажи или договора предоставления услуги.

Избранность

Избранность — атрибут скромности

Избранность происходит от славянского «берѫ», близко к «бремя» и англ. «burden» со смыслами ношы, рождения, награды. Тоесть получается что избранный это человек рождённый впереди своего времени, острие всего общества и его будущее. Впрочем всегда возникает вопрос.. если избран, то кем? Для какой цели? А что будет после её достижения?

Христос пожалуй самый известный избранный на всей планете с целью сообщения евангелия. Впрочем и до и после было множество пророков больших и малых, множество судей и царей, мудрецов и целителей. И ведь наверняка они с детства считали себя особенными. Но что там один человек.. целые правительства и народы пророчили себя избранными — евреи, нацисты, США. Свои миссии — связь с Богом, господство рейха, распространение свободы.

Я уж не говорю про тему избранности к которой аппелируют в литературе и кино — Нео (свобода от машин), Скайуокер (свобода от диктатуры), Поттер (свобода от крови). А уж в компьютерных играх избранные все — каждый призван спасти мир от вселенского зла, убивая избранных таких же как он. Абсурд, но кто откажется быть особенным?

Жертва и память

148762_pic_text1.jpg Так или иначе, избранный практически всегда должен умереть как жертва. Нельзя же выбрать из стада худших овец надеясь что судьба мира от этого успокоится. Но не стоит путать смысл намеренной жертвы и случайной смерти. Они очень близки для общества, и порой как-будто ожидаются — раз звезда, значит умрёшь молодым (Миронов, Гагарин, Кобейн, Цой), как-будто охотники путешествуют во времени и убивают их что-бы те не испортили ничего в будующем. Но всё-таки это разные вещи.

Случайность конечно нельзя исключить из Божьего промысла и «тайного желания общества» — Кеннеди, Мартин Лютер Кинг, царская семья Романовых... все погибли как жертвы своего времени. И знаменовали собой новую эпоху в сознании людей. Но это случайные жертвы — «революция пожирает своих детей».

Death_of_Marat_by_David.jpg Намеренная жертва напротив, связана с полуосознаваемой виной общества, со сложившимися обстоятельствами. Объект жертвы должен искупить вину перед судьбой, исправить ошибку. Не явно разумеется — жертва это отпечаток в памяти, как чёрно-жёлтое сочетание цвета в природе. «Мы, советский народ, приносим в жертву 25 миллионов человек потому что ошибались когда думали о мировом пролетариате, великой революции и подготовке к массовой войне». Да и Цусима — жертва империализма. Просто напоминание поколениям, что это плохой путь развития, делайте по-другому.

Жертва конечно может быть и вынужденной — кто знает, может и некоторые теракты проводятся спец-службами в качестве повода.. как то делалось во время зимней войны или при захвате Польшы нацистами. Эдак уколишь себя, а потом не стыдно противнику кости переломать.


Альтруизм

Подумать только — живёт какой-нибудь ацтек, знает и ждёт когда его принесут в жертву богам! Драма не в том что он умрёт, а в том что умрёт раньше, как какой-нибудь мусульманский «свидетель веры» за свободу Палестины. И он не убежит, а будет жить только ради этого дня, а скажешь что боги отказались от его жертвы — и у него всё мироздание рухнет.. как так? а зачем тогда я?

Связь жертвы и избранности настолько сильна, что люди идут и хотят самопожертвования ради того что-бы показать свою особенность. Смотришь так иной фильм с героями, выходишь на улицу и всё тускло и никому не нужна жертва. А спасёт героически какой-нибудь негр упавшего на ж/д пути ребёнка и думаешь.. «повезло ему, смог проявить себя» и тут же одёргиваешь себя.

Практически все священные писания перед собой ставят одну цель — баланс человека и общества. Эго и сверх-я если хотите. Избранный по природе не может быть эгоистом, соответсвенно он кроткий, покорный, смиренный перед обществом, но парадоксально упорный в достижении своей миссии. Хорошие примеры этих качеств и воплощения древних инстинктов среди детей— «Повелитель мух», напоминающий о языческом Вельзевуле и советское кино «Чучело».

Связь

Вторая главная характеристика избранного —абсолютная уверенность в своей правоте. Эта черта может вытворять такие творческие чудеса и так угнетать закостенелых врагов, что для правильного ориентирования в жизни приходится ощущать сверхъестественное — чтение знаков по самым малейшим движениям духа. Жанна д'Арк например, или практически любой юный пианист-вундеркинд, или любой знаменитый правитель избежавший как по волшебству десятки покушений.

Третья важная составляющая избранности как я уже замечал — судьба, предопределённость. Врядли мы узнаем природу времени, однако всякий избранный идёт по заранее продуманному пути. Для кого-то кажется его путь просто совпадением, для кого-то — мистикой