forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Вопросы от новичка (http://forum.boolean.name/showthread.php?t=15809)

Aikon 20.12.2011 01:38

Ответ: Вопросы от новичка
 
Костян, я тебе привел общий способ. Вместо MeshRendered можешь подставить любой класс, в том числе и для класс BlurEffect.
P.S. imageBlur такого класса нет, как и компоненты.

pax, метод дергается (print отрабатывает), только вот бестолку.

RegIon 20.12.2011 13:08

Ответ: Вопросы от новичка
 
Цитата:

Костян, я тебе привел общий способ. Вместо MeshRendered можешь подставить любой класс, в том числе и для класс BlurEffect.
P.S. imageBlur такого класса нет, как и компоненты.

pax, метод дергается (print отрабатывает), только вот бестолку.
Но правильно. ЭТО ведь скрипт из пака ImageEffects

Aikon 20.12.2011 16:56

Ответ: Вопросы от новичка
 
Костян, хочешь получать ответы, то правильно формулируй вопрос и приводи код, который не работает. А то такое чувство, что тебе иногда лень не то, что подумать, а яйца почесать.

Выключение спец-эффектов с камеры я тебе привел. У меня этот код отлично работает. А ты по видимому предлагаешь погадать, а что у тебя там не так.

pax 20.12.2011 16:58

Ответ: Вопросы от новичка
 
Заработало у него с вот такой командой:
PHP код:

Camera.main.GetComponent<BlurEffect>().enabled false


RegIon 21.12.2011 16:37

Ответ: Вопросы от новичка
 
А есть ли щейдер рендра в анаглиф картинку,желательно "тёмный"

pax 21.12.2011 16:41

Ответ: Вопросы от новичка
 
Вероятно где-то есть))

Aikon 21.12.2011 19:33

Ответ: Вопросы от новичка
 
Вот кстати вопрос то ж по шейдерам.
Посмотрел справку, посмотрел прилагаемые примеры.
Но как самому писать шейдеры, так и не понял.
Может есть какой толковый учебник или мини-faq? Насколько я понял используются CG-шейдерды, через оболочку Unity. Команды можно посмотреть и на сайте nVidia, но вот как это все работает слабо представляю.

P.S. В FAQ статью просмотрел - да, там перевод справки в основном.
P.P.S. Пытался написать шейдер преобразующий цветную текстуру в черно-белую. Но даже не смог понять, куда что писать.

P.P.P.S. Кажется нашел, что искал - http://forum.unity3d.com/threads/19166-ShaderLab-FAQ
и в частности
http://www.unifycommunity.com/wiki/i...?title=Shaders

WISHMASTER35 22.12.2011 01:05

Ответ: Вопросы от новичка
 
Пардон, что не совсем в тему. Хочу сделать подобную игру http://www.computer-game.us/puzzles/..._game_big2.jpg на Unity.
Как вы думаете диаманты там хранятся в двумерном массиве или одном векторе? Пока кое-как сделал с массивом, но перемещать элементы по массиву не совсем удобно. Но зато удобно проверять какие соседнии диаманты.

Aikon 22.12.2011 02:12

Ответ: Вопросы от новичка
 
Совсем не в тему :) Я бы в двумерном хранил или написал бы обертку, чтобы не в массив лазить каждый раз, а вызывать функции.

Если кому то интересно, я написал свой первый шейдер :)
Переводит текстуру материала из цветной в черно-белую
Код:

Shader "Custom/Grayscale" {
    Properties {
      _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert
      struct Input {
          float2 uv_MainTex;
      };

      sampler2D _MainTex;
      void surf (Input IN, inout SurfaceOutput o) {
        half3 c = tex2D (_MainTex, IN.uv_MainTex).rgb;
        half grey = c.r * 0.3f + c.g * 0.59f + c.b * 0.11f;
        o.Albedo = (grey, grey, grey);
      }
      ENDCG
    }

    FallBack "Diffuse"
}


radiobutton 22.12.2011 02:17

Ответ: Вопросы от новичка
 
юзать шейдеры в бесплатной версии можно?

Aikon 22.12.2011 02:38

