MasterGH Опубликовано 5 апреля, 2015 Поделиться Опубликовано 5 апреля, 2015 WalkerTrainme.rarЗадачаСделать телепорт так, чтобы дорожка, которая показывает путь располагалась правильно после нового хода. Что-то похоже есть в Героях VI.Шифрования нет. Специальных сложностей не делал. Трейми 32-х разрядный. Сделан на Unity3D из стандартных ресурсов.Внимание. Подсказка на коде C#СтрокуGetPoints(arrayPoints[arrayPoints.Length - 1].position, pointHit, minDistance, target, ref arrayPoints); //{0}заменить на GetPoints(chracter.position, pointHit, minDistance, target, ref arrayPoints);using UnityEngine;using System.Collections;using UnityStandardAssets.Characters.ThirdPerson;public class Controller : MonoBehaviour{ #region Public variables public Transform target; public Transform[] arrayPoints; public Camera mainCamera; public AICharacterControl aiCharacterControl; public NavMeshAgent navMeshAgent; public float minDistance = 1f; public Transform chracter; public Rigidbody rigidbody; public int closeCheckPoint; public bool startAnimation; #endregion #region Monobehavior void Start() { arrayPoints = new Transform[1]; arrayPoints[0] = Instantiate<Transform>(target); var pos = chracter.position; pos.y = 0; arrayPoints[0].position = pos; } void Update() { if(startAnimation) { var distanceToEndPoint = Vector3.Distance(arrayPoints[closeCheckPoint].position, chracter.position); if(distanceToEndPoint < 0.1f) { closeCheckPoint++; if(closeCheckPoint >= arrayPoints.Length) { startAnimation = false; rigidbody.isKinematic = true; navMeshAgent.Stop(); aiCharacterControl.target = null; } else { aiCharacterControl.target = arrayPoints[closeCheckPoint]; rigidbody.isKinematic = false; navMeshAgent.Resume(); } } } else { if(Input.GetMouseButtonUp(0)) { var mousePos = Input.mousePosition; var ray = mainCamera.ScreenPointToRay(mousePos); RaycastHit hitInfo; if(Physics.Raycast(ray, out hitInfo)) { var pointHit = hitInfo.point; //GetPoints(chracter.position, pointHit, minDistance, target, ref arrayPoints); GetPoints(arrayPoints[arrayPoints.Length - 1].position, pointHit, minDistance, target, ref arrayPoints); //{0} closeCheckPoint = 0; aiCharacterControl.target = arrayPoints[0]; rigidbody.isKinematic = false; navMeshAgent.Resume(); startAnimation = true; } } } } #endregion #region Private Functions void GetPoints(Vector3 p1, Vector3 p2, float minDistance, Transform trPrefab, ref Transform[] arrayPoints) { if(arrayPoints != null) DestroyObects(arrayPoints); var dz = Vector3.Distance(p1, p2)/minDistance; var countPoins = (int)dz + 1; arrayPoints = new Transform[countPoins]; var direction = p2 - p1; for (int i = 0; i < countPoins; i++) { arrayPoints[i] = Instantiate<Transform>(trPrefab); Vector3 pos = p1 + direction * i/dz; pos.y = 0f; arrayPoints[i].position = pos; } } void DestroyObects(Transform[] arrayPoints) { var max = arrayPoints.Length; for (int i = max-1; i >= 0; i--) { Destroy(arrayPoints[i].gameObject); } } #endregion}Если нужно выложу пакадж проекта. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 8 апреля, 2015 Автор Поделиться Опубликовано 8 апреля, 2015 Решение проблемы с дорожкой 1. Ищем адрес координат2. Ставим бряк и в часто обращаемую инструкцию делаем инъекцию кода для вывода поинтера pTransformComponent на структуру с координатами 3. Пишем координаты героя в таблицу по адресамПри проверке выставления значений координат и совершении хода подтверждается проблема, что персонаж идет в первую точку прошлого пути, вместо того чтобы путь начинался с позиции игрока. Перед тем как делать скрипт телепорта сделаем так, чтобы при новом ходе дорожка начиналась от персонажа с его новой позиции. Для этого выполним пункты 4 и 5. 4. Ищем адрес счетчика желтых кружков в пути и ставим бряк на доступ5. Идем в игру, совершаем ход несколько раз. Та инструкция, которая обращалась к счетчику один раз за один ход На высоком уровне счетчик назывался closeCheckPoint и находится здесь Мы должны записать в стек не arrayPoints[arrayPoints.Length - 1].position, а координаты игрока. Исследуем немного стек и пишем скрипт Теперь дорожка начинается с позиции персонажа где бы он не был. Осталось написать скрипт телепорта и + еще два новых задания, которое появились.Задание 1. Сделать телепортЗадание 2. После телепортации разрушать дорожкуЗадание 3. После телепортации не разрушать дорожку, а строить дорожку от старой позиции к новой[ENABLE]alloc(newmem,2048)label(returnhere)label(pTransformComponent)registersymbol(pTransformComponent)newmem:mov [pTransformComponent],esifstp dword ptr [esi+000001E0]jmp returnherepTransformComponent:dd 0"WalkerTrainme.exe"+3B2024:jmp newmemnopreturnhere: [DISABLE]"WalkerTrainme.exe"+3B2024:fstp dword ptr [esi+000001E0]//Alt: db D9 9E E0 01 00 00dealloc(newmem)[pTransformComponent]+1e0 + 0 = X[pTransformComponent]+1e0 + 4 = Y[pTransformComponent]+1e0 + 8 = Z04A1AB0B - E8 88C00000 - call 04A26B9804A1AB10 - 83 C4 30 - add esp,3004A1AB13 - C7 47 30 00000000 - mov [edi+30],00000000 <<04A1AB1A - 8B 47 1C - mov eax,[edi+1C]04A1AB1D - 8B 4F 14 - mov ecx,[edi+14]EAX=00000000EBX=04A0E530ECX=04682AA8EDX=04682B00ESI=09B80FD0EDI=00965A10ESP=0026F1C0EBP=0026F298EIP=04A1AB1A///... var pointHit = hitInfo.point; //GetPoints(chracter.position, pointHit, minDistance, target, ref arrayPoints); GetPoints(arrayPoints[arrayPoints.Length - 1].position, pointHit, minDistance, target, ref arrayPoints); //{0} closeCheckPoint = 0;///.../*--------------------------*/04A1AAD4 - 51 - push ecx04A1AAD5 - 50 - push eax04A1AAD6 - 83 EC 04 - sub esp,0404A1AAD9 - D9 1C 24 - fstp dword ptr [esp]04A1AADC - 83 EC 0C - sub esp,0C04A1AADF - 8B 45 80 - mov eax,[ebp-80]04A1AAE2 - 89 04 24 - mov [esp],eax04A1AAE5 - 8B 45 84 - mov eax,[ebp-7C]04A1AAE8 - 89 44 24 04 - mov [esp+04],eax04A1AAEC - 8B 45 88 - mov eax,[ebp-78]04A1AAEF - 89 44 24 08 - mov [esp+08],eax04A1AAF3 - 83 EC 0C - sub esp,0C04A1AAF6 - 8B 45 BC - mov eax,[ebp-44]04A1AAF9 - 89 04 24 - mov [esp],eax04A1AAFC - 8B 45 C0 - mov eax,[ebp-40]04A1AAFF - 89 44 24 04 - mov [esp+04],eax04A1AB03 - 8B 45 C4 - mov eax,[ebp-3C]04A1AB06 - 89 44 24 08 - mov [esp+08],eax04A1AB0A - 57 - push edi04A1AB0B - E8 88C00000 - call 04A26B98 ; GetPoints(arrayPoints[arrayPoints.Length - 1].position, pointHit, minDistance, target, ref arrayPoints)04A1AB10 - 83 C4 30 - add esp,3004A1AB13 - C7 47 30 00000000 - mov [edi+30],00000000 ; closeCheckPoint = 0/*--------------------------*/[ENABLE]alloc(newmem,2048)label(returnhere)newmem:push ecxpush eaxmov ecx, [pTransformComponent]mov eax,[ecx]mov [esp+C], eax //pTransformComponent.Xmov eax,[ecx+4]mov [esp+10],eax //pTransformComponent.Ymov eax,[ecx+8]mov [esp+14],eax //pTransformComponent.Zpop eaxpop ecxcall 04A26B98 // в стек передаются уже координаты игрока, а не координаты первого желктого GameObject в дорожкеjmp returnhere04A1AB0B:jmp newmemreturnhere: [DISABLE]04A1AB0B:call 04A26B98//Alt: db E8 88 C0 00 00dealloc(newmem) Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения