Разработка платформера или азы Unity скриптинга - Форум Игроделов
Чт, 28 Мар 2024, 20:22 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNITY3D » МАНУАЛЫ И УРОКИ » Разработка платформера или азы Unity скриптинга
Разработка платформера или азы Unity скриптинга
FunnyAlienДата: Вс, 13 Мар 2011, 12:05 | Сообщение # 1
NYAN-NYAN?
 
Сообщений: 3643
Награды: 14
Репутация: 835
Статус: Offline
Доброго времени суток, уважаемые участники форума!
Сегодня мы попробуем разработать основу для игры в жанре "платформер от первого лица", и освоим новые азы Unity скриптинга.


Что понадобится сегодня?

  • Unity3D - версия не имеет значения.
  • Интерфейс - знание движка в лицо, ну или хотя бы со стороны.
  • Прошлый урок - лучше прочитать.
  • iTween - создание анимаций прямо в юнити.

Часть первая. Подготовка к работе.

1. Для начала мы создадим новый проект. File --> New Project...
2. Создайте его в пути, не имеющий кириллицы. Отметьте галочки Character Controller и Particles.
3. Перед нами голый проект, на котором мы начнем творить.



4. Создайте один кубик GameObject --> Create Other --> Cube, со Scale'ом - 3 ' 1 ' 2
У вас должно получиться нечто подобное.





5. Откройте папочку Standard Assets --> Character Controllers --> и перетащите в сцену First Person Controller.
Поставьте FPC на платформу и поверните его на 180 градусов по оси Y.



6. Давайте настроим нашего FPC для приятного передвижения в игре.
Выделите в Hierarchy объект First Person Controller и справа в Inspector'e раскройте вкладки Jumping и Movement у скрипта Character Motor.
Смените все как на скриншоте.



7. Создайте три куба, и разместите их как показано на скриншоте. Для более точного перемещения используйте оси Position в Inspector'e.
Для красоты можно добавить Point Light.



8. Попробуйте пробежаться.

Часть вторая. Возрождение и движущиеся платформы.

9. Создайте новый скрипт нажатием ПКМ (правой кнопкой мыши), во вкладке Project.
Create --> JavaScript.
10. Назовем его TriggerDeath. Щелкните два раза ЛКМ (левой кнопкой мыши) по названию скрипта.

11. Сейчас нам надо реализовать такой скрипт, если игрок падая вниз, задевал триггер и возвращался в точку возрождения. Начнем?

12. Для начала нам нужно взять функцию входа в триггер.

Code
function OnTriggerEnter (death : Collider)


13. Затем мы дадим знать какой объект будет триггером. В моем случае это TriggerDeath.

Code
if(death.gameObject.name == "TriggerDeath")


14. Потом действие загрузки уровня.

Code
Application.LoadLevel (0);


15. Затем закрываем скобки. Проверяем.

Code
function OnTriggerEnter (death : Collider) {
   if(death.gameObject.name == "TriggerDeath"){
    Application.LoadLevel (0);   
   }
}


16. Теперь давайте создадим большой кубик под нашими платформами. Отключите рендер объекта сняв галку с Mesh Render и добавьте галку Is Trigger в Box Collider.
Назовите объект TriggerDeath.
Все должно быть именно так.



17. Добавьте скрипт на наш триггер и на First Person Controller. Смотрим что получилось.

18. Сейчас вам нужно импортировать дополнение к редактору под названием iTween. Assets --> Import Package... --> iTweenVisualEditor.unitypackage

19. Перезагрузите Unity. Выделите первый куб на пути игрока и щелкните Component --> iTween --> iTweenEvent.
У объекта в Inspector'e появятся новые возможности для редактирования. Давайте попробуем сделать двигающийся куб.

20. По стандарту объект находится в состоянии MoveTo, то что нам и надо. Просмотрите в каком положение по оси X стоит объект.
Справа ставим галочку на Position, вкладку Vector3 оставляем, и снизу вводим координаты куда объект будет передвигаться. Оси Y и Z можно не трогать, сделайте так же как и в положении куба.
Объект у меня стоит в положении оси X -1, а в Position я указал 1. На 2 куба влево. Так же не забудьте поставить галочку Looptype, и выбрать PingPong.
Просматриваем, проверяем. Проделайте тоже самое с другими объектами, но с кубом по середине, все тоже самое но Position оси X в точности наоборот.

Часть третья. Ловушки и эффекты.

21. Создайте новый Js скрипт и приготовьтесь писать.

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

Code
function OnTriggerEnter (other : Collider)


23. Теперь обозначим у какого объекта будить физику, в моем случае его имя будет Pesok.

Code
if(other.gameObject.name=="Pesok")


24. И, непосредственно, функция добавления компонента физики. Если быть точным - сама физика называется RigidBody.

Code
other.gameObject.AddComponent(Rigidbody);


25. Добавим массу объекту.

Code
rigidbody.mass = 10;


26. Ну и закроем скобки и наконец проверим.

Code
function OnTriggerEnter (other : Collider) {    
   if(other.gameObject.name=="Pesok"){
     other.gameObject.AddComponent(Rigidbody);
     rigidbody.mass = 10;
   }   
}


27. Теперь давайте создадим сам песочный куб с триггером. Склонируйте три кубика в сцене клавишами Ctrl+D, и уберите скрипты iTween Event в Insepctor'e у всех новых объектов. Передвиньте их чуть дальше.



28. Склонируйте эти три куба и их клоны сделайте выше на 1 пункт по оси Y. Сделайте из них триггеры, отключив Mesh Render и поставив галку Is Trigger. Не забудьте сменить Scale по всем осям с 1 на 0.9.



29. Назовите триггеры Pesok, и кубы под ними тоже переименуйте под такое название. Затем сделайте триггеры дочерним к нижним кубам. Каждый триггер к своему кубу. Получиться должно что-то в этом духе.





30. Дайте скрипт и триггерам, и кубам под ними. Так же не забудьте дать скрипт First Person Controller!
Проверяйте.

31. Давайте сделаем водяной пистолет, не против?

32. Перетащите префаб Water Fountain из папки Particles в сцену.
Измените настройки префаба в сцене в точности как у меня. И не забудьте убрать галку Emmiter.



33. Добавьте префабу фонтана Component --> Particles --> World Particle Collider.

34. Создайте новый Js скрипт.

Code
function Update()
{
if (Input.GetKey ("mouse 0"))
{
if(gameObject.name=="Voda"){
particleEmitter.emit = true;
}
}
if (Input.GetKey ("mouse 1"))
{
if(gameObject.name=="Voda"){
particleEmitter.emit = false;
}
}
}


35. Переместите фонтанчик поближе к камере FPC, и переместите его в правую сторону экрана.

36. Переименуйте фонтан в Voda.

37. Сделайте фонтан дочерним к камере.

38. Добавьте новый скрипт на Main Camera и префаб Voda.

39. Попробуйте побегать и пострелять газировкой smile

Если все в порядке, значит все в порядке wink
Спасибо за внимание, с вами был Валентин.

Скачать проект можно здесь.


Согласно протоколу испытаний, начиная с этого момента, мы перестаем говорить правду. Три, два, один.
 
СообщениеДоброго времени суток, уважаемые участники форума!
Сегодня мы попробуем разработать основу для игры в жанре "платформер от первого лица", и освоим новые азы Unity скриптинга.


Что понадобится сегодня?

  • Unity3D - версия не имеет значения.
  • Интерфейс - знание движка в лицо, ну или хотя бы со стороны.
  • Прошлый урок - лучше прочитать.
  • iTween - создание анимаций прямо в юнити.

Часть первая. Подготовка к работе.

1. Для начала мы создадим новый проект. File --> New Project...
2. Создайте его в пути, не имеющий кириллицы. Отметьте галочки Character Controller и Particles.
3. Перед нами голый проект, на котором мы начнем творить.



4. Создайте один кубик GameObject --> Create Other --> Cube, со Scale'ом - 3 ' 1 ' 2
У вас должно получиться нечто подобное.





5. Откройте папочку Standard Assets --> Character Controllers --> и перетащите в сцену First Person Controller.
Поставьте FPC на платформу и поверните его на 180 градусов по оси Y.



