pia3333 Опубликовано 13 июня, 2014 Поделиться Опубликовано 13 июня, 2014 Привет всем, вобщем стоит задача получить список всех объектов на карте в игре на юнити.Через отладчик кривым способом смог получить адреса на нужные мне объекты(т.е. на экземпляр GameObject), получилось что-то типо такого:Тут уже прописаны адреса сразу на класс объекта, а не на поинтер.Объект игрока - статичный, остальные объекты на скрине - динамические и создаются подрят.Никакой связи между dynamic_1 и dynamic_2 и т.д. я не нашёл(это не структура, а просто динамическое выделение памяти).Нужно как-то найти для них всех поитер, где будет различаться только 1 оффсет(4 байта * номер объекта). Но как это сделать я без понятия. С каждого оффсета выдаёт ОЧЕНЬ много поинтеров.Для поиска я взял dynamic_1 и dynamic_2, т.к. знаю что они созданы подрят, т.е. должен быть общий поинтер и оффсеты, где различие будет только в одном и только на 4 байта....Без понятия как это сделать, прошу помощи Глазами весь список поинтеров не перебрать - там больше 1 000 000.Добавлено позже:Скорей всего там всё ещё хуже, просто нашёл значение поинтера, который ссылается на GameObject и вбил в поиск, сохранил все значения и начал экспериментировать:По идее (36E8FC0-036E8DC8)+036E8FC0 = указатель на 3 объект(или (036E93EC-036E8EB0)+036E93EC, у остальных дельта отрицательная). Но это не так, в последних значения стоят указатели 036E8FC0+1F8 и 036E93EC+53C, хоть какой-нибудь должен быть равен значению 11514856. Хз что делать....Скорее всего там что-то типо такого в коде движка:objectArray[id]->object->gameobjectУ меня известен только адрес gameobject Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 14 июня, 2014 Поделиться Опубликовано 14 июня, 2014 1. Наверно, не самый лучший способ искать объекты в памяти. Игровые объекты можно найти функцией static Object[] FindObjectsOfType(Type type); Эта функция возвратит массив Object[]. И с этими объектами можно делать практически все что угодно.2. Для создания читов к играм созданных на Unity3D можно забыть про Cheat Egnine. Можно написать загрузчик dll или установщик чит-патчей. Загрузчик сделать наверно самое трудное. Dll-ку написать в любой среде для .net программирования. Возможно есть еще способы, надо думать.Вот этот код нужно вызывать первым. Он создаст GameObject пустой и добавит в него чит-скриптецvar cheatGO = new GameObject();cheatGO.AddComponent.(typeof(FindObjectsInScene))Сам скриптец, который находит объекты для какой-то цели. Update функция работает каждый кадр. Это функция унаследованная от MonoBehaviourusing UnityEngine;using System.Collections;using System.Collections.Generic;public class FindObjectsInScene : MonoBehaviour {List<GameObject> listGOs = new List<GameObject>();void Awake(){ DontDestroyOnLoad(this); // чтобы скрипт не уничтожался}void Update () { if(Input.GetKeyDown(KeyCode.F1)){ // Ищем объекты по условиям listGOs.Clear(); var gos = FindObjectsOfType(typeof(GameObject)); foreach (var item in gos){ var go = item as GameObject; // if(...){ // listGOs.Add(); // } } // Делаем со списком объектов что хотим }}} Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 14 июня, 2014 Поделиться Опубликовано 14 июня, 2014 ID объекта можно найти в его структуре, но я думаю что вряд ли в играх на юнити для хранения объектов выделена связная карта.Там обычный list и всё сделано по индексации. Ссылка на комментарий Поделиться на другие сайты Поделиться
pia3333 Опубликовано 14 июня, 2014 Автор Поделиться Опубликовано 14 июня, 2014 Спасибо за ответы. Хотелось сделать просто трейнер, а тут вот как. Ох эти интерпретаторы... Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения