RedHelium RedHelium

Jusper, Планируется в стим, но под издательством кого-нибудь. На счёт портирования на мобильные платформы пока не планировал

Jusper Jusper

RedHelium,

Игра планируется на стим? Если на телефон, то пост-эффекты будут лагать как сволочь)

RedHelium RedHelium

Jusper, Также немного переработан персонаж, некоторые объекты окружения. Помимо этого планируется ещё добавление различных интерактивных предметов и дополнительная работа над дизайном уровня! Также есть дополнительные пост...

Jusper Jusper

Я большую разницу в работе со светом.
Не понимаю, наверное это еще постэффекты.

alexprey alexprey

А вот и результаты первого забега.

...
Dreaman Dreaman

TheDarkestRed,

Красивый и атмосферный получился :)

RedHelium RedHelium

alexprey, Спасибо, рад стараться :)

TheDarkestRed TheDarkestRed

Концепт арт лесной локации The Darkest Red 🎮 🌲 🌘

...
id66243826 id66243826

Первый трейлер игры, больше похоже на нарезку но все же =) Так же было выпущено обновление, и теперь есть возможность покупать персонажей.
Решил немного разнообразить механики, добавлены двери и ключи,...

...
alexprey alexprey

RedHelium, стиль необычайно хорош)

RedHelium RedHelium

Вновь взялся за свой проект под названием "Stalkmech". Понемногу начал перерабатывать уровни, а также интерфейс.
Моя группа ВК: https://vk.com/redheliumgames

Jusper Jusper

Закрепили с GenElCon успех боем на островной карте.

  • Против нас были: Турция и Россия (на сложности Невозможный)
  • Время ненападения: Отсутствует
  • ...
ruggaraxe ruggaraxe

alexprey, будем ждать фидбэк! Я надеюсь вы заметите множество улучшений! 😎

alexprey alexprey

Ура! Обязательно поиграем. Но блиииннн... Опять пауки... Арахнофобия и в играх не дает покоя 😂
Режимы это круто, мне не хватало лайт версия для побродить!

Jusper Jusper

alexprey,

надеюсь в мою хату завезут нормальный интернет и у меня получится постримить :D

Jusper Jusper

Перенес в проект, вместо раздела game-design. Завтра заценим, че как :)

alexprey alexprey

ruggaraxe, это вообще одна из моих первых игр, после дума конечно же 😂😂😂

Сейчас в стиме по скидосу, прикупил,надеюсь свезет и поучавствую в подобной движухе)

Jusper Jusper

ruggaraxe, они, собственно, и сделаны были на основе 1-й части, можно сказать энтузиастами студии, которые топили за геймплей первой части. Вторая радикально отличалась и темпом геймплея, и сложностью освоения...

ruggaraxe ruggaraxe

Крутяк! 15 лет назад была любимой стратегией. 3 часть выглядит круто, стиль такой же как и во всех первых частях.

Логотип проекта Unity

Сшиватель мешей для Unity

Сшиватель мешей для Unity

Предисловие

В недавнем скриншотнике мы говорили, что работали над оптимизацией. Slash Polygon: Tournament предназначен прежде всего для мобильных платформ, поэтому вопрос производительности для нас почти номер 1.

Mesh Composer

Мы сделали небольшой скрипт, который сшивает меши в один, экономя отрисовку на устройстве. Инструкция использования простая:

Пример структуры объектов — Сшиватель мешей для Unity — Unity — DevTribe: инди-игры, разработка, сообщество (mesh composer, tool, Скрипт, скрипт)
Пример структуры объектов
  • Создайте пустой Game Object
  • В качестве Child к созданному объекту добавьте те модели, которые хотите сшить (для них должен использоваться 1 материал, иначе от сшивание нет смысла)
  • Добавьте компонент на Game Object - Mesh Composer
  • (опционально) Для подчиненных объектов можно включить Mesh Collider
Можно было еще включить нашу отрисовку теней, но она кастомная и вам не понадобится.
Компонент на объекте — Сшиватель мешей для Unity — Unity — DevTribe: инди-игры, разработка, сообщество (mesh composer, tool, Скрипт, скрипт)
Компонент на объекте

