Как я могу заблокировать позицию игрока, чтобы игрок не двигался, но также разрешить перемещать игрока обратно?

#c# #unity3d

Вопрос:

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

Я добавил к местности материал с нулевой фрикцией , но пока ничего не изменил в свойствах : Динамическое трение , Статическое трение, Упругость установлены на 0, а Комбинация трения установлена на Умножение, а Комбинация отскока-на среднее.

Не уверен, следует ли мне что-то изменить с помощью скрипта на этом ZeroFriction, чтобы заблокировать перемещение игрока или просто отключить/включить компоненты пользовательского элемента управления игрока от третьего лица и персонажа от третьего лица.

 private void Update()
    {
        if (closeCarte == false)
        {
            var heading = transform.position - player.transform.position;
            var dot = Vector3.Dot(heading, -transform.forward);

            if (dot > 1)
            {
                var lookat = player.transform.position - securityKeyPadInteractable.transform.position;
                lookat.y = 0;
                if (lookat.magnitude <= interactableItem.distance amp;amp; interactableItem != null)
                {
                    if (!playAnimOnce)
                    {
                        if (ikControl.handFinishedMove == true)
                        {
                            if (securityKeyPad1 != null)
                            {
                                securityKeyPad1.SetActive(true);
                            }
                            if (virtualCam != null)
                                virtualCam.enabled = true;
                            freeLookCam2.enabled = false;
                            Cursor.visible = true;
                            camerasContorl.enabled = false;

                            // Here

                            playAnimOnce = true;
                        }
                    }
                }
                else if (playAnimOnce)
                {
                    if (securityKeyPad1 != null)
                    {
                        securityKeyPad1.SetActive(false);
                    }
                    if (virtualCam != null)
                        virtualCam.enabled = false;
                    camerasContorl.enabled = true;
                    freeLookCam2.enabled = true;
                    Cursor.visible = false;

                    if (m_hasOpened == true)
                    {
                        //anim.Play("Crate_Close");
                        //StartCoroutine(dimLights.dimLightOverTime(0, 2f));
                    }
                    playAnimOnce = false;
                    if (securityKeypadSystem != null)
                        securityKeypadSystem.ResetCode();
                }
            }
            else
            {
                securityKeyPad1.SetActive(false);
                playAnimOnce = false;
            }
        }
    }
 

В этот момент после этой строки :

 camerasContorl.enabled = false;
 

Где я писал // Здесь

Я хочу заблокировать(запретить игроку двигаться), но также сделать так, чтобы, если игрок нажмет одну из клавиш перемещения, он отпустит игрока и позволит снова двигаться.

В этом месте кода отображается большая клавиатура безопасности, и игрок должен ввести какой-то код.Проблема в том, что, поскольку игрок немного двигается, даже если игрок не нажимает никаких клавиш движения, он теряет связь с клавиатурой безопасности, и мне нужно снова переместить плеер вперед, чтобы снова активировать клавиатуру безопасности.

Я хочу запретить игроку двигаться/скользить по местности, но не отключать движения.

У игрока есть следующие компоненты : Аниматор , Жесткое тело(при запуске игры x,y,z на повороте замораживания проверяется верно и блокируется) , Капсула-коллайдер , Управление пользователем от третьего лица и Персонаж от третьего лица.

Комментарии:

1. Я мог бы добавить кнопку отмены, чтобы она сняла блокировку игрока, но я хочу, чтобы игра шла более плавно. В большинстве игр в этой ситуации есть кнопка отмены или X, или если вы попытаетесь ввести код 5 раз, он автоматически освободит игрока. но я хочу, чтобы это было максимально естественно, поэтому, если есть взаимодействие, «зафиксируйте» игрока на его позиции, но позвольте игроку отойти от объекта взаимодействия. Я думаю так же, как и в жизни, когда вы пытаетесь разблокировать что-то, вам не нужно нажимать кнопку отмены, если вы устали или хотите сделать что-то еще.

Ответ №1:

Что касается анимации, возможно, посмотрите, включено ли корневое движение, которое фактически «переместит» преобразование вашего объекта.

Официальная ссылка: https://docs.unity3d.com/Manual/RootMotion.html