6. Давайте настроим нашего FPC для приятного передвижения в игре.
Выделите в Hierarchy объект First Person Controller и справа в Inspector'e раскройте вкладки Jumping и Movement у скрипта Character Motor.
Смените все как на скриншоте.



7. Создайте три куба, и разместите их как показано на скриншоте. Для более точного перемещения используйте оси Position в Inspector'e.
Для красоты можно добавить Point Light.



8. Попробуйте пробежаться.

Часть вторая. Возрождение и движущиеся платформы.

9. Создайте новый скрипт нажатием ПКМ (правой кнопкой мыши), во вкладке Project.
Create --> JavaScript.
10. Назовем его TriggerDeath. Щелкните два раза ЛКМ (левой кнопкой мыши) по названию скрипта.

11. Сейчас нам надо реализовать такой скрипт, если игрок падая вниз, задевал триггер и возвращался в точку возрождения. Начнем?

12. Для начала нам нужно взять функцию входа в триггер.

Code
function OnTriggerEnter (death : Collider)


13. Затем мы дадим знать какой объект будет триггером. В моем случае это TriggerDeath.

Code
if(death.gameObject.name == "TriggerDeath")


14. Потом действие загрузки уровня.

Code
Application.LoadLevel (0);


15. Затем закрываем скобки. Проверяем.

Code
function OnTriggerEnter (death : Collider) {
   if(death.gameObject.name == "TriggerDeath"){
    Application.LoadLevel (0);   
   }
}


16. Теперь давайте создадим большой кубик под нашими платформами. Отключите рендер объекта сняв галку с Mesh Render и добавьте галку Is Trigger в Box Collider.
Назовите объект TriggerDeath.
Все должно быть именно так.



17. Добавьте скрипт на наш триггер и на First Person Controller. Смотрим что получилось.

18. Сейчас вам нужно импортировать дополнение к редактору под названием iTween. Assets --> Import Package... --> iTweenVisualEditor.unitypackage

19. Перезагрузите Unity. Выделите первый куб на пути игрока и щелкните Component --> iTween --> iTweenEvent.
У объекта в Inspector'e появятся новые возможности для редактирования. Давайте попробуем сделать двигающийся куб.

20. По стандарту объект находится в состоянии MoveTo, то что нам и надо. Просмотрите в каком положение по оси X стоит объект.
Справа ставим галочку на Position, вкладку Vector3 оставляем, и снизу вводим координаты куда объект будет передвигаться. Оси Y и Z можно не трогать, сделайте так же как и в положении куба.
Объект у меня стоит в положении оси X -1, а в Position я указал 1. На 2 куба влево. Так же не забудьте поставить галочку Looptype, и выбрать PingPong.
Просматриваем, проверяем. Проделайте тоже самое с другими объектами, но с кубом по середине, все тоже самое но Position оси X в точности наоборот.

Часть третья. Ловушки и эффекты.

21. Создайте новый Js скрипт и приготовьтесь писать.

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

Code
function OnTriggerEnter (other : Collider)


23. Теперь обозначим у какого объекта будить физику, в моем случае его имя будет Pesok.

Code
if(other.gameObject.name=="Pesok")


24. И, непосредственно, функция добавления компонента физики. Если быть точным - сама физика называется RigidBody.

Code
other.gameObject.AddComponent(Rigidbody);


25. Добавим массу объекту.

Code
rigidbody.mass = 10;


26. Ну и закроем скобки и наконец проверим.

Code
function OnTriggerEnter (other : Collider) {    
   if(other.gameObject.name=="Pesok"){
     other.gameObject.AddComponent(Rigidbody);
     rigidbody.mass = 10;
   }   
}


27. Теперь давайте создадим сам песочный куб с триггером. Склонируйте три кубика в сцене клавишами Ctrl+D, и уберите скрипты iTween Event в Insepctor'e у всех новых объектов. Передвиньте их чуть дальше.



28. Склонируйте эти три куба и их клоны сделайте выше на 1 пункт по оси Y. Сделайте из них триггеры, отключив Mesh Render и поставив галку Is Trigger. Не забудьте сменить Scale по всем осям с 1 на 0.9.



29. Назовите триггеры Pesok, и кубы под ними тоже переименуйте под такое название. Затем сделайте триггеры дочерним к нижним кубам. Каждый триггер к своему кубу. Получиться должно что-то в этом духе.





30. Дайте скрипт и триггерам, и кубам под ними. Так же не забудьте дать скрипт First Person Controller!
Проверяйте.

31. Давайте сделаем водяной пистолет, не против?

32. Перетащите префаб Water Fountain из папки Particles в сцену.
Измените настройки префаба в сцене в точности как у меня. И не забудьте убрать галку Emmiter.



33. Добавьте префабу фонтана Component --> Particles --> World Particle Collider.

34. Создайте новый Js скрипт.

Code
function Update()
{
if (Input.GetKey ("mouse 0"))
{
if(gameObject.name=="Voda"){
particleEmitter.emit = true;
}
}
if (Input.GetKey ("mouse 1"))
{
if(gameObject.name=="Voda"){
particleEmitter.emit = false;
}
}
}


35. Переместите фонтанчик поближе к камере FPC, и переместите его в правую сторону экрана.

36. Переименуйте фонтан в Voda.

37. Сделайте фонтан дочерним к камере.

38. Добавьте новый скрипт на Main Camera и префаб Voda.

39. Попробуйте побегать и пострелять газировкой smile

Если все в порядке, значит все в порядке wink
Спасибо за внимание, с вами был Валентин.

Скачать проект можно здесь.

Автор - FunnyAlien
Дата добавления - 13 Мар 2011 в 12:05
DjeeZДата: Сб, 26 Мар 2011, 19:44 | Сообщение # 2
 
Сообщений: 270
Награды: 8
Репутация: 291
Статус: Offline
Спасибо за урок! smile
Немного запутался.
* зачем добавлять скрипт загрузки уровня на TriggerDeath, когда на First Person Controller, достаточно повесить?
* скрипт Pesok на сами кубы добавлять, ведь тоже не обязательно?
* зачем вешать скрипт воды на Main Camera, если он добавлен в префаб Water Fountain?
Боюсь и другие новички спутаются с логикой рассовывания скриптов по объектам. sad
 
СообщениеСпасибо за урок! smile
Немного запутался.
* зачем добавлять скрипт загрузки уровня на TriggerDeath, когда на First Person Controller, достаточно повесить?
* скрипт Pesok на сами кубы добавлять, ведь тоже не обязательно?
* зачем вешать скрипт воды на Main Camera, если он добавлен в префаб Water Fountain?
Боюсь и другие новички спутаются с логикой рассовывания скриптов по объектам. sad

Автор - DjeeZ
Дата добавления - 26 Мар 2011 в 19:44
FunnyAlienДата: Вс, 03 Апр 2011, 14:00 | Сообщение # 3
NYAN-NYAN?
 
Сообщений: 3643
Награды: 14
Репутация: 835
Статус: Offline
Quote (DjeeZ)
Боюсь и другие новички спутаются с логикой рассовывания скриптов по объектам.

Я правда сам еще новичок, а так спасибо за поправочки wink

Добавлено (03.04.2011, 14:00)
---------------------------------------------
Ребят, для удобного возрождения посоветую сделать так. Считайте это началом нового урока rolleyes

Мини-гайд.

1. Смотрим 16 пункт и делаем новую зону смерти.

2. Создаем ява скрипт. Кидаем его на триггер. А первое что нам нужно - точка рестарта.

Code
var startPosition : Transform;

Это такая удобная переменная куда мы вставим пустой GameObject как точку респавна.

3. Затем выписываем функцию входа.

Code
function OnTriggerEnter (theCollider : Collider)

4. При попадании игрока в триггер возвращение в позицию нашего GameObject'a в сцене.

Code
theCollider.transform.position = startPosition.position;

5. Полный код.

Code
var startPosition : Transform;

function OnTriggerEnter(theCollider : Collider)  
{
         theCollider.transform.position = startPosition.position;
}

6. Называем этот пустой GameObject нап. "Resp", ставим куда нужно и тащим его в свойство "Start Position" которое находится в инспекторе нашего триггера.

Ну и тем самым теперь можно уровень и не перезагружать даже. Таким образом можно сделать телепорт и точки респавна, а точнее "чекпоинты".
Ждите остальное в полном уроке tongue