Ответ: Вопросы от новичка
 
radiobutton, кроме полноэкранных.
Шейдеры - это же материалы в Unity ;)

radiobutton 22.12.2011 03:14

Ответ: Вопросы от новичка
 
Переменные с плавающей точкой как я понял имеют тип float. (во всяком случае gameObject.light.range имеет тип float). На сколько я помню float это тот же double только в два раза меньше по объему. Если переменной с типом float присвоить значения типа double, то будит выдана ошибка о несовместимости типов (ну оно и понятно). Но почему то в классе Convert нету метода конвертирования во float. Если создать переменную float a = 0.5;, то выдаст что нельзя так присваивать, т.к. 0.5 это double а переменная то float. Так вот как решить эту проблему? (вопрос по сути по c#, а не по юнити =) )


Как и куда можно быстра залить скомпиленные в WebPlayer'е проект, чтобы скинуть кому то ссылку ?

Aikon 22.12.2011 03:44

Ответ: Вопросы от новичка
 
float a = 0.5f; // f = float

radiobutton 22.12.2011 04:29

Ответ: Вопросы от новичка
 
Можно как-то управлять вершинами треугольниками полигонами, нормалями итд (создавать модель вручную(как это можно было делать в блице addvertex surf итд) или как то управлять составляющими загруженной модели) ?

Lestar 22.12.2011 06:13

Ответ: Вопросы от новичка
 
Можно.

Aikon 22.12.2011 22:10

Ответ: Вопросы от новичка
 
По шейдерам вопрос:
Хочется уметь изменять яркость отдельных объектов. Насколько понимаю, это лучше сделать шейдером. Добавление яркости - это просто добавление ко RGB-компонентам одинакового значения с обрубанием до 1. Написать шейдер, который по текстуре увеличивает или уменьшает яркость проблем нет.

Хочется другое: иметь возможность использовать стандартные шейдеры (на каждый объект будет диффуз + карта нормалей), а затем к полученному результату добавлять шейдер подсветки.

Как это сделать? Использование второго материала поможет?

Murdoc 23.12.2011 09:20

Ответ: Вопросы от новичка
 
Добрый день!
Ребята подскажите насколько http://www.exitgames.com/Photon/Unity действительно удобен в тандеме с Unity и где можно почитать именно о организации взаимодействия клиент-сервер?

pax 23.12.2011 09:31

Ответ: Вопросы от новичка
 
У нас вот еще темно)

Я боюсь здесь никто еще не пробовал использовать фотон по настоящему. В ассет сторе есть демка буткампа с сетевой частью на фотоне, можно ее поизучать.

Murdoc 23.12.2011 09:42

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от pax (Сообщение 215003)
В ассет сторе есть демка буткампа с сетевой частью на фотоне, можно ее поизучать.

Для меня, на данном этапе, "поизучать" с таким же успехом можно китайские иероглифы :crazy: Поэтому собственно и спрашиваю:
Цитата:

Сообщение от Murdoc (Сообщение 215002)
где можно почитать именно о организации взаимодействия клиент-сервер?


pax 23.12.2011 09:46

Ответ: Вопросы от новичка
 
По сети в Unity можно почитать вот это http://unity3d.ru/distribution/viewt...hp?f=11&t=2220
Вроде фотон реализовывает 90 оригинального сетевого функционала Unity.

radiobutton 24.12.2011 04:08

Ответ: Вопросы от новичка
 
mesh.triangles = new int[] { 0, 1, 2};

Скажем я хочу добавить еще один треугольник. (0,2,3)
Придется пересоздавать массив заново?
Нельзя как нить так типа
mesh.triangles+= {0,2,3};

Тоесть если я хочу создать какую нить фигуру из треугольников, мне нужно будит заранее просчитать сколько будит треугольников, потом задать mesh.triangles нужный размер и заполнить номерами вершин.
Или можно как то добавлять в динамический массив по 1 треугольнику в конец ?

Треугольники создаются двухсторонние. Можно сделать чтобы они были односторонние? (а то получается половина ненужных полигонов xD )

pax 24.12.2011 11:02

Ответ: Вопросы от новичка
 
Двухсторонние бывают если ты где-то нашел шейдер такой. Если нет, то ищи проблемы с генерацией своих треугольников

PHP код:

List<inttriangles = new List<int>();
triangles.AddRange(new int[] { 012});
triangles.AddRange(new int[] { 023});
mesh.triangles triangles.ToArray(); 


WISHMASTER35 25.12.2011 20:02

Ответ: Вопросы от новичка
 
Как можно Gizmos.DrawWireCube отрендерить не в мировой системе координат, а системе Transform'а?

pax 25.12.2011 21:44

Ответ: Вопросы от новичка
 
Если только через Gizmos.DrawLine

WISHMASTER35 25.12.2011 21:49

Ответ: Вопросы от новичка
 
А приметить трансформацию никак нельзя?
Или DrawWireCube всегда будет выровненный по осям?

pax 25.12.2011 22:03

Ответ: Вопросы от новичка
 
Нельзя
Хотя стоп, можно
PHP код:

Gizmos.matrix transform.localToWorldMatrixлибо Matrix4x4.TRS(...);
Gizmos.DrawWireCube(...);
Gizmos.matrix Matrix4x4.identity


WISHMASTER35 30.12.2011 15:20

Ответ: Вопросы от новичка
 
У кого-нибудь бывает, что в mono develop перестают работать горячие клавиши? Копировать, вставить, сохранить перестают работать.
С чем связано, что создавать объект по имени можно только из папки Resources? Хотя я так понимаю создание объекта по имени не есть правильно т.к. лучше сохранять ссылку на прифаб.

pax 30.12.2011 16:08

Ответ: Вопросы от новичка
 
Наверное не бывает, потому что им никто не пользуется )

RegIon 31.12.2011 19:51

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 215770)
У кого-нибудь бывает, что в mono develop перестают работать горячие клавиши? Копировать, вставить, сохранить перестают работать.
С чем связано, что создавать объект по имени можно только из папки Resources? Хотя я так понимаю создание объекта по имени не есть правильно т.к. лучше сохранять ссылку на прифаб.

1: Русич расскладка + капс включён,у самого такая проблема...

Dream 31.12.2011 19:54

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от Костян (Сообщение 215842)
1: Русич расскладка + капс включён,у самого такая проблема...

Я кстати жаловался разработчиками, они сказали что знают, и гдето на багтрекерах ихних есть фикс этой проблемы

WISHMASTER35 03.01.2012 02:58

Ответ: Вопросы от новичка
 
