вторник, 20 сентября 2016 г.

Matc3 игра в Unity, часть 1


Пожалуйста, уважайте авторские права / торговые марки других!
Если вы находитесь в спешке, вы можете попробовать игру здесь и найти исходный код здесь .
Матч три игры довольно известным в эти дни. От оригинального Bejeweled к Candy Давка Saga и даже эволюционировать: Hunters Quest , многие игры основаны на механизме матча 3, давая специализированные бонусы пользователю. Такой пример дает специальный пункт , если она соответствует более трех элементов. Если пользователь создает матч , который включает в себя этот бонус, то вся строка или столбец уничтожается.
В этом блоге мы постараемся рассекают в том, что нужно , чтобы создать такую ​​игру, спомощью Unity 3D, Visual Studio и язык программирования C #. Код игры был написан в Visual Studio (проверьте свободное Community Edition здесь ). Для целей отладки, не забудьте проверить инструментов Visual Studio за единство здесь .
Давайте начнем с экрана игрового хода в редакторе Unity
image_5062F746.png
Только внешние активы мы используем , некоторые конфеты графики (Public Domain, найденных на OpenGameArt здесь ) и очень крутой звук (найденный на Freesound здесь) , чтобы построить нашу игру. Пользователь может перетащить (в попытке поменять местами) одну конфету либо по горизонтали или по вертикали. Когда обмен происходит, игра проверяет на матч. Как только вертикальный или горизонтальный матч три (или больше!) Встречается, совпавшие конфеты исчезают. Оставаясь коллапсу конфеты, новые конфеты создаются , чтобы заменить их , которые разрушаются, тоже (представьте себе тяжести , действующая на них). Игра проверяет , является ли очередной матч из трех встречается (без какого - либо вмешательства со стороны пользователя). Если это произойдет, совпавшие те снова исчезают, оставшиеся конфеты коллапс, новые конфеты падают и так далее и так далее. Это продолжается до тех пор , не ровня трех не существует , и вмешательство пользователя требуется для игры , чтобы идти дальше. Если пользователь не прикасается к экрану на некоторое время, потенциальные матчи (конфеты , что если один из них получает местами будет формировать матч из трех) начать анимацию, чтобы дать пользователю небольшую подсказку, чтобы продолжить игру.
Описываемый поток игры можно визуализировать на диаграмме ниже
image_659DD063
Такая игра может иметь много видов бонусов. Ради этого блога, мы реализовали только один. Это создается, если пользователя перетащить / своп имеет матч из четырех (или более) как непосредственный результат (т.е. не создается в матчах четырех, которые происходят в последующем цикле обвалов / творениях). Эти бонусные конфеты имеют определенный цвет (соответствие один найденный в нормальной игре конфеты). Если пользователь позже делает матч, который содержит бонус, то вся строка или столбец удаляется (в зависимости от того, был ли горизонтально или вертикально ориентированный матч).
image_14F1D69F
Наша игра никогда не заканчивается; пользователь может поменять и уничтожает конфеты (в то время как имея ее оценка увеличилась) навсегда. В производственных играх, пользователь проходит через уровни путем достижения определенного счет или с помощью других средств, например, путем уничтожения количества специальной бонусной конфеты. В игре есть только одна сцена, которую мы будем описывать. Эта сцена имеет две кнопки, одна, чтобы перезапустить уровень и один, чтобы загрузить заранее определенный уровень (весьма полезно для отладки!).
Давайте погрузимся в код! Как и в наших предыдущих сообщениях в блоге, мы увидим файл кода с помощью файла.

Перечисления

Наша игра состоит из двух перечислений. BonusType содержит информацию о бонус ,который может нести форму / конфеты. Он был определился с Флаги атрибутов ,чтобы несколько значений в перечислении (проверьте здесь для хорошей статьи). В BonusTypeUtilities класс содержит только один метод, чтобы определить , содержит ли переменная перечисления указанного типа бонуса. Наконец, GameState перечисление содержит три состояния нашей игры.
- Нет: начальное состояние (холостой ход)
- SelectionStarted: когда пользователь начал перетаскивание
- Оживляющий: когда игра анимировать (показывая анимации, разрушаясь, создавая новые конфеты и т.д.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[Flags]
public enum BonusType
{
    None,
    DestroyWholeRowColumn
}
public static class BonusTypeUtilities
{
    public static bool ContainsDestroyWholeRowColumn(BonusType bt)
    {
        return (bt & BonusType.DestroyWholeRowColumn)
            == BonusType.DestroyWholeRowColumn;
    }
}
public enum GameState
{
    None,
    SelectionStarted,
    Animating
}

Константы

Содержит некоторые полезные постоянные и уверенных в объяснима переменные для нашей игры, анимации относительно длительности, оценка, строк и столбцов для массива, который будет содержать наши конфеты и многое другое.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static class Constants
{
    public static readonly int Rows = 12;
    public static readonly int Columns = 8;
    public static readonly float AnimationDuration =  0.2f;
    public static readonly float MoveAnimationMinDuration = 0.05f;
    public static readonly float ExplosionDuration = 0.3f;
    public static readonly float WaitBeforePotentialMatchesCheck = 2f;
    public static readonly float OpacityAnimationFrameDelay = 0.05f;
    public static readonly int MinimumMatches = 3;
    public static readonly int MinimumMatchesForBonus = 4;
    public static readonly int Match3Score = 60;
    public static readonly int SubsequentMatchScore = 1000;
}

форма

Класс Shape будет использоваться для хранения деталей для каждой отдельной конфеты. Каждая конфета GameObject на экране будет иметь компонент Shape, поэтому каждый экземпляр формы является MonoBehaviour. В нем содержится информация о потенциальных премиальных (а), от типа фигуры (в нашем случае, цвет конфеты) столбцов и строк, что конфеты помещается, конструктор, инициализирующий бонусный перечисление и метод, который сравнивает текущую форму с другой, сравнивая его тип. Мы используем строки и столбца, так как мы будем иметь два двумерный массив у себя наши конфеты.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Shape : MonoBehaviour
{
    public BonusType Bonus { get; set; }
    public int Column { get; set; }
    public int Row { get; set; }
    public string Type { get; set; }
    public Shape()
    {
        Bonus = BonusType.None;
    }
    public bool IsSameType(Shape otherShape)
    {
        if (otherShape == null || !(otherShape is Shape))
            throw new ArgumentException("otherShape");
        return string.Compare(this.Type, (otherShape as Shape).Type) == 0;
    }
Так как форма является MonoBehaviour, который прилагается к нашим префабы (как мы увидим позже), мы не можем использовать конструктор для его инициализации.Таким образом, мы внедрили метод Assign, который устанавливает основные свойства фигуры. Метод SwapColumnRow меняет местами строки и свойства столбцов двух экземпляров формы.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public void Assign(string type, int row, int column)
    {
        if (string.IsNullOrEmpty(type))
            throw new ArgumentException("type");
        Column = column;
        Row = row;
        Type = type;
    }
    public static void SwapColumnRow(Shape a, Shape b)
    {
        int temp = a.Row;
        a.Row = b.Row;
        b.Row = temp;
        temp = a.Column;
        a.Column = b.Column;
        b.Column = temp;
    }
}

0 коммент.:

Отправить комментарий