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

Получение листа поинтеров на все объекты[Unity3D]


Рекомендуемые сообщения

Привет всем, вобщем стоит задача получить список всех объектов на карте в игре на юнити.

Через отладчик кривым способом смог получить адреса на нужные мне объекты(т.е. на экземпляр GameObject), получилось что-то типо такого:

71j4YAV.png

Тут уже прописаны адреса сразу на класс объекта, а не на поинтер.

Объект игрока - статичный, остальные объекты на скрине - динамические и создаются подрят.

Никакой связи между dynamic_1 и dynamic_2 и т.д. я не нашёл(это не структура, а просто динамическое выделение памяти).

Нужно как-то найти для них всех поитер, где будет различаться только 1 оффсет(4 байта * номер объекта). Но как это сделать я без понятия. С каждого оффсета выдаёт ОЧЕНЬ много поинтеров.

Для поиска я взял dynamic_1 и dynamic_2, т.к. знаю что они созданы подрят, т.е. должен быть общий поинтер и оффсеты, где различие будет только в одном и только на 4 байта....

Без понятия как это сделать, прошу помощи :-[ Глазами весь список поинтеров не перебрать - там больше 1 000 000.

Добавлено позже:

Скорей всего там всё ещё хуже, просто нашёл значение поинтера, который ссылается на GameObject и вбил в поиск, сохранил все значения и начал экспериментировать:

TEg4fQd.png

По идее (36E8FC0-036E8DC8)+036E8FC0 = указатель на 3 объект(или (036E93EC-036E8EB0)+036E93EC, у остальных дельта отрицательная). Но это не так, в последних значения стоят указатели 036E8FC0+1F8 и 036E93EC+53C, хоть какой-нибудь должен быть равен значению 11514856. Хз что делать....

Скорее всего там что-то типо такого в коде движка:

objectArray[id]->object->gameobject

У меня известен только адрес gameobject

Ссылка на комментарий
Поделиться на другие сайты

1. Наверно, не самый лучший способ искать объекты в памяти. Игровые объекты можно найти функцией static Object[] FindObjectsOfType(Type type); Эта функция возвратит массив Object[]. И с этими объектами можно делать практически все что угодно.

2. Для создания читов к играм созданных на Unity3D можно забыть про Cheat Egnine. Можно написать загрузчик dll или установщик чит-патчей. Загрузчик сделать наверно самое трудное. Dll-ку написать в любой среде для .net программирования. Возможно есть еще способы, надо думать.

Вот этот код нужно вызывать первым. Он создаст GameObject пустой и добавит в него чит-скриптец


var cheatGO = new GameObject();
cheatGO.AddComponent.(typeof(FindObjectsInScene))

Сам скриптец, который находит объекты для какой-то цели. Update функция работает каждый кадр. Это функция унаследованная от MonoBehaviour


using 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();
// }
}
// Делаем со списком объектов что хотим
}
}
}

Ссылка на комментарий
Поделиться на другие сайты

ID объекта можно найти в его структуре, но я думаю что вряд ли в играх на юнити для хранения объектов выделена связная карта.

Там обычный list и всё сделано по индексации.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

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

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