УДК 004
Бахтин И.В. студент 2 курса
09.03.02 Информационные системы и технологии
САФУ имени М.В. Ломоносова Россия, г. Архангельск СОЗДАНИЕ ИГРОВОГО ПРИЛОЖЕНИЯ С ИСПОЛЬЗОВАНИЕМ СРЕДЫ РАЗРАБОТКИ ИГР UNITY Аннотация: В статье рассмотрена взаимодействие языка программирования C# и среды разработки игр Unity.
Ключевые слова: Unity, C#, Игровое приложение, Кроссплатформенность.
Bakhtin I. V. The 2nd year student 09.03.02 Information systems and technologies NArFU named after M. V. Lomonosov Russia, Arkhangelsk CREATING A GAMING APPLICATION USING THE ENVIRONMENT
DEVELOPMENT GAME UNITY Abstract: The article deals with the interaction of the C# programming language and the Unity game development environment.
Keywords: Unity, C#, Gaming application, Сгoss platform.
ВВЕДЕНИЕ
Для демонстрации средств Unity, создадим игру «Пятнашки». Суть приложения заключается в следующем: пользователь на экране видит поле, которое разбито на 16 одинаковых клеток. В пятнадцати из них расположены неповторяющиеся цифры, в случайном порядке от 1 до 15 и одна пустая. В общем виде табло можно представить в виде таблицы 1.
Таблица 1
Образец табло__
5 7 3 8
15 1 13 2
14 10 6 5
9 11 12
Игрок должен перемещать по одной клетке с цифрой на пустое место. Так происходит до тех пор, пока пользователь не выстроит последовательную комбинацию цифр, которая представлена в таблице 2.
Таблица 2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15
А
РАЗРАБОТКА ПОСТАВЛЕННОЙ ЗАДАЧИ ОПИСАНИЕ ИГРЫ
Данное приложение является кроссплатформенной версией знаменитой игры «Пятнашки». Это логически не сложное и достаточно простое в управлении и использовании приложение. Применения данной программы возможны везде, хоть на перемене в школе, хоть в пробке, ведь данная игра поможет расслабиться и отвлечься от повседневных дел.
В данном приложении предполагалось создание:
- интуитивно понятного интерфейса;
- минималистичного, но графически точного табло, где происходит переход блоков;
- удобного для пользователя управления.
В приложении использовались следующие разделы C#:
- управляющие структуры (условия, циклы);
- массивы;
- символы и строки;
- работа с файлами и графическими возможностями.
В итоге получилось приложение-игра, в которой использовались возможности языка программирования C#.
ОПИСАНИЕ РЕШЕНИЯ ЗАДАЧИ
Для реализации нашего приложения будем использовать паттерн MVC (Model-View-Controller). Model (модель) предоставляет данные и реагирует на команды контроллера, изменяя своё состояние. View (представление) отвечает за отображение данных модели пользователю, реагируя на изменения модели. Controller (контроллер) интерпретирует действия пользователя, оповещая модель о необходимости изменений.
Нарисуем блок-схему приложения, для более наглядного представления реализации нашего проекта. Блок-схема приложения представлена в соответствии с рисунком 1.
А
V™
Г
Начала
Рисунок 1 - Блок-схема приложения ПРОЕКТИРОВАНИЕ ИГРОВОГО ПРИЛОЖЕНИЯ ОПИСАНИЕ ПЕРЕМЕННЫХ, КЛАССОВ И МЕТОДОВ
Логика программы выполнена в среде языка программирования C#. Для реализации графического интерфейса используется среда разработки Unity.
А
Программой обрабатываются события от нажатия клавиш мыши, выбора пунктов меню, а также считывание количества ходов.
Для того чтобы не усложнять листинг программы, вся программа разбита на классы и методы, каждые из которых отвечают за определённое действие. Всю программу можно разделить на два основных раздела:
- основные методы и классы (методы и классы, которые отвечают за саму игру и взаимодействие с пользователем во время игры;
- вспомогательные методы и классы (методы и классы, которые дополняют данное приложение дополнительными функциями и упрощают исходный код программы).
К основным методам и класса относятся:
- game (метод, который инициализирует игру);
- start (метод, который позволяет начать игру);
- shuffle (метод, перемешивающий фишки);
- pressât (метод, позволяющий управлять фишками);
- shift (метод, который позволяет передвигать фишки);
- getdigitat (метод, который позволяет узнать, где какая фишка находится на
поле);
- solved (метод, проверяющий правильность решения);
- map (структура, где будет храниться рабочая доска). К вспомогательным методам и классам относятся:
- coord (структура, которая работает с координатами x и y);
- onboard (метод, который позволяет узнать, попадает ли координата на
поле);
- add (метод, изменяющий координату для перемещения);
- set (сеттер, структуры Map);
- get (геттер, структуры Map);
- copy (метод, который копирует координаты куда копируем и то значение откуда).
ПРОЕКТИРОВАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА
Основной задачей приложения является создание минималистичного, но информативного игрового табло, для того чтобы пользователь с удобством использовал приложение. На рисунке 2 представлен интерфейс игрового поля.
А
г™
У
2 53
Рисунок 2 - Предполагаемый интерфейс РЕАЛИЗАЦИЯ ИГРОВОГО ПРИЛОЖЕНИЯ ВЫБОР ЯЗЫКА ПРОГРАММИРОВАНИЯ И СРЕДЫ РАЗРАБОТКИ
Для реализации игрового приложения воспользуемся языком программирования C#. C# - простой, современный объектно-ориентированный язык программирования. Благодаря множеству нововведений C# обеспечивает возможность быстрой разработки приложений, но при этом сохраняет выразительность и элегантность, присущую языкам C. Для написания кода будем использовать среду разработки Visual Studio 2017.
Для реализации графического интерфейса воспользуемся Unity. Unity -межплатформенная среда разработки компьютерных игр. Unity позволяет создавать приложения, работающие под более чем 20 различными операционными
Л
системами, включающими персональные компьютеры, игровые консоли, мобильные устройства, интернет-приложения и другие.
РАЗРАБОТКА ПРИЛОЖЕНИЯ Для реализации исходного кода необходимо владеть знаниями языка программирования. Для того чтобы код был читаемым и понятным для остальных желательно разбить программный код на отдельные классы и провести рефакторинг кода. В среде Visual Studio нажмём создать и выберем «Библиотека классов». Создание библиотеки классов представлена в соответствии с рисунком 3.
Создание проекта эследние файлы
Другие языки л Visual С*
Классическое приложение Windows
.NET Standard
Тест
> Visual Basic
> JavaScript
> TypeScript Другие типы проектов
He нашли то, что искали?
Открыть Visual Studio Installer
Сортировка: По умолчанию " |
шшс* ж
nj Приложение WPF (.NET Framework) Visual С#
[Çtt| Приложение Windows Forms (.NET Framework) Visual C#
Консольное приложение (.NET Framework) Visual C#
^jj Библиотека классов (.NET Framework) Visual C#
Служба Windows (.NET Framework) Visual C#
mc;
^ J Пустой проект (.NET Framework) Visual C#
(Гц Приложение браузера WPF (.NET Framework) Visual C#
Библиотека настраиваемых элементов управления... Visual С*
Сс"
Библиотека пользовательских элементов управлени...Visual С#
<ЖЖ
|В ] Библиотека элементов управления Windows Forms (... Visual С# ▼
Расположение:
ClassLibrary2
C:\Users\lgor\source\repos
ClassLibrary2
.NET Framework 4.6.1
Проект для создания библиотеки классов С* (.dll)
Обзор...
R1 Создать каталог для решения [Г] Создать новый репозиторий Git
Рисунок 3 - Выбор библиотеки классов Далее приступим к написанию исходного кода. Для этого создадим 3 класса:
- map (игровое поле);
- coord (координаты поля);
- game (игра).
Структура «Coord» представлена в соответствии с рисунком 4.
А
{
public int x; public inc y;
ссылок: 3 I 0 кзмепегми I 0 авторов. О изменении
public Coord (int x, int y) {
this.x = x; this.у = у;
}
ссылок: 2 I 0 юмелетй 0 авторов. О изменении
public Coord (int size) {
x * size - l; у = size - l;
>
ссылок: 2 I 0 имепетй 0 авторов. О изменении
public bool OnBoard(int size) {
if (x < 0 || x > size - 1) return false; if (y < 0 11 у > size - 1) return false; return true;
}
ссылок: 2 | 0 измепегми 0 авторов. О изменении
public lEnu*erable<coord> YieldCoord(int size) {
for (у = 0; у < size; y++)
for (x = 0; x < size; x++)
yield return this;
}
ссылка: 11 0 изменений I 0 авторов. О изменений
public Coord Add(int sx, int sy) {
return new coord(x + sx, у + sy);
}
}
>
Рисунок 4 - Структура сооМ Структура «Map» представлена в соответствии с рисунком 5.
А
Uli rid
Ma n
int size; int[,] lap;
ссылка: 11 0 изменений | 0 авторов. О изменений
public nap (int size) {
this.size = size;
■ap = new int[size, size];
}
ссылок: 2 I 0 измеиепмй 1 0 авторов. О изменении
public void Set (Coord xy, int value) {
if (xy.OnBoard(size))
■ap[xy.x, xy.y] = value;
}
ссылок: 3 | 0 изменетш I 0 авторов. О изменении
public int Get (Coord xy) {
if (xy.OnBoard(size))
return *ap[xy.x> xy.y];
return 0;
}
0;
ССЫЛХ
publ {
авторов. О изменении
roid Copy(Coord fro«, Coord to)
Set (to, Get (-Fro«));
}
Рисунок 5 - Структура map Класс «Game» представлен в соответствии с рисунками 6, 7 и 8.
А
int size; нар up; Coord space;
ссылок: 2 I 0 wiwigniH 0 авторов. О изменении
public int aoves { get; private set; }
ссылка: 11 0 изменений I 0 авторов. О изменений
public Game(int size) {
this.size = size; aap = new Map(size);
}
ссылка: 11 0 изменений I 0 авторов. О изменений
public void Start(int seed = в) {
int digit = 0;
-foreach (Coord xy in new Coord().Yieldcoord(size))
map.Set(xy, ++digit); space = new coord(size); if (seed > 0)
Shuffle(seed); moves = 0;
>
ссылке! 11 0 изменений I 0 звторое, 0 измемепий
void Shuffle (int seed) {
Random random = new Random(seed); for (int j = 9; j < seed; j++)
PressAt(random.Next(size), random.Next(size));
}
ссылка: 11 О изменений | 0 авторов. О изменений
public int PressAt(int x, int y) {
return PressAt (new Coord (x, y)) ;
>
Рисунок 6 - Класс game (1)
А
258
public int PressAt(int x, int y) {
return PressAt (new Coord (x, y)) ;
>
ссылка: 11 0 изменений I 0 авторов. О изменений
int PressAt(Coord xy) {
if (space.Equals(xy))
return 0; if (xy.x !> space.x && xy.y != space.y)
return в;
int steps = Math.Abs(xy.x - space.x) + Math.Abs(xy.y - space.y);
while (xy.x != space.x)
5hift(Math.sign(xy.x - space.x), e);
while (xy.y != space.y)
Shift(e, nath.sign(xy.y - space.y));
■oves += steps; return steps;
}
ссылок: 2 I 0 «ж*1«й I 0 авторов. О изменении
void Shift(int sx, int sy) {
Coord next = space.Add(sx, sy); ■ap.Copy(next, space); space = next;
>
ссылка: 11 0 изменении I 0 авторов. О изменении
public int GetOigitAt(int x, int y) {
return GetOigitAt(new Coord(x,y));
}
Рисунок 7 - Класс game (2)
int GetDigitAt(Coord xy) {
if (space.Equals(xy))
return в; return aap.Get(xy);
>
; ссылок: 0 I 0 юшепеши I 0 авторов. 0 mweneiuw
public bool Solved() {
if (!space.Equals(new Coord(size)))
return -False; int digit = в;
foreach (Coord xy in new Coord().YieldCoord(size)) if (map.Get(xy) != ++digit) return space.Equals(xy);
return true;
>
! } >
Рисунок 8 - Класс game (3)
А
Так как мы создавали не исполняемый файл, а библиотеку классов, то это упростит реализацию паттерна MVC. Мы можем использовать уже ранее созданный «.dll» файл с нашими классами в различных проектах.
РАЗРАБОТКА ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА Для реализации интерфейса воспользуемся средой разработки Unity. Также воспользуемся нашим макетом приложения. Портретный режим является наиболее удобным для того, чтобы играть в игру «Пятнашки». Для того чтобы создать приложение необходимо в настройках Unity выбрать необходимую платформу для реализации приложения. Выбор соответствующей платформы представлен в соответствии с рисунком 9. Так же добавим ранее созданную библиотеку классов, звуковые эффекты и создадим необходимые скрипты для реализации приложения.
Build Settings х
Scenes In Build
Isi Scenes/MainScene
Platform
PC, Mac & Linux Standalone
HhJ
Вios
Android
• tV tv0S ^^ Xbox One
PS Vita
PS4
! Universal Windows Platform
Switch Platform 11 Player Settings... |
Add Open Scenes
PC,
Mac & Linux Standalone
Target Platform I Windows
Architecture | x86_64
Copy PDB files
Create Visual Studio Solution Q Development Build
Autoconnect Profiler Script Debugging Scripts Only Build
Compression Method
Default
Learn about Unity Cloud Build
Build_11 Build And Run
Рисунок 9 - Выбор интересующей платформы Добавим необходимые элементы на рабочее пространство, а, именно:
- фоновое изображение (картинка, которая будет за плашками);
- кнопки с цифрами (игровые плашки);
- кнопку начала игры (кнопка, которая указывает, куда нажать, чтобы начать
игру);
- текст (в главном меню он является приветственным, а в ходе игры он указывает на количество ходов).
А
Расположим добавленные элементы в соответствии с нашим макетом. После расположения элементов по полю наше игровое пространство представлено в соответствии с рисунком 10.
......... I
| Чзчзп, wpy щ
1
F F F F
F F F F
LL F F F
LL F F F
Приветствую
Рисунок 10 - Готовое игровое поле Далее приступим к реализации паттерна MVC. Для этого напишем необходимые методы для связки ранее написанной логики и элементов, которые были добавлены в среде Unity. Необходимые методы представлены в соответствии с рисунками 11 и 12. Данные методы используют возможности как языка программирования, так и средства среды разработки. Для добавления музыки воспользуемся стандартными средствами Unity. Исходный код скрипта «Sound» представлен в соответствии с рисунком 13.
А
const int size = 4; Game game; Sound sound; public Text TextMoves;
ссылок: 0
void start () {
game = new Game(size);
sound = GetComponent<Sound>();
HideButtons();
}
ссылок: 0
public void OnStartO {
game. Start (2в{); showButtons(); sound.PlayStart();
}
ссылок: 0
public void OnClick() {
i-f (game.Solved())
return»
string name = EventSystem.current.currentSelectedGameObject.name; int x = int.Parse(name.5ubstring(0, 1)); int у = int.Parse(name.Substring(l, 1)); i-f (game.PressAt(x, y) > e)
sound.PlayMove(); game.PressAt(x, y); ShowButtons();
i-f (game.Solved()) ; {
TextMoves.text = "игра завершена за " + game.moves + " хода"; sound.PlaySolved();
j } >
Рисунок 11 - MainScript (1)
A
ссылка: 1
void HideButtons() ■ {
for (int x = 0; x < size; x++)
for (int у = 0; у < size; y++) ShowOigitAt(0, x, y); TextMoves.text = "Приветствую"; i }
void Show8uttons() • {
for (int x = 0; x < size; x++)
for (int y = 0; y < size; y++)
ShowOigitAt(gane.cetDigitAt(x>y)> x, y); TextMoves.text = game.aoves + "
! }
void showOigitAt (int digit, int x, int y) i (
string name = x + "" + y; var button = GaneObject.Find(nane); var text = button.GetComponentInChildren<Text>(); text.text = DecToHex(digit); button.GetCo«ponentInChildren<image>().color = // уст; (digit > 0) ? Color.white : Color.clear;
}
Lng DecToHex(int digit)
if (digit == 0) return "";
if (digit < 10) return digit.ToString();
return ((char)("A" + digit - 10)).ToString();
Рисунок 12 - MainScript (2)
A
using unityEngine;
ссылок: 2
Epublic class Sound : MonoBehaviour {
Audiosource sound; AudioClip audioHove; AudioClip audioStart; AudioClip audiosolved;
! ссылок: 0
E void Start () {
sound = Getcomponent<AudioSource>(); audioMove = Resources.Load<AudioClip>("»ove"); audioStart = Resources.Load<AudioClip>("start"); audioSolved = Resources.Load<AudioClip>("solved");
}
J ссылка: 1
E public void PlayMove() i {
sound.PlayOneShot(audioMove);
}
I ' ссылка: 1 _
E public void PlayStart()| {
sound.PlayOneShot(audioStart);
j }
; ссылке: 1
Ё: public void PlaySolved() : {
sound.PlayOneShot(audioSolved);
• }
L>
Рисунок 13 - Sound ТЕСТИРОВАНИЕ
После реализации нашей задумки необходимо протестировать работу нашего приложения. Для этого необходимо выбрать в пункте «Build Settings» выбрать «Build». После некоторого будет создано наше приложение, которое можно протестировать на устройстве, тестирование приложения представлено на рисунке 14. Игровое поле представлено на рисунке 15. Правильная комбинация представлена в соответствии с рисунком 16.
А
Уел
V
Приветствую
Рисунок 14 - Приветствие пользователя
А
Начать игру
1 2 3 4
5 6 7
9 А В 8
О Е Р С
О
Рисунок 15 - Игровое поле
Начать ифу
1 2 3 4
5 6 7 8
9 А В С
D Е F
Игра завершена за 4 хода
Рисунок 16 - Правильная комбинация ЗАКЛЮЧЕНИЕ
В результате выполнения поставленных задач была достигнута цель расчетно-графической работы, а именно, создано приложение-игра, создан графический интерфейс приложения, таким, каким мы его представляли. Для более лучшей работы приложение желательно было сделать проверку на решаемость позиции, но реализация имеет сложную математическую модель.
Использованные источники:
1 C sharp - Википедия [Электронный ресурс].- Режим доступа: https://ru.wikipedia.org/wiki/C_Sharp (дата обращения: 15.02.2019)
2 Unity (игровой движок) - Википедия [Электронный ресурс].- Режим доступа: https://ru.wikipedia.org/wiki/Unity_(игровой_движок) (дата обращения: 17.02.2019)
А