alexprey alexprey

Добавил скриншоты на главную, позже загружу дневники разработки игры, где можно будет посмотреть с чего все начиналось :)

alexprey alexprey

EfReeZe, о да, тогда было знатное время и игра казалась сделано круто :D До сих пор иногда играю на телефоне от скуки)

EfReeZe EfReeZe

Это был наш далёкий 2014...

Jusper Jusper

Запись трансляции на YouTube

Jusper Jusper

Случайно сделали битву сварщиков
https://devtribe.ru/p/slash-polygon

Jusper Jusper

Внезапно на сайте потерялся 15-й выпуск. Перевыложили.

Jusper Jusper

Я вам еще не закончил писать обратную связь по боевке, есть много вещей которые немного смутили, но они поправимы. Завтра, если перестанут дергать - чиркану. Спасибо за демку!

Jusper Jusper

ruggaraxe,

Да, в этом плане все ок. Логично, что графен на старой машине, если не упарываться, не взлетит. Но я рад, что это было не 5 фпс, как даже в некоторых АА (типа Pillars of Eternity в некоторых схватках...

Jusper Jusper

ruggaraxe,

Подкреплю ее к публикации.

ruggaraxe ruggaraxe

Jusper, вот ссылка на анкету (я затупил со ссылкой с топике, сорри)
https://docs.google.com/forms/d/e/1FAIpQLSd_Wn53lJFrnfGpWI2IX...

ruggaraxe ruggaraxe

Jusper, честно говоря, да на 800х600 даже не проверяли... :) сорри. Ориентировались на FullHD и выше. Хотя над интерфейсом конечно же надо еще хорошенько поработать.
Тултипы постараемся сделать обязательно к следующей версии...

GenElCon GenElCon

Jusper,

Наверное. В прошлом они сделали Endless Legend - посмотри и сразу станет ясно в какую сторону они работают.

Jusper Jusper

GenElCon,

Я не очень понял по трейлеру геймплей. Это что-то типа цивы? Или это RTS?

GenElCon GenElCon

Humankind от разработчиков Endless Legends (и Space, но тут важно именно Legends).
А также согревающие сердца олдов трейлеры Port Royal 4 и Knights of Honor.

Jusper Jusper

Похвалю темную атмосферу, отличную работу с освещением, тенями и шейдерами. Происходящее на экране корректно задает атмосферу до тех пор, пока не начнется сам экшон, об это напишу далее. Управление персонажем отзывчивое...

Jusper Jusper

Первое, оно же самое тяжелое - UI. Я конечно, понимаю, что 800x600 совсем уже не в моде (завтра проверю на нормальной широформатной машине). Заблюренный текст я еще прочитать могу, но вот конкретно размер его крайне мал...

...
Jusper Jusper

ruggaraxe, я поиграл на старом маке 2012 года (Macbook Pro, Intel HD 4000), рад что с учетом довольно нагруженной по свету и теням картинке игруля не лагает как последняя сволочь (лагает конечно, но очень терпимо...

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

Сериализаторы для рефлексии

При работе в Unity нам может понадобиться использовать классы-капсулы для сериализации некоторых нативных классов. Зачастую среди кандидатов на такие вот классы у нас используются классы, в которых есть откуда подтянуть эти данные. Среди таких - классы для работы с рефлексией.

namespace Serialization
{
    public abstract class SerializeContainer<T> 
        where T: class 
    {
        private T _value;
        public T value
        {
            get
            {
                if (isNull)
                    return null;
                if (_value == null && !isNull)
                    _value = Getter();
                isNull = _value == null;
                return _value;
            }
            set
            {
                _value = value;
                isNull = (value == null);
                if (!isNull)
                    Setter(value);
            }
        }

        public bool isNull = true;

        protected abstract T Getter();
        protected abstract void Setter(T value);
    }
}
using System;

namespace Serialization
{
    [Serializable]
    public class SerializeType : SerializeContainer<Type>
    {
        public SerializeType() { value = null; }
        public SerializeType(Type value) { this.value = value; }

        public string fullName;

        protected override Type Getter()
        {
            return Type.GetType(fullName);
        }

        protected override void Setter(Type value)
        {
            fullName = value.AssemblyQualifiedName ?? "";
        }
    }
}
using System;
using System.Reflection;

namespace Serialization
{
    [Serializable]
    public class SerializeFieldInfo : SerializeContainer<FieldInfo>
    {
        public SerializeFieldInfo() { value = null; }
        public SerializeFieldInfo(FieldInfo value) { this.value = value; }
        public SerializeFieldInfo(Type type, string fieldname)
        {
            this.s_parentType = new SerializeType(type);
            this.fieldname = fieldname;
        }

        public SerializeType s_parentType;
        public string fieldname;

        protected override FieldInfo Getter()
        {
            return s_parentType.value.GetField(fieldname);
        }

        protected override void Setter(FieldInfo value)
        {
            s_parentType = new SerializeType(value.DeclaringType);
            fieldname = value.Name;
        }
    }
}
using System;
using System.Linq;
using System.Reflection;

namespace Serialization
{
    [Serializable]
    public class SerializeMethod : SerializeContainer<MethodInfo>
    {
        public SerializeMethod() { value = null; }
        public SerializeMethod(MethodInfo value) { this.value = value; }

        public string[] parametersInfo;
        public SerializeType s_parentType = new SerializeType();
        public string methodName;

        public int parameterCount { get { return parametersInfo.Length; } }

        protected override MethodInfo Getter()
        {
            return s_parentType.value
                .GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance)
                .Where(x => x.Name == methodName)
                .Where(x =>
                {
                    var ps = x.GetParameters();
                    return ps.Length == parametersInfo.Length &&
                           !ps.Where((t, i) => GetParameterInfo(t) != parametersInfo[i]).Any();
                }).FirstOrDefault();
        }   

        protected override void Setter(MethodInfo value)
        {
            s_parentType = new SerializeType(value.DeclaringType);
            parametersInfo = value.GetParameters().Select(x => GetParameterInfo(x)).ToArray();
            methodName = value.Name;
        }

        private static string GetParameterInfo(ParameterInfo parameterInfo)
        {
            return parameterInfo.ToString();
        }
    }
}
using System;
using System.Linq;

namespace Serialization
{
    [Serializable]
    public class SerializeEnum : SerializeContainer<Enum>
    {
        public SerializeType type;
        public int index;
        protected override Enum Getter()
        {
            return Enum.Parse(type.value, Enum.GetNames(type.value)[index]) as Enum;
        }

        protected override void Setter(Enum value)
        {
            type = new SerializeType(value.GetType());
            index = Enum.GetValues(value.GetType()).Cast<Enum>().ToList().FindIndex(x => x.Equals(value));
        }
    }
}

MethodInfo оказался объемным, но зато так он поддерживает дженерик параметры.

Указанные сериализаторы позволяют хранить типы. Например:

myTypeStorage = new SerializeType(typeof(int));
var myType = myTypeStorage.value;

Плюсом является то, что при этом капсула адекватно сохраняется в сцене (в то время как сам по себе тип сохранить нельзя).
Так как вычисления методов происходят "ленивым кешированием" расчеты будут произведены только при первом обращении к полю value.

Где применять?
Да хоть где. Лично мне понадобилось для написания редактора сценариев, ибо там методы/типы/поля дело очень важное.

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

Справка