[Разработка игр, C#, Unity] Разработка своей Just Shapes & Beats. Канвас и немного об оптимизации
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
ПредисловиеДобро пожаловать во вторую статью о разработке своей Just Shapes & Beats. Сегодня я продолжу первую статью и расскажу вам об использовании канваса, Unity Timeline'а и немного об оптимизации.Использование канвасаПосле компиляции игры на андроид я выявил, что размеры объектов совершенно не соответствуют тем, которые были на мониторе компьютера, на котором я запускал игру. После изучения доков Unity и дополнительной информации я понял, что мне нужно использовать канвас. После создания канваса у меня появилась возможность абсолютно точно позиционировать и мастштабировать объекты, находящиеся на экране и теперь объекты на экране телефона отображались корректно.ОптимизацияПриступим к теме оптимизации. Так как я изначально создавал все объекты через Instantiate, а количество вызовов этого метода порой доходило до 100 раз за один кадр, мне понадобилось оптимизировать их создание. После очередного перелопачивания разных материалов, я вычитал, что для таких целей существует пул объектов. Работает он следующим образом:
- В методе Start создаётся нужное количество объектов и делается неактивным, чтобы не загружать память
- Каждый объект записывается в List<GameObject>
- Когда мы вызываем метод GetObject мы берём последний элемент, удаляем его из списка, делаем его активным и возвращаем. Если объекты закончились, то мы создаём их через Instantiate и так же возвращаем.
- Когда мы вызываем метод ReturnObject мы должны передать в него какой-то GameObject, этот GameObject сделается неактивным и запишется в List.
Скрипт пула выглядит вот так:
public class Pool : MonoBehaviour
{
public List<GameObject> PoolObjects = new List<GameObject>();
public GameObject Instance;
public void Init(int instanceCount, GameObject instance){
for(int i = 0; i < instanceCount; i++){
GameObject _instance = GameObject.Instantiate(instance) as GameObject;
_instance.transform.SetParent(Utils.Global.Arena, false);
_instance.SetActive(false);
PoolObjects.Add(_instance);
}
Instance = instance;
}
public GameObject GetObject(){
if(PoolObjects.Count > 0) {
GameObject _instance = PoolObjects[PoolObjects.Count - 1] as GameObject;
PoolObjects.Remove(PoolObjects[PoolObjects.Count - 1]);
_instance.SetActive(true);
return _instance;
}
else{
GameObject _instance = GameObject.Instantiate(Instance) as GameObject;
_instance.transform.SetParent(Utils.Global.Arena, false);
_instance.SetActive(true);
return _instance;
}
}
public void ReturnObject(GameObject instance){
instance.SetActive(false);
PoolObjects.Add(instance);
}
}
Создание пула довольно хорошо подняло производительность, но игра всё ещё тормозила. Я нашёл ещё один способ оптимизации, но о нём я расскажу уже в следующей статье.Редактор уровнейПоговорим немного о редакторе. Он был основал на Unity Timeline, там есть такая замечательная штука как Marker - это что-то вроде команды, которая отправляется в заданное время. Также есть возможность создавать кастомные маркеры и выполнять с помощью них всё, что угодно.Вкратце код маркера выглядит вот так:
public class NotificationMarker : Marker, INotification
{
public PropertyName id { get; }
}
Также в этот маркер мы можем занести какие-то данные и изменять их напрямую через Unity. В качестве информационного источника я использовал эту статью:How to create custom Timeline Markers커스텀 타임라인 마커 만들기カスタム Timeline Marker の作成方法 - Unity Technologies Blogblogs.unity3d.comВ ней подробно описано, как можно создать кастомные Notification'ы, маркеры, как их стилизовать и т.д.Создание уровнейНа самом деле, используя Unity Timeline, я обрёк себя на вечные мучения. Так как в JSAB у каждой атаки есть своё время предупреждения и активное время, мне нужно было создавать каждый маркер на секунду или две раньше, чтобы это предупреждение сработало. Именно этот фактор и создавал все проблемы. Для удобства я назначил создание каждой атаки на свою клавишу и добавил стандартное смещение по времени на одну секунду.Первый релизГде-то в июле я выпустил первый билд игры на Gamejolt, он был очень сырой, но там было несколько уровней.Извините, данный ресурс не поддреживается. :( Извините, данный ресурс не поддреживается. :( Извините, данный ресурс не поддреживается. :( Извините, данный ресурс не поддреживается. :( Также немного позже я переписал игру с целью оптимизации (подробнее об этом в следующей статье) и создал ещё три новых уровня.Извините, данный ресурс не поддреживается. :( Извините, данный ресурс не поддреживается. :( Извините, данный ресурс не поддреживается. :( После создания последнего уровня моё терпение лопнуло и я понял, что мне нужен нормальный редактор уровней. Я в третий раз переписал игру и взялся за его разработку. Как раз об этом я и расскажу в следующих статьях. Спасибо за внимание!
===========
Источник:
habr.com
===========
Похожие новости:
- [Разработка игр, IT-стандарты, IT-компании] Как устроена постановка света в современных играх и кто такой художник по освещению в GameDev
- [Программирование, .NET, C#] Cоздание переиспользуемых Linq фильтров (построителей предикатов для Where), которые можно применять для разных типов
- [.NET, C#, Профессиональная литература] Книга «C# 8 и .NET Core. Разработка и оптимизация»
- [Разработка игр] Проблемы с производительностью в игре XCOM 2
- [.NET, C++, C#] Трансляция кода с C# на C++: работа портера
- [.NET, Разработка игр, C#] Многопоточность в Photon
- [Программирование, C#] Лучшие практики обработки исключений в C# (перевод)
- [Разработка игр, Копирайт, Игры и игровые приставки, IT-компании] Как расширить лор игры на примере Vikings: War of Clans. Часть 2
- [.NET, C#, Xamarin] Улучшаем биндинги в CSharpForMarkup
- [Разработка игр, C#, Unity] Разработка своей Just Shapes & Beats и как всё началось
Теги для поиска: #_razrabotka_igr (Разработка игр), #_c#, #_unity, #_jsab, #_jsb, #_unity, #_c#, #_gamedev, #_gamedevelop, #_razrabotka_igr (
Разработка игр
), #_c#, #_unity
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 13:51
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
ПредисловиеДобро пожаловать во вторую статью о разработке своей Just Shapes & Beats. Сегодня я продолжу первую статью и расскажу вам об использовании канваса, Unity Timeline'а и немного об оптимизации.Использование канвасаПосле компиляции игры на андроид я выявил, что размеры объектов совершенно не соответствуют тем, которые были на мониторе компьютера, на котором я запускал игру. После изучения доков Unity и дополнительной информации я понял, что мне нужно использовать канвас. После создания канваса у меня появилась возможность абсолютно точно позиционировать и мастштабировать объекты, находящиеся на экране и теперь объекты на экране телефона отображались корректно.ОптимизацияПриступим к теме оптимизации. Так как я изначально создавал все объекты через Instantiate, а количество вызовов этого метода порой доходило до 100 раз за один кадр, мне понадобилось оптимизировать их создание. После очередного перелопачивания разных материалов, я вычитал, что для таких целей существует пул объектов. Работает он следующим образом:
public class Pool : MonoBehaviour
{ public List<GameObject> PoolObjects = new List<GameObject>(); public GameObject Instance; public void Init(int instanceCount, GameObject instance){ for(int i = 0; i < instanceCount; i++){ GameObject _instance = GameObject.Instantiate(instance) as GameObject; _instance.transform.SetParent(Utils.Global.Arena, false); _instance.SetActive(false); PoolObjects.Add(_instance); } Instance = instance; } public GameObject GetObject(){ if(PoolObjects.Count > 0) { GameObject _instance = PoolObjects[PoolObjects.Count - 1] as GameObject; PoolObjects.Remove(PoolObjects[PoolObjects.Count - 1]); _instance.SetActive(true); return _instance; } else{ GameObject _instance = GameObject.Instantiate(Instance) as GameObject; _instance.transform.SetParent(Utils.Global.Arena, false); _instance.SetActive(true); return _instance; } } public void ReturnObject(GameObject instance){ instance.SetActive(false); PoolObjects.Add(instance); } } public class NotificationMarker : Marker, INotification
{ public PropertyName id { get; } } =========== Источник: habr.com =========== Похожие новости:
Разработка игр ), #_c#, #_unity |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 13:51
Часовой пояс: UTC + 5