А сам редактор пофиксить им не судьба?(
Куда можно залить демку для веб-плеера?
И черт! Почему в редакторе камеру вечно бросает по миру? Особенно при редактировании терейна? Редактирую его спокойно и тут камера возьми да улити черт знает куда. Уже нервов не хватает.

pax 03.01.2012 10:55

Ответ: Вопросы от новичка
 
Есть горячая клавиша F, которая переводит фокус на выделенный объект. В 3.5 при среднем щелчке мыши камера перелетает для обзора этой точки.

WISHMASTER35 06.01.2012 02:55

Ответ: Вопросы от новичка
 
Кто нибудь пробовал использовать стандартные скрипты SmoothFollow и SmoothLookAt? Нормально работали?
У меня почему-то вместо сглаженного движения камеры все дергается.
И себе не могу сделать плавное движения т.к. при интерполяции от старой к текущей позиции\вращению начинает дергаться мир.

pax 06.01.2012 03:11

Ответ: Вопросы от новичка
 
Я обычно свое собственное пишу

WISHMASTER35 06.01.2012 03:25

Ответ: Вопросы от новичка
 
pax, и получалось сделать сглаженное движение камеры? Как вы это делали?

pax 06.01.2012 03:57

Ответ: Вопросы от новичка
 
ну попробуй делать изменения в FixedUpdate или в LateUpdate

WISHMASTER35 06.01.2012 14:53

Ответ: Вопросы от новичка
 
В LateUpdate пробовал. В FixedUpdate я смысла вообще не вижу.

WISHMASTER35 06.01.2012 21:05

Ответ: Вопросы от новичка
 
А можно как-то такое сделать для тача: Рисовать на экране джойстик, кнопки и записывать данные с этих кнопок в Input Horizontal, Vertical и др?
Или туда никак не записать свои данные?

pax 06.01.2012 21:50

Ответ: Вопросы от новичка
 
никак не записать, проще свой MyInput сделать, в который запилить враппер стандартного Input

WISHMASTER35 07.01.2012 00:59

Ответ: Вопросы от новичка
 
Плохо. Я люблю когда одни модули\скрипты не зависят от других. Хотел сделать, чтобы контроллер игрока и камеры использовали один Input и ничего не знали о этих джойстиках, кнопках. С MyInput по-моему выйдет еще хуже.
Вот, кстати, сделал свой 3rd Person Controller типа как в гта 4 http://dl.dropbox.com/u/55489242/My%...WebPlayer.html
Вот только при одновременном повороте игрока и камеры начинаются дрожания. Не понимаю как это исправить(

pax 07.01.2012 01:14

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 216212)
Хотел сделать, чтобы контроллер игрока и камеры использовали один Input и ничего не знали о этих джойстиках, кнопках. С MyInput по-моему выйдет еще хуже.

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

WISHMASTER35 07.01.2012 02:04

Ответ: Вопросы от новичка
 
Я имею ввиду рисовать джойстик на экране как стандартных примерах для мобильных девайсов.
Я делаю, что бы для пк было одно управление, а для андроида и айфона другое. Надеюсь работа с тачем и на андроиде и на айфоне там одинаковая. А то зачем-то сделали классы AndroidInput и IphoneInput.

pax 07.01.2012 14:05

Ответ: Вопросы от новичка
 
используй Input.touches и не парься, будет работать и там и там

toyman 07.01.2012 23:30

Ответ: Вопросы от новичка
 
Хм вопросы идут об android и Ios тгда вопрос где можно найти инструктаж по созданию своего контролера?например 2D

WISHMASTER35 07.01.2012 23:55

Ответ: Вопросы от новичка
 
В 2д игре это должно быть легко. Для UDK я кажется видел статью как сделать 2д контроллер, а для юнити наверно нету.

pax 07.01.2012 23:56

Ответ: Вопросы от новичка
 
контроллер понятие растяжимое...

WISHMASTER35 08.01.2012 01:20

Ответ: Вопросы от новичка
 
Почему при нажатии Project Setting/Tags открывается инспектор редактирования слоев?
Хочу добавить свой тег Enemy, чтобы знать в целимся во врага или нет.

pax 08.01.2012 01:45

Ответ: Вопросы от новичка
 
Самый верхний пункт в редакторе слоев не пропусти ;)

WISHMASTER35 08.01.2012 02:34

Ответ: Вопросы от новичка
 
Увидел кое-как)
Сейчас заметил, что если методом WorldToScreenPoint проецировать вершину на экран, то, чтобы нарисовать ее на GUI надо будет еще сделать такое: proj.y = Screen.height - proj.y; т.е. разные системы координат. похоже ошибочка)

pax 08.01.2012 02:51

Ответ: Вопросы от новичка
 
Не ошибка, так задумано. Мышка в тех же координатах работает.

WISHMASTER35 09.01.2012 22:22

Ответ: Вопросы от новичка
 
