• Как повернуть объект в сторону его движения?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    transform.right = moveSpots[randomSpot].position - transform.position;
    Ответ написан
    Комментировать
  • Как перемещать gameObject по тегу?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Я бы избавился от тега. Даже если префабы разные, но сущность одна, нужно создать абстракцию, и искать по ней

    public abstract class Player : MonoBehaviour
            {
                
            }
            
            public class PlayerA : Player
            {
                
            }
            
            public class PlayerB : Player
            {
                
            }


    Но даже такой подход плох. Лучше создать отдельный класс который будет знать и о карте и о игроке, и давать карте игрока когда тот существует, и говорить карте не отображать игрока когда его убили.
    Ответ написан
    Комментировать
  • Как переделать Task в UniTask?

    PragmaGames
    @PragmaGames Автор вопроса
    Увлекаюсь Unity.
    private async UniTask PlayAsyncUniTask()
    {
         var token = new CancellationTokenSource();
    
         Play(() =>
         {
                token.Cancel();
                token.Dispose();
         });
                
         await UniTask.WaitUntilCanceled(token.Token);
    }
    Ответ написан
    Комментировать
  • Как я могу создать несколько рэйкастов для одного объекта?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Ты можешь использовать Physics.OverlapSphere. Дальность рейкаста будет дальностью видимости персонажа в твоем случае. После из всех полученных объектов найдешь тех которые попадают в поле видимости.

    private bool IsVisibleTarget(Vector3 target)
    {
           directionToTarget = (target - myTransform.position).normalized;
           return Vector3.Angle(entityTransform.forward, directionToTarget) < _viewAngle / 2;
    }


    _viewAngle угол обзора твоего персонажа.

    Я думаю такой метод самый оптимальный.

    Если говорить про твой метод то тебе через цикл нужно пускать лучи с определенным смещением. Минус твоего метода в том что чем дальше объект и больше обзор тем больше лучей придется выпустить с меньшим смещением.
    Ответ написан
    Комментировать
  • Как правильно соединять меши?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Ты можешь посмотреть сетку в режиме Wireframe. Можешь попробовать использовать стандартные функции оптимизации меша Mesh.Optimize(). В ProBuilder это хорошо реализовано.
    Ответ написан
    Комментировать
  • Как определит сторону на которую упал 3d объект?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    private void OnCollisionEnter(Collision other)
        {
            var normal = other.GetContact(0).normal;
        
            var collisionTransform = other.transform;
        
            if (normal == collisionTransform.up)
            {
                Debug.Log("Top");
            }
            
            if (normal == -collisionTransform.up)
            {
                Debug.Log("Down");
            }
            
            if (normal == collisionTransform.right)
            {
                Debug.Log("Right");
            }
            
            if (normal == -collisionTransform.right)
            {
                Debug.Log("Left");
            }
            
            if (normal == collisionTransform.forward)
            {
                Debug.Log("forward");
            }
    
            if (normal == -collisionTransform.forward)
            {
                Debug.Log("back");
            }
        }
    Ответ написан
    Комментировать
  • Почему не стартует корутина?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Ты каждый FixedUpdate() стартуешь карутину, не делай так.
    Ответ написан
    5 комментариев
  • Почему Rigidbody вращается по замороженным осям?

    PragmaGames
    @PragmaGames Автор вопроса
    Увлекаюсь Unity.
    При присоединении коллайдера пересчитывается Rigidbody.inertiaTensor, поэтому его стоит выставить вручную, если необходим кастомный поворот.
    Ответ написан
    Комментировать
  • Как выяснить, какому из файлов выделен данный кластер, и вывести имя этого файла?

    PragmaGames
    @PragmaGames Автор вопроса
    Увлекаюсь Unity.
    #define _CRT_SECURE_NO_WARNINGS
    #define UNICODE
    
    
    #include <stdlib.h>
    #include <locale.h>  
    #include <stdio.h>
    #include <windows.h>
    #include <tchar.h>
    
    
    void ErrorMessage(LPTSTR lpszFunction)
    {
    	LPVOID lpMsgBuf;
    	LPVOID lpDisplayBuf;
    	DWORD dw = GetLastError();
    
    	FormatMessage(
    		FORMAT_MESSAGE_ALLOCATE_BUFFER |
    		FORMAT_MESSAGE_FROM_SYSTEM |
    		FORMAT_MESSAGE_IGNORE_INSERTS,
    		NULL,
    		dw,
    		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    		(LPTSTR)&lpMsgBuf,
    		0, NULL);
    
    
    	lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
    		(lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR));
    	wprintf(L"%s failed with error %d: %s",
    		lpszFunction, dw, lpMsgBuf);
    
    	LocalFree(lpMsgBuf);
    	LocalFree(lpDisplayBuf);
    }
    
    BOOL ExtractFile(TCHAR* volume, LONGLONG cluster) {
    	HANDLE hDevice = CreateFile(volume,      // drive to open
    		GENERIC_READ,                        // access to the drive
    		FILE_SHARE_READ | FILE_SHARE_WRITE,  // share mode
    		NULL,                                // default security attributes
    		OPEN_EXISTING,                       // disposition
    		FILE_FLAG_BACKUP_SEMANTICS,          // file attributes
    		NULL);
    
    	if (hDevice == INVALID_HANDLE_VALUE)
    	{
    		ErrorMessage((_TCHAR*)"CreateFile");
    		return FALSE;
    	}
    
    	LOOKUP_STREAM_FROM_CLUSTER_INPUT input = { 0 };
    	input.NumberOfClusters = 1;
    	input.Cluster[0].QuadPart = cluster;
    
    	BYTE output[5000] = {};
    	DWORD dwRes = 0;
    	LOOKUP_STREAM_FROM_CLUSTER_OUTPUT result = { 0 };
    
    	BOOL bRes = DeviceIoControl(
    		(HANDLE)hDevice,						   // handle to file, directory, or volume 
    		FSCTL_LOOKUP_STREAM_FROM_CLUSTER,          // dwIoControlCode
    		(LPVOID)&input,                            // input buffer 
    		(DWORD)sizeof(input),                      // size of input buffer 
    		(LPVOID)output,                            // output buffer 
    		(DWORD)5000,                               // size of output buffer 
    		(LPDWORD)&dwRes,                           // number of bytes returned 
    		NULL									   // OVERLAPPED structure
    	);                                     
    
    	if (bRes == FALSE) {
    		ErrorMessage((_TCHAR*)"DeviceIoControl");
    		return FALSE;
    	}
    
    	memcpy(&result, output, sizeof(LOOKUP_STREAM_FROM_CLUSTER_OUTPUT));
    
    	if (result.NumberOfMatches == 0) {
    		wprintf(L"File not found\n");
    		return FALSE;
    	}
    
    	wprintf(L"File information:\n");
    
    	BYTE* p = (BYTE*)output + result.Offset;
    	LOOKUP_STREAM_FROM_CLUSTER_ENTRY* pentry = (LOOKUP_STREAM_FROM_CLUSTER_ENTRY*)p;
    
    	wprintf(L"Flags: 0x%x ", (UINT)pentry->Flags);
    
    	if ((pentry->Flags & LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_PAGE_FILE) > 0) wprintf(L"(Pagefile)");
    	else if ((pentry->Flags & LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_FS_SYSTEM_FILE) > 0)  wprintf(L"(Internal filesystem file)");
    	else if ((pentry->Flags & LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_TXF_SYSTEM_FILE) > 0) wprintf(L"(Internal TXF file)");
    	else wprintf(L"(Normal file)");
    
    	wprintf(L"\nFile: %s\n", pentry->FileName);
    	return TRUE;
    }
    
    int main()
    {
    	setlocale(LC_ALL, "Russian");
    
    	LONGLONG inp = 0;
    	wprintf(L"Enter cluster number: \n");
    	scanf("%llu", &inp);
    
    	ExtractFile((_TCHAR*)L"\\\\.\\C:", inp);
    
    	system("PAUSE");
    	return 0;
    }
    Ответ написан
    Комментировать
  • Как заставить отработать событие OnTriggerExit?

    PragmaGames
    @PragmaGames Автор вопроса
    Увлекаюсь Unity.
    Перед отключение объекта нужно сделать Rigidbody.detectCollisions = false, при включении true.
    Ответ написан
    Комментировать
  • Передвижение игрока через анимацию?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Движение через анимацию гораздо более тяжеловесное, налагает кучу ограничений и тд. Особенно когда дело дойдет до смешивания анимаций и применении масок. Самая банальная проблема что кодом ты можешь двигать персонажа в любую точку пространства. А анимация постоянно фиксированная и что бы сдвинуть персонажа например на 1/2 от полного цикла анимации придеться просчитывать время и останавливать анимацию в нужный момент что само собой сломает само отображение анимации
    Ответ написан
    Комментировать
  • Как лучше делать массовый апдейт?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Второй способ лучше.
    Ответ написан
    Комментировать
  • О чего могут быть критические фризы?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Так как на одних устройствах все работает хорошо, а на других замечены провисания могу предположить что дело в графических API. И провисание идет из-за Device.pressent или Semaphore.WaitForSignal.

    Edit > Project Settings > Player
    Посмотри стоит ли галка на Auto Graphics API
    Если не стоит поставь
    Ответ написан
    1 комментарий
  • Как записать движения персонажа в unity2D?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Самый наивный вариант это сделать очередь из Transform и записывать каждое изменение позиции игрока в эту очередь. Потом когда нужно воспроизводить действие извлекаем элементы и передаем в вашу функцию движения. Данный вариант брошен навскидку и имеет ряд недостатков, один из них потребляемая память на хранения всех позиций. Улучшить его можно тем что мы будем сохранять ключевые позиции игрока, а промежуточные данные генерировать исходя от того откуда идем , куда идем и каким образом. Пример ключевых позиций : персонаж начал идти , потом перешел на бег, закончил бег, начало прыжка, пиковая позиция прыжка, приземление.

    Transform player;
    Queue<Transform> positions;
    
    private void Start()
    {
         player = GetComponent<Transform>();
         positions = new Queue<Transform>();
    }
    
    private void Update()
    {
        Move()
    }
    
    private void Move()
    {
         // move
        positions.Enqueue(player.transform);
    }
    Ответ написан
    4 комментария
  • Как прибавлять число к переменной int через 5 секунд?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Вы можете использовать класс Timer c#, либо использовать корутину или invoke. Советую 2 последних варианта.

    https://docs.unity3d.com/ScriptReference/MonoBehav...

    https://docs.unity3d.com/ru/2019.4/Manual/Coroutin...

    int N = 10;
    int a = 0;
    float time = 5.0f;
    
    void Start()
    {
            Invoke("increment",  time);
    }
    
    void increment()
    {
            a += N;
    }
    Ответ написан
    Комментировать
  • Как сбросить Аниматор в дефолтное состояние?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Спустя столько лет... )

    Аниматор .keepAnimatorControllerStateOnDisable = false;

    Но я думаю в вашем случае поможет как раз таки обратное

    .keepAnimatorControllerStateOnDisable = true;
    Ответ написан
    Комментировать
  • Почему после переактивации объекта, Animator стал работать некорректно?

    PragmaGames
    @PragmaGames Автор вопроса
    Увлекаюсь Unity.
    Я неожиданно нашел ответ. Решение заключается в том что бы сохранить параметры аниматора после его отключения, я не понимаю почему оно работает, но работает. Если кто-то понимает как это устроено буду рад услышать !

    private void Start()
    {
         _playerAnimator.keepAnimatorControllerStateOnDisable = true;
    }
    Ответ написан
    Комментировать
  • Мерцает спрайт персонажа когда попадает на другой спрайт?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    В компоненте SpriteRenderer увеличьте параметр Order in Layer, так что бы он был больше чем у другого спрайта.
    Ответ написан
    2 комментария