SINILIAN SINILIAN

Jusper, из того с чем я уже столкнулся, так это четырех этапное заполнение бланков и анкет, на каждом этапе вагон всяких пунктов некоторые из которых вызывают сомнения в уместности таковых. Вроде сделано просто...

Jusper Jusper

Посмотрел ролик, услышал на мягком повороте звук трения колес, который напомнил мне, как в свое время я делал появления следа и звука. Очень интересно будет послушать про опыт Discord магазина, у меня все руки не доходят туда опубликоваться...

ruggaraxe ruggaraxe

Выглядит очень круто! Скорее бы обновление.

alexprey alexprey

SINILIAN, думаю еще рановато, но подготовиться стоит)

SINILIAN SINILIAN

Можно уже писать шутки о физике в юнити?

Jusper Jusper

Dreaman, правильно ли я понял, что визуал это как бы дом главного героя и типа за дверью тот самый мир по которому мы путешествуем?

Dreaman Dreaman

Mariya,

Закончила скульптинг домика главной героини!

Dreaman Dreaman

В игре "Mental State" сделан новый начальный экран с новым главным меню.
https://vk.com/mentalstate_game

Jusper Jusper

Mariya, отличный скульпт! Как раскрасишь текстурами, обязательно покажи :)

Mariya Mariya

Закончила скульптинг домика главной героини!

https://vk.com/magevisions

alexprey alexprey

Jusper, все бабки просто на контракты и ушли или сроки поджимали, сам же знаешь как это обычно бывает 😉

Jusper Jusper

alexprey, смешно. Вбухать такие бабки в контракты и не подготовить оптимизацию магаза :)
Просто, видимо EGS как и Unreal для владельцев самых топовых машин.

alexprey alexprey

Jusper, они видимо не планировали такой наплыв пользователей. Или по глупости. Бывает такое)

Jusper Jusper

Raised,

Стиму бы не помешал редизайн налоговой политики.

Raised Raised

Стиму бы не помешал редизайн налоговой политики.

alexprey alexprey

Jusper, меня обнесло мимо)

Jusper Jusper

alexprey, это ты еще мобильный клиент не видел, наверное.

alexprey alexprey

Воу! В целом редизайн стима был еще в момент появления мифической стим коробки для телевизоров, но он был весьма глючный, медленный и почти не юзабельный с десктопа.
Надеюсь новый будет поотзывчивее

Jusper Jusper

alexprey,

Ого, статистика и в правду очень интересная... Значит ли это, что стимоводы не очень охотно хотят переходить на другую цифровую площадку? И связано ли это с баджами и наигранными часами?

alexprey alexprey

EfimovMax, да, при уточнении того, что в основном эта консольщики, выводы уже становится тяжелее делать :D

EfimovMax EfimovMax

alexprey, было ещё уточнение, что большинство из этих пользователей - консольщики. Какие выводы отсюда можно сделать непонятно, но ситуация интересная.

alexprey alexprey

Интересная статистика от Эпиков: 40% пользователей Epic Store не пользуются Steam вообще. Всего в магазине зарегистрировано 85 миллионов аккаунтов меньше чем за четыре месяца работы Epic Store.

Ого, статистика и в правду очень интересная...

EfimovMax EfimovMax

Jusper, в самом блоге про это не очень ясно: там сказано, что система автоматически фиксирует необычные активности, все обзоры блокируются и только после Valve оповещает разработчиков. Возможно, последнее слово именно за разработчиками ...

Jusper Jusper

Информация из комментов: эта система активируется самими разработчиками по их желанию.

vladwireframe vladwireframe

Опубликовали новый арт

"Я уверен, что причиной этому — он. Несколько раз я его видел. Это какой-то Туман, но явно не обычный. От одного взгляда на него меня воротит, одному черту известно, что творится внутри...

...
Mariya Mariya

Jusper, Спасибо!
Персонаж - это Cirno из Touhou Project, она ледяная фея отсюда и цветовая гамма. :)

Jusper Jusper

Mariya, выглядит довольно неплохо. Большой перебор синего, отсюда вопрос - есть ли пример окружения, где моделька будет использоваться?

Jusper Jusper

yo_serjio, первый это просто бомба!

rommio_g rommio_g

Jusper, в том-то и проблема, что на видео порой не хватает времени. В любом случае, в ближайшем будущем переделаю трейлер к игре, а то старый - совсем старый) Многие спрайты, в том числе анимации, были перерисованы...

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

Гипертекст

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

Хочу заметить, что это немного не тот гипертекст, который вы привыкли видеть в html - это не открытие страниц в браузере, а именно что совершение определенных действий.

