Лицо игрока в сторону толчка, когда raycast попадает под углом - PullRequest
0 голосов
/ 18 октября 2018

В настоящее время я работаю над системой push-сообщений и у меня возникают некоторые проблемы.Игрок использует CharacterController, который может взаимодействовать с твердотельными телами в сцене.В настоящее время это работает следующим образом: когда Raycast ударяет по предмету, который можно сдвинуть перед игроком, и нажимает кнопку, он нажимает на объект, и все работает нормально.Проблема возникает, когда игрок слегка отворачивается от толкающего предмета и начинает толкать.Т.е. когда персонаж выключен примерно на 10 градусов, но луч все равно попадает.Идея, которую я имел в виду, заключалась в том, чтобы рассчитать угол лучевой трансляции, который попадает в куб, который можно сдвинуть, и повернуть контроллер персонажа в направлении, на которое можно толкнуть этот угол.Проблема в том, что я понятия не имею, как этого добиться.Я надеюсь, что кто-то может помочь мне с этой концепцией.Если у кого-то есть какие-либо другие концепции или идеи, не стесняйтесь делиться ими:)

Редактировать: я добавил несколько скриптов

Контроллер персонажа:

if (inputDir != Vector2.zero)
    {
        float targetRotation = Mathf.Atan2(inputDir.x, inputDir.y) * Mathf.Rad2Deg + cameraT.eulerAngles.y;
        transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref turnSmoothVelocity, GetModifiedSmoothTime(turnSmoothTime));
    }

    float targetSpeed = ((running) ? runSpeed : movementSpeed) * inputDir.magnitude;
    currentSpeed = Mathf.SmoothDamp(currentSpeed, targetSpeed, ref speedSmoothVelocity, GetModifiedSmoothTime(speedSmoothTime));

    velocityY += Time.deltaTime * gravity;

    Vector3 velocity = transform.forward * currentSpeed + Vector3.up * velocityY;
    controller.Move(velocity * Time.deltaTime);

    currentSpeed = new Vector2(controller.velocity.x, controller.velocity.z).magnitude;

Настройка Raycast и pushstates отключены:

if (Physics.Raycast(middle, (forward), out hit, distanceForPush))
    {
        if (Input.GetButton("Push") && hit.collider.tag == "PushableLight")
        {
            anim.SetBool("isPushing", true);
            pushForce = playerPushForceLight;
            movementSpeed = pushSpeedLight;
            hit.transform.SendMessage("HitByPlayer", null, SendMessageOptions.DontRequireReceiver);
            if (controller.velocity == Vector3.zero)
            {
                anim.SetFloat("pushSpeedAnim", 0f);
            }
            else
            {
                anim.SetFloat("pushSpeedAnim", 1f);
            }
        }
        else if (Input.GetButton("Push") && hit.collider.tag == "PushableHeavy")
        {
            anim.SetBool("isPushing", true);
            pushForce = playerPushForceHeavy;
            movementSpeed = pushSpeedHeavy;
            hit.transform.SendMessage("HitByPlayer", null, SendMessageOptions.DontRequireReceiver);
            if (controller.velocity == Vector3.zero)
            {
                anim.SetFloat("pushSpeedAnim", 0f);
            }
            else
            {
                anim.SetFloat("pushSpeedAnim", 1f);
            }
        }
        else
        {
            anim.SetBool("isPushing", false);
            pushForce = 0f;
            movementSpeed = walkSpeed;
            hit.transform.SendMessage("HitStopped", null, SendMessageOptions.DontRequireReceiver);

        }
    }
    else
    {
        anim.SetBool("isPushing", false);

    }


    AnimatorStateInfo stateInfo = anim.GetCurrentAnimatorStateInfo(0);
    if (stateInfo.fullPathHash == pushStateHash)
    {
        turnSmoothTime = maxTurnSmoothTimePushing;
    }
    else
    {
        turnSmoothTime = 0.1f;
    }
}

1 Ответ

0 голосов
/ 18 октября 2018

Я бы попытался выровнять игрока по нормальному столкновению при ударе.

transform.rotation = Quaternion.LookRotation(-hit.normal, Vector3.up);

Это, вероятно, будет хорошо работать только для боксов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...