Создайте абстрактную модель своей основной механики
Чтобы что-то быстро заработало, нам нужно, чтобы оно было простым - это означает доведение игры до базовой механики c и представление этого (и этого только).
Итак, что это значит? Ну, во-первых, у нас есть мир на основе плитки. Простым представлением этого является 2D-массив объектов Tile, например:
/// <summary>
/// This gameworld is 20x20 tiles
/// </summary>
public Tile[,] Tiles = new Tile[20,20];
Недоступные части света - например, потому что комната не прямоугольная angular или в ней неинтерактивная мебель way - в этом массиве могут быть просто нулевые значения.
Далее, есть символы, которые перемещаются по этим плиткам. У каждого персонажа тоже есть здоровье:
public class Character {
/// <summary>
/// The tile this character is on.
/// </summary>
private Tile _currentLocation;
/// <summary>
/// The tile this character is on.
/// </summary>
public Tile CurrentLocation{
get{
return _currentLocation;
}
set{
if(_currentLocation != null)
{
_currentLocation.Occupier = null;
}
_currentLocation = value;
_currentLocation.Occupier = this;
}
}
/// <summary>
/// Its HP
/// </summary>
public float Hitpoints = 100f;
public void SetLocation(Tile newLocation){
CurrentLocation = newLocation;
}
}
Мы могли бы сделать более специализированные варианты Персонажа, например class Hero : Character
со специализированными свойствами, но пока будем это игнорировать.
CurrentLocation выше также обновляет плитку тоже - по скорости помогает узнать, какой персонаж стоит на конкретной плитке, поэтому вот класс плиток с учетом этого:
public class Tile{
public Character Occupier;
public int X;
public int Y;
}
Хорошо, давайте создадим мир - этот прямоугольник angular для простоты, поэтому все плитки заполнены:
for(var x=0;x<20;x++){
for(var y=0;y<20;y++){
Tiles[x,y] = new Tile(){X = x, Y = y};
}
}
И мы просто набросим 2 символа в определенном месте:
var badGuy = new Character();
badGuy.CurrentLocation = Tiles[3,4];
var hero = new Character();
hero.CurrentLocation = Tiles[9,9];
С этого момента, у нас очень упрощенная c модель мира. Мы можем спросить, например, что стоит на плитке x, y, проверив Tiles[x,y].Occupier
. Отсюда вы начинаете добавлять свою механику в модель - это может быть, например, какой-то метод aTile.Attack(AttackType.IceBlast)
:
public void Attack(AttackType type, Character attackedBy){
// impacts type.Range tiles around this one, dealing damage to each Occupier.
// Get a neighbouring tile via e.g. yourReferenceToTheTilesArray[X+1, Y].
}
Важно, что игра затем модифицируется, чтобы быть просто отражением модель - таким образом модель всегда точна, так как она управляет игрой и является истинным источником, например, количества урона. Вы можете добавить к нему события, поэтому при вызове вышеуказанного метода Attack запускается некоторый обработчик OnAttack, который затем запускает анимацию при запуске полной игры.
Модель, подобную этой, может быть запущена как автономная * Программа 1037 *, полностью вне Unity, с возможностью генерировать миллионы оборотов в секунду для тестирования или обучения AI.