Вcпомогательная информация:

  • Total Childs (сколько подчиненных объектов в группе)
  • Total Verts (сколько в итоге вертексов получается в сшитом объекте)
  • Ругань, если подчиненные сшитые объекты имеют разный материал
  • Ругань, если максимальное количество вершин в одном сшитом объекте > 65536

Код

using UnityEngine;

namespace Visual
{
    [RequireComponent(typeof(MeshFilter))]
    [RequireComponent(typeof(MeshRenderer))]
    public class MeshComposer : MonoBehaviour
    {
        public MeshFilter MyFilter;
        public MeshRenderer MyRenderer;
        public MeshFilter[] InternalFilters;
        public Material SharedMaterial;
        [SerializeField] private bool _useMeshCollider;

        private void Awake()
        {
            Compose();
        }

        private void Compose()
        {
            var combineMeshes = new CombineInstance[InternalFilters.Length];
            for (int i = 0; i < combineMeshes.Length; i++)
            {
                combineMeshes[i].mesh = InternalFilters[i].mesh;
                combineMeshes[i].transform = InternalFilters[i].transform.localToWorldMatrix;
                InternalFilters[i].gameObject.SetActive(false);
            }

            MyFilter.mesh = new Mesh();
            MyFilter.mesh.CombineMeshes(combineMeshes, true, true, false);
            MyRenderer.material = SharedMaterial;

            if (_useMeshCollider)
            {
                var collider = gameObject.AddComponent<MeshCollider>();
                collider.sharedMesh = MyFilter.mesh;
            }
        }
    }
}
using System.Linq;
using UnityEditor;
using UnityEngine;

namespace Visual.Editor
{
    [CustomEditor(typeof(MeshComposer))]
    public class MeshComposerInspector : UnityEditor.Editor
    {
        private MeshComposer _instance;

        private void OnEnable()
        {
            _instance = (MeshComposer) target;
        }

        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            _instance.MyFilter = _instance.GetComponent<MeshFilter>();
            _instance.MyRenderer = _instance.GetComponent<MeshRenderer>();

            // fetch childs
            _instance.InternalFilters = _instance.GetComponentsInChildren<MeshFilter>()
                .Where(filter => filter != _instance.MyFilter).ToArray();

            EditorUtility.SetDirty(_instance);

            EditorGUILayout.HelpBox($"total childs:{_instance.InternalFilters.Length}", MessageType.Info);

            if (_instance.InternalFilters == null || _instance.InternalFilters.Length == 0)
                return;

            var totalVerts = _instance.InternalFilters.Select(filter => filter.mesh.vertices.Length)
                .Aggregate((total, next) => total += next);

            var messageType = MessageType.Info;
            if (totalVerts > uint.MaxValue)
                messageType = MessageType.Error;

            EditorGUILayout.HelpBox($"total verts: {totalVerts}", messageType);

            var useSameMaterial = true;

            var material = _instance.InternalFilters[0].GetComponent<MeshRenderer>().sharedMaterial;
            foreach (var meshFilter in _instance.InternalFilters)
            {
                var rend = meshFilter.GetComponent<MeshRenderer>();
                if (rend.sharedMaterial != material)
                {
                    useSameMaterial = false;
                    break;
                }
            }

            if (!useSameMaterial)
            {
                EditorGUILayout.HelpBox($"Internal meshses uses different materials, must be the same!",
                    MessageType.Error);
            }
            else
            {
                _instance.SharedMaterial = material;
            }

            EditorUtility.SetDirty(_instance);
        }
    }
}

Скачать Mesh Composer

Два готовых скрипта для использования в Unity.

Результат

В видео показан игровой процесс с устройства. В видео стоит ограничитель на максимальный FPS - 30 кадров. Количество Batches и Tris уменшилось на порядок, игра из конкретно нестабильного куска гов билда превратилась в нормальный рабочий прототип.

Смотрите также:


Комментарии

Здесь еще никто не оставил комментарий

Справка