Для того чтобы работать с гипертекстом добавьте следующий класс:

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class Hypertext
{
    public string link_null = "<null>";
    public string color_normal = "black", 
                  color_link = "blue";
    public GUIStyle style = new GUIStyle("label") { richText = true, fontSize = 15, fontStyle = FontStyle.Bold };

    private readonly List<Text> phrases = new List<Text>();

    private struct Text
    {
        public Action action;
        public string text;
        public int index;
    }

    private int GetIndexForLast(string str)
        { return (phrases.Count == 0 ? 0 : phrases[phrases.Count - 1].index) + str.Length; }

    public void Add(string str, Action action = null)
        { phrases.Add(new Text { text = str, index = GetIndexForLast(str), action = action}); }

    public void AddFormat(string str, params Action[] actions)
    {
        const char lBracket = '{', 
                   rBracket = '}';
        int currAction = 0;
        var cursor = 0;
        while (true)
        {
            var rIndex = str.IndexOf(rBracket, cursor);
            if (rIndex == -1) break;
            var lIndex = str.LastIndexOf(lBracket, rIndex);
            if (lIndex == -1) break;
            
            var l1 = lIndex - cursor;
            if (l1 != 0) Add(str.Substring(cursor, l1));

            var l2 = rIndex - lIndex - 1;
            var linktext = (l2 != 0) ? str.Substring(lIndex + 1, l2) : link_null;
            if (actions != null && currAction < actions.Length)
                Add(linktext, actions[currAction++]);
            else
                Add(linktext);

            cursor = rIndex + 1;
        }
        if (cursor != str.Length)
            Add(str.Substring(cursor, str.Length - cursor));
    }

    private static string Color(string color, string content)
        { return "<color=" + color + ">" + content + "</color>"; }

    private string GetSimpleString()
        { return phrases.Aggregate("", (str, p) => str + (p.action == null || !string.IsNullOrEmpty(p.text) ? p.text : link_null)); }

    private string GetRichString()
    {
        return phrases.Aggregate("", (str, p) => str + 
            (p.action == null
                ? Color(color_normal, p.text)
                : !string.IsNullOrEmpty(p.text)
                    ? Color(color_link, p.text)
                    : Color(color_link, link_null)));

    }

    private Text GetTextFromCursor(int index)
        { return phrases.FirstOrDefault(x => index < x.index); }

    public static void DrawLayout(GUIStyle style, string str, params Action[] actions)
    {
        var h = new Hypertext {style = new GUIStyle(style) { richText = true }};
        h.AddFormat(str, actions);
        h.DoDrawLayout();
    }

    public static void DrawLayout(string str, params Action[] actions)
    {
        var h = new Hypertext();
        h.AddFormat(str, actions);
        h.DoDrawLayout();
    }

    public void DoDrawLayout()
    {
        var textRich = GetRichString();
        var textSimple = GetSimpleString();
        var rect = GUILayoutUtility.GetRect(new GUIContent(textSimple), style);
        var index = style.GetCursorStringIndex(rect, new GUIContent(textSimple), Event.current.mousePosition - new Vector2(3, 0));
        var focusText = GetTextFromCursor(index);
        
        GUI.Label(rect, textRich, style);

        if (Event.current.type == EventType.MouseDown && focusText.action != null)
        {
            focusText.action.Invoke();
            Event.current.Use();
        }
    }
}

Примеры использования

Есть несколько способов использовать гипертекст с помощью этого класса - каждый из способов может быть удобен в определенных ситуациях.

  1. Формирование гипертекста "частями"
var a = new Hypertext(); 
a.Add("Мама ");
a.Add("мыла", () => Debug.Log("click"));
a.Add(" раму");
a.DoDrawLayout();

В этом случае ключевым является метод Add, и если после текста мы вводим функтор () => { /*Наши действия*/ }, то это слово считается за ссылку.

  1. Формирование гипертекста в одной строке
var a = new Hypertext();
a.AddFormat("Мама {мыла} раму", () => Debug.Log("click"));
a.DoDrawLayout();

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

  1. Статическим методом
Hypertext.DrawLayout("Мама {мыла} {раму}", 
                     () => Debug.Log("нажато 'мыла'"), 
                     () => Debug.Log("нажато 'раму'"));

Этот метод по сути работает так же как и второй способ, но позволяет сэкономить в писанине.

Скриншот как пример работы 2 способа:

Гипертекст — Unity — DevTribe: Разработка игр

Кроме того в классе есть несколько дополнительных полей, которые позволяют немного разнообразить ссылки:
style - отвечает за стиль, используемый для рисования надписи
link_null - позволяет указать текст, который будет выводиться если ссылка не имеет названия (должна же оставаться возможность нажимать на нее, верно?)
color_normal - указывает цвет обычного текста (в виде строки)
color_link - указывает цвет ссылок (в виде строки)
Указание цвета в виде строки должно соответствовать правилам указанным вот здесь



Есть какие-то идеи как это можно использовать? Тоесть кроме как для работы в консоли применения ему я придумать не могу. Или это скорее для неигровых приложений?

RiseD_Konst, в редакторах, например. У меня за год было уже 3 таких случая, когда текст вроде слитный, но и вроде должен содержать в себе какой-то функционал. А в целом применение широкое его было как я написал в редакторе триггеров, который я пишу как аналог редактору триггеров в варкрафте, где как раз ссылки и используются.

В еve почти все в этих гиперссылках...

RiseD_Konst, в диалоговой системе. Когда в тексте подсвечиваются слова темы, кликая на которые персонаж рассказывает об этом. Как в морровинде

Нот бэд! На этом реально будет замутить систему диалогов как в морровинде, насколько я понимаю? Вот там была реально шикарная система развития диалогов.

MF, в точку) Я это ведь в предыдущем коменте и написал

alexprey, я только потом заметил, когда отредактировать уже не мог =)