воскресенье, 8 февраля 2015 г.

SpyQuest. 03 Точки интереса

При старте игры SpyQuest скрипт, формирующий игровую карту, сообщает каждому персонажу все точки интереса (POI) на карте, которыми последний сможет воспользоваться для выполнения того или иного желания.
Каждая точка интереса характеризуется следующими свойствами:
public Wish PerformedWish;
public float PerformingSpeed;
public bool IsAvailable = true;
public float TimeToAvailable;
Свойства PerformedWish и PerformingSpeed отвечают за желание, которое неигровой персонаж (NPC) сможет выполнить в этой точке интереса, и скорость выполнения этого желания соответственно. Свойства IsAvailable и TimeToAvailable указывают соответственно, свободна ли данная точка для её использования и время, которое должно пройти с момента последнего использования, чтобы точка снова стала свободной.

Такая структура способна описать любой предмет на игровой карте, которым персонаж сможет как-то воспользоваться. Например, в парке есть фонтан, созерцание которого поднимает настроение и реализует желание развлечься (PerformedWish = Wish.Fun). Фонтан большой, развлекаться таким образом могут сразу несколько персонажей, следовательно, нет необходимости блокировать фонтан при его использовании (TimeToAvailable = 0f). В случае с торговым автоматом (PerformedWish = Wish.Hunger), также находящимся в парке, дело обстоит иначе: предметом не могут воспользоваться сразу несколько персонажей, потому что он работает по принципу «кто быстрее». В этом случае при свойстве TimeToAvailable = 3f автомат блокируется и снова становится доступным лишь спустя 3 секунды после окончания его использования.

Поиск точек интереса на игровой карте осуществляется следующим способом:
public List<PointOfInterest> POIs;
...
var POIobjects = GameObject.FindGameObjectsWithTag(GameParam.TagPOI);
foreach (var poi in POIobjects)
{
    var poiScript = poi.GetComponent<PointOfInterest>();
    POIs.Add(poiScript);
}
Таких точек может быть много, пробегаться по данному списку каждый раз неэффективно, поэтому для оптимизации был также введён словарь, в котором точки интереса хранятся по частям, сгруппированным по выполняемому ими желанию. Следующий код реализует это:
public List<PointOfInterest> GetPOIs(Wish wish)
{
    if (!_poisByNeeds.ContainsKey(wish))
    {
        var pois = new List<PointOfInterest>();
        _poisByNeeds[wish] = pois;
     
        foreach (var poi in POIs)
        {
            if (poi.PerformedWish == wish)
                pois.Add(poi);
        }
    }
 
    return _poisByNeeds[wish];
}
Оптимизация кода является важным моментом при разработке игры. Нужно понимать, что на отрисовку графики всегда тратится много ресурсов и непростительно, если игра будет тормозить не из-за крутой и красивой картинки, а из-за неоптимизированного программного кода.

Комментариев нет:

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