Перейти к содержанию

MasterGH

Ветераны
  • Постов

    2 999
  • Зарегистрирован

  • Победитель дней

    129

Записи блога, опубликованные MasterGH

  1. MasterGH
    Unity — среда для тренировки искусственного интеллекта. Ниже пример обучения ИИ для игры в гонки.
     
     
    В новой версии Unity много изменений, если кому интересно на официальном сайте много информации по обновлениям
  2. MasterGH
    В таблице поиска есть колонки ссылающиеся на название Lua перменных: "value" и "previousvalue"

     
    А что можно делать?
     
    Сравнивать текущее и предыдущие значения вместе или по отдельности, в том числе на разных вкладках CE

     
    Примеры:
    value == 65 value == 0x65 (или поставить галку hex) value ~= 65 (или поставить галку not) Можно и такое  сравнение сделать после поиска неизвестного используя математические функции:
    math.abs(value - previousvalue) < 10 Можно делать различные комбинации: 
    and (логическое И). or (логическое ИЛИ). not (логическое НЕ). + (сложение); - (вычитание); * (умножение); / (деление); ^ (возведение в степень); % (остаток от деления). == (равно); ~= (не равно); < (меньше); > (больше); <= (меньше или равно); >= (больше или равно).  
    Что на счет xor? Можно написать функцию xor
     
    Пишем глобальную функцию сначала:
    function BitXOR(a,b)--Bitwise xor local p,c=1,0 while a>0 and b>0 do local ra,rb=a%2,b%2 if ra~=rb then c=c+p end a,b,p=(a-ra)/2,(b-rb)/2,p*2 end if a<b then a=b end while a>0 do local ra=a%2 if ra>0 then c=c+p end a,p=(a-ra)/2,p*2 end return c end А потом применяем даже отдельные функции  как в этом примере
    "value > 0 and BitXOR(value, 100) "
     
    А может быть я хочу только 100 первых результатов
     
     
    CheckCount100() and value > 0 and BitXOR(value, 50)  

     
    Также хочу добавить те адреса, которые предположительно являются указателями
    getAddressSafe('['..value..']')~=nil
     
    Или наоборот не являются указателями
    getAddressSafe('['..value..']')==nil
     
    Еще можно попробовать добавить 50 красных и  50 синих указателей в таблицу CE, но это уже задание кому интересно.
     
    Можно в теории сравнивать адреса со значениями известных адресов и даже с известными указателями, с метками. Но поиск может затянуться, если адресов очень много.
     
    Можно попробовать указать условие, что значение адреса должно находиться в X структуре или в её вероятных указателях.
    Или попробовать оставить только одинаковые значения адресов, т.е. повторяющихся более 1 раза.
    Или попробовать искать только те адреса,  к которым применимы сразу несколько условий чтобы не кликать их постоянно:
    (изменилось) И (больше 0) И (меньше 10000)
    (не изменилось) И (больше 0) И (меньше 10000)
  3. MasterGH
    Вдохновение появилось после просмотра видео @Xipho по Ultimap
    Когда в Ultimap появляются Nx адресов с одним счетчиком, то хочется увидеть эти связи на графиках IDA.
    Появилась идея загуглить как в IDA через IDC скрипт отрисовать ветвь кода или ветви кода, на которых эти самые адреса связаны между собой, а все вложенные другие скрывать.
     
    Пока из подсказок я нашел это и это
     
    Допустим для тренировки даны два адреса из одной ветви кода (это я точно знаю, т.к. получен не из ultimap, а из tracelog)
       
    Адрес1 - Tutorial-i386.exe+2578F - 29 83 AC040000        - sub [ebx+000004AC],eax" или адрес 0x00402B77
    Адрес2 - Tutorial-i386.exe+16DBED - 89 45 FC              - mov [ebp-04],eax или адрес  0x0056DBED
     
    И вот думаю, как  скрипт ниже переделать, чтобы сначала вывести текстовый маршрут, а потом и хотя бы одну ветвь кода. Т.е. поднимаясь вверх по иерархии вызовов нужно остановиться до Адреса2.
     
     
    Пока просто вывод от стартовой функции без условий
     
    Как будет время попробую доделать...
     
    p.s. Ну ничего так idc скрипты. Много всего, но смысл тот же, что и в CE Lua у некоторых функций. Еще не разобрался как Python подключить к IDA, пока на idc скриптах.
    Будет интересно еще посмотреть эту же задачу на Hydra и Radare, ну и в CE (в новой версии появилось окно диаграмм)
     
  4. MasterGH
    Для тех кому интересно, вопрос к ним. Какие критерии можно добавить спрашивая оценку плагина?
    Например, по 5-ти бальной шкале спрашивать оценку у пользователей:
     
    Необходимость плагина в Cheat Engine Работает без ошибок                            Понятно как пользоваться Интерфейс плагина Удобство плагина Нравится Простая установка  
    Думаю, прикрутить аналитику прямо в плагины. Там будет как аналитика использования плагина, так и будет опросник выше.
    Ну и пользовательское соглашение об анонимном сборе данных для улучшения качества приложения. Чтобы можно было улучшать только те плагины, которые устанавливают и которыми пользуются.
  5. MasterGH
    Отличная книга по изучению паттернов проектирования. Ее можно читать со шпаргалкой по паттернам (иллюстрацию по паттернам можно загуглить).
    Перед этим еще загуглить SOLID + Unity .
    До кучи еще алгоритмы и структуры данных. 
    Все это  пригодится, чтобы пойти работать на программиста игр или приложений с разными типами реальности: дополненная, виртуальная и смешанная. А так же сейчас можно встретить вакансии по программированию не только Android, iOS устройств, шлемов и очков, но различных устройств и дронов.
    Об алгоритмах может быть позже напишу
  6. MasterGH
    Нет времени, пока напишу заметки.
     
    1. Можно сделать плагин с визуализацией счетчиков обращений к видимым данным в MemoryView с подключенным DBVM.
    2. По аналогии в Dessect Data Scanner сделать выбор DBVM режима.
     
    DBVM позволяет обойти ограничение в 4 аппаратных брейкопинта и в реальном времени визуализировать данные, которые обращаются к памяти на чтение, запись. Показывать счетчик обращения и даже показывать спискок инструкций при наведении курсором на байт или иные данные в MemoryView. В случае c Dessect Data Scanner может ускорить расструктуризацию, а не по 1-ому брейкпоинту снимать показания X секунд пробегаясь по структуре.
     
    Кстати, кто-нибудь шарит в алгоритмах, структурах данных и паттернах проектирования? Если шарите, поделитесь в каких задачах применяли.
     
  7. MasterGH
    Unity + ARKit 2.0 + Apple Device + iOS > 12.x  позволят сканировать через визуальную одометрию реальный мир и расставлять в нем виртуальные объекты и загружать их в точные места, куда раньше поставили. Особенность в том, что чем больше информации собрали физической камерой из разных положений и углов, тем больше шансов, что увидим объекты именно там куда их поставили. Это еще классно тем, что карту мира можно расширять, сохранять, загружать, передавать в реальном времени на разные устройства в мультиплеере. Далее ArKit похож на ArCore и Vuforia, EasyAR и т.п. сканируя изображения - маркеры, 3d-фигуры, сканирование плоскостей... И короче говоря,  могу добавить, что ARKit интересная штука. 
     
    Шлем и система виртуальной реальности + Unity. Стоит такая штука за 100К в России. Хотя цены бывают разные. На работе есть такая система и в ней очень круто. Манипуляторами как реальными руками можно делать много интересных вещей в 3д-комнате, при чем отфотканной с высоким качеством. Брать 3д-вещи в руки как реальные. Вращать, менять положение, бросать и так далее. Также было интересно на крыше в демке  "человека-паука". Это пейзаж с крыши, надевание маски, стрельба, звуки. В общем можно в шлеме путешествовать просто сидя дома. Если на Unity шаришь, можешь что хочешь сделать с этим шлемом. 3д- двери открывать,  делать механику разную, делать игры, так и что-то с пользой придумать, если конечно придумать.
     
    HaloLens - очки смешанной реальность. Стоят за 300К.  Они интересны тем можно связать обучение работы с приборами (с 30-той секунды). Сейчас тут взрослые люди обучаются, а могут так обучаться и дети, и студенты и взрослые.  Можно придумать:
    1) куда идти в аэропорте, могут показать очки (а это для смартфонов, а не для очков, таскаться с ними еще)
    1) как пользоваться плитой, стиральной машиной. телевизором... и другой техникой
    3) как приготовить еду
    4) ну и так далее... 
    Обучение программируется судя по видео
    С выставки. Самое интересное где-то с пятой минуты
     
    Все идет к тому, что у всех вместо телефонов могут быть очки, а передвигаться мы будем все на колесе, самокате или летающей машине, или индивидуальном пропеллере. Если сейчас можно видеть как все гоняют на самокатах и некоторые на колесе, то может лет через 100-300 люди могут летать на работу на пропеллерах за спиной.  Также все идет к том, что работа будет для большинства становится удаленной или роботы будут заменять людей, или люди будут управлять роботами как аватарами. Ну а путешествовать на пропеллере лучше на отдыхе чем на работу)
  8. MasterGH
    Пост для тех, кто интересуется Lua в Cheat Engine. 
     
    Можно подхватить разные моменты активации и деактивации записи в таблице CE и рассчитать размер кода между метками
     
    1. По шаблону вставляем АА код для туториала Cheat Engine
    2. Регистрируем метки-маркеры в АА коде
    3. Этими метками в Lua считаем и выводим ""endCode - startCode" размер байтов
     
    Пример, который подсчитал 15 байтов

     
     
     
    Пример скрипта
     
    Документация кому интересно
     
  9. MasterGH
    Дополненная реальность похоже на спецэффекты в кино, только на экране видим изображение получаемое с видео камеры, которой управляет пользователь. 
     
    Что интересно. Камера, которая есть у многих на телефоне и допустим некоторая программа с API(какой-нибудь дополненной реальности написанная вами) определяет, что происходит на изображении и по этим данным можно
     
    1) определить плоскости реальные в нашем мире
    2) определить положение объектов относительно друг друга в нашем мире
    3) определить уникальные маркеры и изображения
     
    Это было чтение данных, затем идет запись данных. На изображение накладывается поверх другое.
     
    Чтение данных с реального мира и запись данных поверх изображения по данным чтения это основные процессы.
     
    Что меня заинтересовало. Так это, что можно что-то делать в реальности, а камера будет писать программу. Самый простой пример. Берем маркер - бумагу с рисунком. Камера увидела и поставила на нем 3д-дом или светофор. Резко убираем маркер и дом остается в этом месте. Таким образом можно построить виртуальный город. Есть на Ютубе.
     
    Теперь можно взять вместо 3д-дома, 3д-светофоров маркеры для выстраивания алгоритма программы. Таким образом направив камеру можно что-то подхватывать из дополненной реальности, вытаскивать,  размещать таким образом программируя действия без строчки кода.
     
    Берем маркер А и рядом с ним ставим маркер S. Означает, чтобы запомнилось положение макера А в пространстве. Убираем маркер S. Далее ставим маркер R, означает запись движения. Далее перемещаем А на точку2. Убираем маркер R, что означает остановку слежеия за маркеромА. Далее ставим маркер P, который запускает движение 3д объекта связанного с маркером А.
     
    Ну и так далее. Это очень интересно в плане программирования маркерами...
     
    Видео по построению объектов в городе
     
  10. MasterGH
    Плагин ведет историю поиска, отсева, отмены. Логи выглядят следующим образом
    Для чего может применятся
    На шаге отсева посмотреть в логах, какое значение искали до этого и какой способ поиска использовали. При неудачных поисках мы просматриваем как и что мы сканировали раньше. Если вообще ничего не получается при сканировании, то логами можно обмениваться. Горячие клавиши, которые настраиваются из окна настроек CE работают и в логах.  
    Установка: скопировать GHL_log.lua в директорию "/autorun" Lua скрипт: 
    В комментариях можно написать про ошибки или про идеи улучшения плагина.
  11. MasterGH
    Пошаговая отладка в dnSpy позволяет ставить брейкпоинты на C# код во время работы игры, перемещаться по коду, просматривать значения переменных.
    Сэкономит кучу времени при поиске и отладке игрового кода,
     
    1. Страница загрузки dnSpy
    2. Скачиваем dnSpy и все архивы с mono.dll файлами
    Unity-debugging-4.x-win32.zip
    Unity-debugging-4.x-win64.zip
    Unity-debugging-win32.zip
    Unity-debugging-win64.zip
    3. Смотрим свойства exe файла игры и определяем по нему версию Unity. Например, "Версия продукта 5.5.0.3120186" или версия "файла 5.50.39994" может указывать на версию Unity 5.5.
    4. Определяем разрядность приложения через Process Explorer
    5. Т.к. версия Unity 5.5 и приложение 32 разрядное, то открываем Unity-debugging-win32.zip ищем там версию Unity и заменяем mono.dll в директории игры
    6. Запускаем игру и dnSpy x86 (игра 32 разрядная поэтому x86). Открываем файл "\...\Managed\Assembly-CSharp.dll" Запускаем отладку нажав F5 или кноgку Play
    7. Настраиваем соединение и жмем ок

    8. Ставим брейкпоинты, смотрим перемененные, перемещаемся по коду, пишем свой код и так далее
    9. После изменения кода, нужно перезаписать модуль предварительно сохранив его
     
    О других способах подключения пошаговой отладки есть на английском руководство.
    ----------------------
     
    Как работать в пошаговой отладке
     
    Работать можно почти также как и в Cheat Engine в пошаговой отладке или в среде разработки программ.
    Начать стоит с обзора названия пространств имен, названия классов, методов и полей, Названия могут подсказать логическую связь с читом, который хотим сделать.
    Стоит обратить внимание на такие названия как "IsPlayer, Player, Character, CharacterController, MainCharacter, Health, Inventory, Craft" и другие. Чтобы не искать вручную можно задействовать поиск сборкам. Поиск стандартного тега "Player" в виде в строки кода (в Unity выше версии 5.0) или свойства "IsPlayer" может помочь найти игрока или отличить от чужих.
     
    Важно представлять иерархию игровых объектов, которую мы не видим в dnSpy. Программист работая в Unity видит это окошко много лет и эту иерархию всегда представляет смотря на скрипты в dnSpy

    Скрипты наследники от MonoBehavior могут находиться на игровом объекте и могут работать как с ним так и с другими объектами. Получается такая штука, что игровой объект всегда имеет Transform компонент с полями позиций, углами и scale. Классы Transform и GameObject самые основные. Методами этих классов можно разместить объект в мире, создать или удалить его. В идеале удалив объект со сцены не должно быть никаких ошибок связанных с пустыми ссылками, потерей объекта. Также и клонировав объект, тоже не должно быть ошибок. Но не всегда так просто отспавнить игровой объект. Если это сделать методами UnityEngine, то другие классы ничего не будут знать о появлении игрового объекта. Нужно ставить брейкпоинт в функции Start или Awake в классе и трейсить по Shift+11 чтобы выйти на функцию разработчиков спавна этого GameObject. Функции Start или Awake (в классе наследника от MonoBehavior) срабатывают один раз при включении скрипта и инициализации. По ним можно выйти на строку кода, которая создает объекты в мире.
     
    Отдельно стоит сказать про количество скриптов. Практически в любой игре, которая мне попадалась в dnSpy много скриптов или очень много. Иногда и не будет понятных названий у типов (из-за обфускации). В любом случае при пошаговой отладке можно найти требующиеся участки кода для создания чита и использовать их по другой логике.
     
    Основные приемы
    В Update можно обновлять параметры только своего игрока. Например, в Character классе сделать сравнения в Update по IsPlayer свойству (если оно там есть) и у тебя за каждый кадр рендеринга будет максимум характеристик.
    В Update с классом Input можно считывать хоткеи.
    В Start и Awake можно подгружать свои ассеты с внутриигровым user interface. Код скриптов перед загрузкой ассетов должен быть внедрен через dnSpy
    Иерархию игровых объектов и инспектор, если очень нужно, то можно отрисовать в user interface. Обычно не требуется. (поищите по форуму в игрострое)
     
    В заключении
    Пока нет времени делать трейнер или таблицу на CE для включения опций в играх Unity. Для меня пока подходит способ через перезапись модуля в dnSpy вручную.
    Вместо трейнера можно сделать программу патчер, который будет проверять версию игры и перезаписывать модуль с возможностью вернуть оригинальный модуль
  12. MasterGH
    1. Открываем trainme Dark Byte.
    2. Проходим первый шаг (там нужно сделать One Hit Kill чит через прогресс бар, количество патронов тоже интересно поломать)
    3. Так вот на Step2  ищем адрес здоровья нашего космического корабля.
    Ставим брейкпоинт на доступ, стреляем.
    Видим, три адреса и вот теперь новые функции в контекстном меню как на скриншоте

     
    На "(1)-(2)" - вызываем контекстное меню выделив адрес своего корабля и добавляем его в группу1. Тоже самое делаем для красных адресов кораблей противников
    На "(2)" вызываем опцию сканирования и видим "(3)"
    На (3) выбираем скан по RAX или по другим значениям. Например, когда по RAX не нашли ничего.
     
    Дальше видим окно и галку ставим "Only find matching groups" и сканим. Видим результат 

     
    Т.е. по +70 и другим смещениям можно сделать фильтр свой - чужой.
     В общем замечательный инструмент для работы со структурами с заданием уровня сканирования по оффестам
  13. MasterGH
    Новые директивы try/except в AA доступны Cheat Engine 6.8 Beta2
     
    Задача  try/except в AA обработать исключение, не допустить crash. Чтобы игра продолжалась, а чит в лучшем случае не закрыл бы процесс.
    В теории возможно определить, что был crash и что-то сделать. Например, отправить логи в свой или иной удаленный сервис аналитики, что такой-то чит не сработал...
     
    Пример от DarkByte для  try/except с счетчиком crashes
     
     
  14. MasterGH
    1. WebSite-Watcher позволяет отслеживать изменения на веб-страницах в том числе по по регулярным выражениям. Можно отслеживать изменения на сайтах Cheat Engine и других. Форум отслеживать смысла особого нет. Проще подписаться на обновление и почтовый клиент поставить.
    2. Программы тестирования и автоматизации под разные ОС:
        Sikuli — открытая кросс-платформенная визуальная среда создания сценариев-скриптов
        AirTest IDE — почти как Sikuli и более того, китайские разработчики были вдохновлены Sikili и решили взять из него многое и использоваться  в QA тестировании. 
    3. Автоматический скрывать значков на рабочем столе AutoHideDesctopIcons
    4. LightShot - быстро делаем скриншоты и заметки к ним. Можно еще использовать SnagIt, он еще и видео может снимать
    5. f.lux — софтина регулирующее цветовую температуру компьютерного монитора
    6. VerseQ — лучший на мой взгляд клавиатурный тренажер. Есть плагины тренировки на языки программирования
    7. Scanner — показывает график в виде секторов о данных на жестком диске
    8. ProcessExplorer, ProcessMonitor, WinScanner, API Monitor... все по системе
    9. Возможно понравится XYplorer как замена или дополнение к файловому браузеру
    10. NotePad ++ и sublime_text - на мой взгляд хорошие редакторы текста, может быть даже одни из лучших
     
    Как-то раз нужно было поставить пробелы между китайскими иероглифами в гугл таблице (все для игры на Unity), чтобы в игре разрядить текст и он не был мелким. На notepad++ это выгладило так

  15. MasterGH
    pcall() функция может вызывать функцию, которая может вызывать исключение.
    Возвращает статус в виде булевой о том, есть ли исключение или нет и возвращает текст исключения. 
     
    Источник
     
    Как этим пользоваться? Если вдруг знаем, что может произойти ошибка, то можно её обработать и выполнить правильное действие не останавливая работу Lua скрипта.
    Или например если  не выполняется условие, то можем сами создать ошибку с помощью функции error, что остановит скрипт.
  16. MasterGH
    UserData в Lua это пользовательский тип.  Точно не знаю, но я думаю  в документации в CE Lua (celua.txt или здесь на офф. сайте) тип userData у всех классов или большинства классов. Например,  проверим, что главная форма CE это userData тип
    local mainFormCE = getMainForm() print(type(mainFormCE)) > userdata (вывод из консоли) Выводим список свойств следующим образом через getmetatable функцию. Метатаблица — это  особая  таблица свойств Lua-переменной (подробнее здесь)
    local mainForm = getMainForm() local listUserData = createStringlist() for k,_ in pairs(getmetatable(mainForm)) do listUserData.add(k) end local allowCustomInput = false local id, name = showSelectionList("Title", "Caption", listUserData, allowCustomInput) print ('Index: '..id..", Name: "..name) listUserData.destroy()  
    Результат в виде списка свойство переменной mainForm
     
    Чтобы наглядно было. Свойства эти похожи на свойства из Дельфи. Можно загуглить, они поддробно описываются.
    Берем например свойство цвет. Прочитаем оригинальное и запишем свое любое
     
    local mainFormCE = getMainForm() print(mainFormCE.getColor()) > 536870912 -- в hex-е это 0x20000000. Можно перевести в калькуляторе или через print(string.format("%08X", 536870912)) Случайное свое впишем ради наглядного примера
    mainFormCE.setColor(546484)
     
     
  17. MasterGH
    Довольно интересная функция, мне понравилась. 
    showSelectionList() позволяет просмотреть список класса Strings и выбрать свойство через список.
     
    Как пример посмотрим список свойств главной формы и выберем любое свойство
    local mainForm = getMainForm() local listProperties = getPropertyList(mainForm) local allowCustomInput = false local id, name = showSelectionList("Title", "Caption", listProperties, allowCustomInput) print ('Index: '..id..", Name: "..name) --> Примеры выполнения: --> Index: 55, Name: ShowHint --> Index: 10, Name: Top После исполнения Lua скрипта вот такой диалог появится. Можно искать свойство через ввод текста

     
     
    Список строк (Stringlist Class) используют:
    createStringlist(): Strings  - постой список
    getAutoAttachList(): Strings  - список имен процессов для автоподключения
    getPropertyList(class) : Strings - список свойств
    getCommonModuleList(): Strings  - список пропускаемых при сканировании модулей
    getProcesslist(Strings) - список процессов
    getWindowlist(Strings) - список окон
    getThreadlist(Strings) - список потоков
    Database.Params: Strings  - свойство  базы данных SQL
    ListItem.SubItems: Strings - свойство подстрок в визуальном компоненте списка
    ComboBox.Items: Strings - комбобокс
    Memo.Lines: Strings  - мемо компонент
    RadioGroup.Items: Strings  - компонент RadioGroup
    ListBox.Items: Strings - компонент ListBox
    FileDialog.Files: Strings  -  выбранные файлы в диалоге
  18. MasterGH
    В оригинале, если нет всех компонентов рецепта, то нельзя скрафтить вещь.

    Цель: скрафтить без компонетов по нажатию кнопки
     
    Игра на Unity и можно пробовать использовать в dnSpy модифицировать файл Assembly-CSharp.dll
    Открываем файлик и смотрим на классы связанные с крафтом
     
    Так находим кнопку, которая создаст указанное количество вещей крафта в CreateItem
       
    Задача скрафтить по имеющемуся рецепту любую вещь. Для этого я добавляю проверку количества вещей  и удаляю лишний код. Под сполерами оригинальный и модифицированный код
     
    Визуальное сравнение
     
    Модифицированный код
     
    Оригинальный
     
    Изменяем весь класс или метов в этом окне
     
    Если выводит ошибки при компяляции, то скачиваем IlSpy и его код вставляем в код в dnSpy. Или качаем DnSpy 3.2.0 или ранее
     
    Изменения сохраняем в модуль, запускаем игру и крафтим.
     
    Получить все рецепты (не проверял правда, попробуйте если хотите)
     
    Вещи не ломаются. Убрать отнятие "здоровья" у вещи
     
     
  19. MasterGH
    Была задача получить два списка из документа, в котором было с пару десятков тысяч строк. На практике выяснилось, что искать текст после ключевого слова легче чем искать текст до ключевого слова. Об этом и будет дальше
     
    В утилите, которую я делал "Lua Regular Expressions (v. 1.0)"

     
    Текст во вкладке "gmatch"
     
    Game1
    gameCompany
    DAU
    53.21k
    -20%
    Game2
    gameCompany
    DAU
    20.35k
    -20%
     
    Поиск элемента после строки
     
    "DAU "DAU%c%c(.-)%c%c""
     > 53.21k;20.35k;
     
    Поиск элемента до строки
    Вот такой паттерн со двигом скобок для поиска прыдыдущеей фразы
     
    "%c%c(.-)gameCompany%c%c"
     
    не прокатит для вывода списка игр над фразой gameCompany
      
     > ;53.21k
     > -20%
     > 
     > Game2
     > ;
     
    Очевидно, можно сделать поиск по похожим фрагментам, которые идут последовательно сверху вниз. 
     
    Для просты сначала добавим первую пустую строку и видим повторяющиеся фрагменты
     
    %c%cGame1%c%cgameCompany%c%c
     
    пишем шаблон ".*%c%c(.-)%c%cgameCompany%c%c" и опять мимо
     
     > Game1;53.21k
     > -20%
     > 
     > Game2;
     
    Потому что текст над Game2 пошел выше Game2. Тогда делаем захват, только первой фразы и дальше не идем
     
    "%c%c(%w-)%c%cgameCompany%c%c"
     > Game1;Game2;
     
    И тогда все ок.
     
    Но это еще не все. Осталась первая пустая строка, которую добавили, если её удалить, тогда
     
    "%c%c(%w-)%c%cgameCompany%c%c"
     > Game2;
     
     Не видит Game1.
     
     Значит мы можем  убрать %c%c,
     
     "(%w-)%c%cgameCompany
     > Game1;Game2;
     
    Дальше название игры может быть таким "My Game: my Game". Здесь и пробел и двоеточие. В таком случае текст уже будет
     
    My Game1: my Game
    gameCompany
    DAU
    53.21k
    -20%
    My Game2: my Game
    gameCompany
    DAU
    20.35k
    -20%
     
    Пробуем
    (%w-)%c%cgameCompany
    > Game;Game;
     
    Что не верно, т.к. захват одним (%w-)
     
    Мы должны в скобках развернуть фразу имени игры. В ней могут быть пробелы, числа, текст и двоеточие
     
    ([%w%s]-)%c%cgameCompany
    >  my Game; my Game;
     
    Затем

    ([:%w%s]-)%c%cgameCompany

    > My Game1: my Game;

    > My Game2: my Game;
     
    Затем
    %c?%c?([:%w%s]-)%c%cgameCompany

    > My Game1: my Game;
    > My Game2: my Game;
     
    Вот и все. Если  попариться один раз, то тексты уже парсить будет гораздо быстрее.
     
    Так я вывел столбы DAU и названий игр в таблицу, что было в районе 500 строк из пару десятков тысяч строк
     
    p.s. Текст в консоли Lua отличается %c%c, а %с
    p.s.p.s. Можно разсплитить текст по "/n/r" или "/n" в таблицу строк и по индексам данных находить предыдущую или последующую фразу. Но мне проще две строки ввести "%c?%c?([:%w%s]-)%c%cgameCompany" и "DAU%c%c(.-)%c%c"
  20. MasterGH
    В версии Unity 2018 довольно много интересного.
     
    1. Это Unity Hub. Та штука, которая позволяет быть в курсе новых версий Unity. 
    2. PackageManager. Покажет пакаджи установленный в проекте.
    3. Pro Builder. Довольно интересный инструмент, который позволяет моделить оркужение в Unity и творить простые локации, здания и создавать примитивы с наложением текстур... там очень много чего, я не не смотрел особо. Это альтернатива террейну. Фишка в том, что мы не являясь художниками (2д, 3д артистами), на Pro Buildere можем вполне сносное сделать окружение в нереалистичном стиле.  И не очень мультяшный и не похожий на реалистичный стиль. В таком стиле в теории можно сделать быстро игру. Встроить туда рекламы и инаппов, ну и если все будет ок, то будет приносить прибыль на маркетах. Важнее продвинуть аппу вверх, на вид, чем сделать её;
    4. У Unity развиваются мощные системы сервисов. Есть поддержка иннпов, рекламы, аналитики, багрепорты (альфа версия), стеки крашей и исключений с характеристиками устройств пользователей. Не все баги там можно увидеть. Google Play консоль ловит больше багов, крашей и ANR (диалоги с "подождите ваша программа что-то долго делает или не отвечает, или будет закрыта").
    5. Запомнился 2d аниматор с ригом. Т.е. риг это склет обычно на 3д модель, а теперь риг можно делать на 2д модели.
    6. Пока больше не помню, что такого интересно... 
     
    В 2017 версии появилась возможность скрипты связывать с отдельными dll сборками. В теории это позволит увеличить скорость компиляции. Например, у нас в проекте на младших версиях Unity на правку уходит 8 секунд компиляции на мощном компе,т.к. все скрипты в одной сборке dll. Пока не тестили эту фичу...
  21. MasterGH
    Почти месяц ковыряюсь со сборкой апк, которая не запускается на инструментальном тестировании в Firebase
     

    Рис.1 Сборка апк на инструментальное тестирование TestLab  от Firebase. Окно AirTest IDE
     
    Две апк-шки создается.
    1. В Unity, с иvпортом Poco SDK 
    2. В Плагине как на рисунке
     
    Затем обе апк-шки отправляются на инструметальное тестирование в Firebase 

    Запускаю тест. Шесть секунд видео со стандартной заставкой и конец теста.
     
    На данный момент тестирование проводим через GameLoop тест, а не через инструментальный тест от AirTest IDE. Продолжаю искать решение, пока не понятно.
    Также в AirTest IDE еще не закончили свою документацию и в Firebase ничего не сказано про этот инструмент. Однако, известно что этот замечательный инструмент тестирования будет участвовать в FireBase TestLab. В 2018 году китайские разработчики официально договорились с гуглом об участии их продукта в тестировании на удаленных устройствах сервиса TestLab
  22. MasterGH
    Долго не могу решить проблему
    Traceback (most recent call last): File "C:\air test\plugins\firebase\build.py", line 124, in run self.SIGNAL_INSERT_LOGVIEW.emit(_str.decode("GB2312").encode("utf-8")) UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 11-12: illegal multibyte sequence QObject::~QObject: Timers cannot be stopped from another thread Если кто шарит на питоне просьба помочь. Питон 2.7
     
    Основная строка
    self.SIGNAL_INSERT_LOGVIEW.emit(_str.decode("GB2312").encode("utf-8")) При билде апк в firebase через плагин в AirTest (QA-тестирование на Unity)
     
    Среда разработки от уважаемых китайских разработчиков Я думаю в связи с этим ошибки с кодировкой GB2312. Гуглил, искал... пока безтолку
     
     
    Исходники
    Билд
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.