Согласно протоколу испытаний, начиная с этого момента, мы перестаем говорить правду. Три, два, один.
 
Сообщение
Quote (DjeeZ)
Боюсь и другие новички спутаются с логикой рассовывания скриптов по объектам.

Я правда сам еще новичок, а так спасибо за поправочки wink

Добавлено (03.04.2011, 14:00)
---------------------------------------------
Ребят, для удобного возрождения посоветую сделать так. Считайте это началом нового урока rolleyes

Мини-гайд.

1. Смотрим 16 пункт и делаем новую зону смерти.

2. Создаем ява скрипт. Кидаем его на триггер. А первое что нам нужно - точка рестарта.

Code
var startPosition : Transform;

Это такая удобная переменная куда мы вставим пустой GameObject как точку респавна.

3. Затем выписываем функцию входа.

Code
function OnTriggerEnter (theCollider : Collider)

4. При попадании игрока в триггер возвращение в позицию нашего GameObject'a в сцене.

Code
theCollider.transform.position = startPosition.position;

5. Полный код.

Code
var startPosition : Transform;

function OnTriggerEnter(theCollider : Collider)  
{
         theCollider.transform.position = startPosition.position;
}

6. Называем этот пустой GameObject нап. "Resp", ставим куда нужно и тащим его в свойство "Start Position" которое находится в инспекторе нашего триггера.

Ну и тем самым теперь можно уровень и не перезагружать даже. Таким образом можно сделать телепорт и точки респавна, а точнее "чекпоинты".
Ждите остальное в полном уроке tongue


Автор - FunnyAlien
Дата добавления - 03 Апр 2011 в 14:00
CHIBBISДата: Пн, 26 Сен 2011, 23:44 | Сообщение # 4
краббЭ
 
Сообщений: 694
Награды: 9
Репутация: 287
Статус: Offline
Ваааль, у тебя исходник жив? cry


 
СообщениеВаааль, у тебя исходник жив? cry

Автор - CHIBBIS
Дата добавления - 26 Сен 2011 в 23:44
ShutДата: Вт, 27 Сен 2011, 05:35 | Сообщение # 5
 
Сообщений: 608
Награды: 2
Репутация: 258
Статус: Offline
CHIBBIS, Да зачем он тебе?тут же все написано.15 минут работы

Где арахисы - там и зима.
 
СообщениеCHIBBIS, Да зачем он тебе?тут же все написано.15 минут работы

Автор - Shut
Дата добавления - 27 Сен 2011 в 05:35
Ivan_BlackДата: Вс, 20 Ноя 2011, 06:48 | Сообщение # 6
Нет аватара
 
Сообщений: 4
Награды: 0
Репутация: 3
Статус: Offline
А как делать анимацию я хочу сделать что бы когда падаешь тебя сьедает монстор
 
СообщениеА как делать анимацию я хочу сделать что бы когда падаешь тебя сьедает монстор

Автор - Ivan_Black
Дата добавления - 20 Ноя 2011 в 06:48
СкептикДата: Вс, 20 Ноя 2011, 14:21 | Сообщение # 7
Мыслитель
 
Сообщений: 5860
Награды: 48
Репутация: 1731
Статус: Offline
Ivan_Black, http://docs.unity3d.ru/ScriptReference/Animation.html

Фанат игр Max Payne и Fahrenheit.
 
СообщениеIvan_Black, http://docs.unity3d.ru/ScriptReference/Animation.html

Автор - Скептик
Дата добавления - 20 Ноя 2011 в 14:21
Ori0nДата: Пн, 09 Апр 2012, 17:42 | Сообщение # 8
Нет аватара
 
Сообщений: 2
Награды: 0
Репутация: 0
Статус: Offline
Как сделать триггеры дочерними? Гугл ничего не дал...
 
СообщениеКак сделать триггеры дочерними? Гугл ничего не дал...

Автор - Ori0n
Дата добавления - 09 Апр 2012 в 17:42
ЛевшаДата: Пн, 09 Апр 2012, 17:52 | Сообщение # 9
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Через gameObject.transform.parent, как же еще... smile

X.cor.R (Prologue)
 
СообщениеЧерез gameObject.transform.parent, как же еще... smile

Автор - Левша
Дата добавления - 09 Апр 2012 в 17:52
Ori0nДата: Пн, 09 Апр 2012, 20:46 | Сообщение # 10
Нет аватара
 
Сообщений: 2
Награды: 0
Репутация: 0
Статус: Offline
При тестировании почему-то проваливаюсь сквозь кубы и падаю вниз...
 
СообщениеПри тестировании почему-то проваливаюсь сквозь кубы и падаю вниз...

Автор - Ori0n
Дата добавления - 09 Апр 2012 в 20:46
seamanДата: Пн, 09 Апр 2012, 22:09 | Сообщение # 11
Гуру
 
Сообщений: 1748
Награды: 10
Репутация: 660
Статус: Offline
Видимо контроллер чуток входит внутрь куба
 
СообщениеВидимо контроллер чуток входит внутрь куба

Автор - seaman
Дата добавления - 09 Апр 2012 в 22:09
BulletlossДата: Ср, 04 Июл 2012, 12:53 | Сообщение # 12
Нет аватара
 
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
Проблемка! Когда срабатывает ловушка то куб пролетая сквозь deathTrigger вываливается в точке респавна и тем самым очень сильно мешает blink Помогите

Добавлено (04.07.2012, 12:53)
---------------------------------------------
Кто-нибудь?!!

 
СообщениеПроблемка! Когда срабатывает ловушка то куб пролетая сквозь deathTrigger вываливается в точке респавна и тем самым очень сильно мешает blink Помогите

Добавлено (04.07.2012, 12:53)
---------------------------------------------
Кто-нибудь?!!


Автор - Bulletloss
Дата добавления - 04 Июл 2012 в 12:53
ОктавианАвгустДата: Ср, 12 Сен 2012, 11:56 | Сообщение # 13
Нет аватара
 
Сообщений: 5
Награды: 0
Репутация: 0
Статус: Offline
itweena нигде нет, как быть?

[img]http://i.imgur.com/Wr8o8.jpg[/img]
 
Сообщениеitweena нигде нет, как быть?

Автор - ОктавианАвгуст
Дата добавления - 12 Сен 2012 в 11:56
МаксимДата: Ср, 12 Сен 2012, 12:52 | Сообщение # 14
...
 
Сообщений: 1113
Награды: 9
Репутация: 345
Статус: Offline
ОктавианАвгуст, оно?

 
СообщениеОктавианАвгуст, оно?

Автор - Максим
Дата добавления - 12 Сен 2012 в 12:52
FunnyAlienДата: Ср, 12 Сен 2012, 16:25 | Сообщение # 15
NYAN-NYAN?
 
Сообщений: 3643
Награды: 14
Репутация: 835
Статус: Offline
Урок перепишу и допишу. Ждите.

Согласно протоколу испытаний, начиная с этого момента, мы перестаем говорить правду. Три, два, один.
 
СообщениеУрок перепишу и допишу. Ждите.

Автор - FunnyAlien
Дата добавления - 12 Сен 2012 в 16:25
ОктавианАвгустДата: Чт, 13 Сен 2012, 10:17 | Сообщение # 16
Нет аватара
 
Сообщений: 5
Награды: 0
Репутация: 0
Статус: Offline
Максим, Оно, спасибо!

[img]http://i.imgur.com/Wr8o8.jpg[/img]
 
СообщениеМаксим, Оно, спасибо!

Автор - ОктавианАвгуст
Дата добавления - 13 Сен 2012 в 10:17
eee12Дата: Чт, 17 Окт 2013, 17:48 | Сообщение # 17
 
Сообщений: 54
Награды: 0
Репутация: 10
Статус: Offline
дайте пожалуйста Itween, только не ссылку на сайт, а то у меня не получается скачать оттуда. не где больше не могу найти cry

:-]
 
Сообщениедайте пожалуйста Itween, только не ссылку на сайт, а то у меня не получается скачать оттуда. не где больше не могу найти cry

Автор - eee12
Дата добавления - 17 Окт 2013 в 17:48
Форум Игроделов » UNITY3D » МАНУАЛЫ И УРОКИ » Разработка платформера или азы Unity скриптинга
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024