Посмотрел пример Bootcamp. И сразу заметил некоторые странности.
1. Не используются константы для имен анимаций, а разбрасываются эти имена по всему коду. Хотя в юнити было бы правильнее вообще в инспекторе присвоить ссылкам нужные анимации.
2. Вместо смешивания анимация они просто сделали огромную кучу анимаций на все случаи жизни.
3. почему-то модель оружия хранится вместе с моделей игрока и в прифабе игрока. Хотя как я понимаю оружие надо хранить в отдельном прифабе и привязывать его к игроку при старте игры.
4. Просто ужасный прыжок.
Наверняка более опытный программист заметил бы еще кучу таких ошибках. Вот учись на таких примерах( А с виду самый лучший пример.

А как попроще можно реализовать стрельбу? Если вызывать из кода Raycast, то враг не узнает, что в него стрельнули. А Raycast Collider толкает и врага и мешает ходить игроку. Тем более, если на враге будет не коллайдер, а CharacterController, то никакой луч с ним не пересечется же?

pax 09.01.2012 22:26

Ответ: Вопросы от новичка
 
Сделал рейкаст, послал объекту, в который попал, мессадж. Вот и вся логика.

WISHMASTER35 10.01.2012 00:24

Ответ: Вопросы от новичка
 
При рейкасте луч врезается в самого же игрока, который пустил луч. Если луч дальше отодвинуть от игрока, то может будет пропускать врагов, которые рядом(

pax 10.01.2012 00:34

Ответ: Вопросы от новичка
 
помести игрока в другой слой, стреляй во все, кроме этого слоя. С врагами можно поступить так же.

WISHMASTER35 10.01.2012 17:37

Ответ: Вопросы от новичка
 
А как в С# лучше такое сообщение передать объекту в который попал?
Хотел повесить на скрипт интерфейс, которому и передавать это сообщение, но GetComponent не хочет искать компонент с моим интерфейсом(
Хотя можно просто все скрипты объекта проверить на принадлежность интерфейсу и вызвать нужный метод в нужных объектах.

Aikon 10.01.2012 22:40

Ответ: Вопросы от новичка
 
WISHMASTER35, странно, что не ищет. Ты уверен, что компонент висит? Может в имени ошибка? Код в студию.

Расскажу про свой топорный метод решения схожей задачи:
1. Создаем класс
Код:

class RayReceiver  : MonoBehaviour {
        public virtual void OnRay()
        {
                // тут помещаем стандартный обработчик, например уничтожить объект
        }
}

Теперь допустим есть несколько разных классов, которые должны принимать сообщение о приходящем луче.
Тогда класс наследуем не от MonoBehaviour, а от RayRaceiver
Код:

class TestClass : RayReceiver  {
        // можно не писать, если устроит стандартный
        public override void OnRay()
        {
                // тут помещается обработчик, уникальный для класса. Позже можем вызвать родительский, если надо
        }
}

Где то в обработчиках нажатия
Код:

if (Input.GetMouseButtonDown(0))
{
        Ray ray = mlCamera.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (!Physics.Raycast(ray, out hit))
                return;
        RayReceiver rr = hit.collider.gameObject.GetComponent<RayReceiver>();
        if (rr != null)
                rr.OnRay();
}

C# вроде запрещает множественное наследование, но поскольку у меня иерархия объектов простая, как и сама задача, то такое вот решение меня вполне устраивает.


P.S. Кстати нашел баг: допустим лежит кубик с RigidBody на другом c BoxCollider, то сообщение OnCollissionStay через некоторое время перестает приходить, пока кубику с RigidBody WakeUp() не сделать.

WISHMASTER35 10.01.2012 23:10

Ответ: Вопросы от новичка
 
Aikon, не совсем правильно ты делаешь. Для этого используются интерфейсы.
И если у тебя есть класс, который уже наследуется от друга твоего класса, то твой способ не сработает.

Я сделал интерфейс
Код:

public interface BulletReceiver {
        void Attacked(Vector3 point);
}

Могу добавить этот интерфейс любому скрипту.
А при выстреле делаю так:
Код:

                                MonoBehaviour[] components = hit.collider.gameObject.GetComponents<MonoBehaviour>();
                                foreach( MonoBehaviour component in components ) {
                                        if( component is BulletReceiver ) {
                                                ( ( BulletReceiver ) component ).Attacked( hit.point );
                                        }
                                }

GetComponents ищет все что унаследовано от Component, поэтому мой интерфейс и не искало. Вот только без поиска нельзя получить список всех скриптов?
Я вот только не понял в C# и родительские классы и интерфейсы пишутся через запятую после двоеточия? В java для наследования используется extends, а для интерфейсов implements.

Aikon 11.01.2012 00:10

Ответ: Вопросы от новичка
 
Цитата:

Я вот только не понял в C# и родительские классы и интерфейсы пишутся через запятую после двоеточия?
Цитата:

Как известно множественное наследование в таких языках как Java и С# отсутствует, т.к. является потенциальным источником ошибок. Вместо него разработчику предлагается использовать механизм интерфейсов.
Т.е. сначала пишем один базовый класс, если надо, потом через запятую далее необходимые интерфейсы сколько надо.

С классом да, налажал, забыл глянуть что есть интерфейсы. Переделал. У меня все проходит. Вот код

Интерфейс
Код:

public interface ITest {
        void echo(string text);
}

Компонента CTest, которая реализует интерфейс ITest.
Чтобы она могла быть найдена через GetComponent я так же отнаследовал ее от базового класса MonoBehaviour
Код:

using UnityEngine;
using System.Collections;

public class CTest : MonoBehaviour, ITest  {

        public void echo(string text)
        {
                Debug.Log(text);
        }
}

В пустом проекте на камеру повесил компонент CTest и общий компонент для теста
Код:

using UnityEngine;
using System.Collections;

public class Common : MonoBehaviour {
        void Start () {
                // Мне вот этот кривой перебор не нравится. Даже если для каждого объекта результат в член класса запихнуть.       
                foreach (MonoBehaviour mb in this.GetComponents<MonoBehaviour>())
                {
                        if (mb is ITest)
                                ((ITest)mb).echo("OK");
                }
        }
}


WISHMASTER35 11.01.2012 00:45

Ответ: Вопросы от новичка
 
Цитата:

Чтобы она могла быть найдена через GetComponent я так же отнаследовал ее от базового класса MonoBehaviour
Все равно ты ищешь по MonoBehaviour, а не по имени интерфейса.

А OnPostRender вызывается только у камеры? Нету методов, которые вызывались бы после рендеринга или перед Update?

Кстате, я так и не понял Raycast будет попадать в CharacterContoller? Ведь он сам использует CapsuleCast. Как тут быть?

Aikon 11.01.2012 00:58

Ответ: Вопросы от новичка
 
WISHMASTER35, т.е. ты хочешь выполнять поиск не компонентам и потом проверять у них наличие интерфейса, а выполнять поиск по наименованию интерфейса, отбирая компоненты, которые поддерживают его, а потом вызывать метод у тех компонент, где данный интерфейс реализован? Вроде теже яйца, только вид с боку и не факт, что поддерживается Unity (pax думаю придет напишет).

С главным циклов в Unity не все понятно. Т.е. если на сцену два кубика добавить и у каждого Update задать, то порядок вызовов этих Update-ов мне кажется заранее не будет известен, либо не стоит к нему привязываться.
Можно попробовать использовать LateUpdate (только для потомков MonoBehaviour) и FixedUpdate (только для физических тел).

WISHMASTER35 11.01.2012 01:34

Ответ: Вопросы от новичка
 
Aikon, да я же и писал, что GetComponent не ищет по имени интерфейса.
А зачем вообще нужно знать порядок вызовов Update?
У меня в Update у оружия вызывается метод принятия пули у врага. Я хочу в этом методе принятия пули сделать врага красным, а после одного рендеринга сделать его снова белым. Но как это сделать после того как отрендерился красный враг хз. По крайней мере без дополнительных переменных. А то можно в OnWillRender поднять флаг, что в следующем Update сделать врага снова белым.

pax 11.01.2012 02:17

Ответ: Вопросы от новичка
 
А не проще
PHP код:

hit.collider.gameObject.SendMessage("OnRay"SendMessageOptions.DontRequireReceiver); 

никакие интерфейсы не нужны. Просто реализуйте функцию где нужно.

WISHMASTER35 11.01.2012 19:54

Ответ: Вопросы от новичка
 
Жаль только через SendMessage не передать больше одного параметра(
А кто-нибудь делал GUI для разных экранов? Как его сделать, что бы нормально смотрелось? Настроил под свой размер, а на маленьком джойстик на пол экрана и даже сдвинуть его не куда. И можно получить плотность пикселей?

Lestar 11.01.2012 20:48

Ответ: Вопросы от новичка
 
Через Screen получить текущее разрешение экрана и исходя из него позиционировать. Мессаги медленная операция.


Часовой пояс GMT +4, время: 04:22.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot