Попытка заставить игрока вращаться перпендикулярно сеткам модели.Единство - PullRequest
0 голосов
/ 06 февраля 2019

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

Примерно так: Example!

Я искал несколько методов для достижения этой цели, но пока не нашел ничего конкретного.

Редактировать: Я попробовал метод Ресуррии, и он вроде работает.

if (Physics.Raycast (transform.position, -transform.up, out hit) && hit.collider.GetComponent<WallModifier> ()) {
            transform.rotation = Quaternion.LookRotation (hit.normal, Vector3.right);
            //Physics.gravity = hit.normal * -10.0f;
        }

Мой плеер действительно вращается правильно, перпендикулярно склону / стене, но затем код моей камеры полностью ломается при попытке фактически взобраться на стену. Это показывает, как это выглядит от первого лица и Это показывает, как это выглядит при просмотре сцены .

Хотя это очень забавно, явно не желательно иметьтакой эффект.Вот код камеры:

void Update () {
    if (Input.GetKeyDown (KeyCode.Escape) || toggle && Input.GetMouseButtonDown (0)) {
        toggle = !toggle;
    }
    if (!toggle && Application.isFocused) {
        Cursor.visible = false;
        Cursor.lockState = CursorLockMode.Locked;
        var md = new Vector2 (Input.GetAxisRaw ("Mouse X"), Input.GetAxisRaw ("Mouse Y"));
        md = Vector2.Scale (md, new Vector2 (sensitivity * smoothing, sensitivity * smoothing));
        smoothV.x = Mathf.Lerp (smoothV.x, md.x, 1f / smoothing);
        smoothV.y = Mathf.Lerp (smoothV.y, md.y, 1f / smoothing);
        mouseLook += smoothV;
        mouseLook.y = Mathf.Clamp (mouseLook.y, minClamp, maxClamp);
        transform.localRotation = Quaternion.AngleAxis (-mouseLook.y, (Vector3.right + transform.right).normalized);
        character.transform.localRotation = Quaternion.AngleAxis (mouseLook.x, character.transform.up.normalized);
        if (rotateModel && antModel)
            antModel.transform.localRotation = Quaternion.AngleAxis (-mouseLook.y, (Vector3.right + transform.right).normalized) * Quaternion.Euler (0, 90, 0);
    } else {
        Cursor.visible = true;
        Cursor.lockState = CursorLockMode.None;
        Application.runInBackground = false;
    }

}

Этот код был взят этим человеком .

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Если я правильно понимаю, вы можете использовать Raycast.normal .Таким образом, вы будете осуществлять радиопередачу с позиции вашего игрока с направлением, равным локальному вектору вашего игрока Vector3.down (player.transform.up * -1.0f).

Вы можете использовать Quaternion.LookAt(surfaceNormal), чтобы выровнять вектор игроков вверх по нормалиПоверхность под игроком.Это может потребовать смещения примерно на 90 градусов для согласования двух векторов «вверх».

В зависимости от вашей цели вы также можете установить Physics.gravity на surfaceNormal * -10.0f или реализовать некоторые пользовательскиегравитационное решение, если новая поверхность будет функционировать как земля.

0 голосов
/ 06 февраля 2019

Вы можете добавить пустой GameObject с подключенным коллайдером, чем вы можете использовать OnTriggerEnter для вращения вашего игрока.Добавьте флаг и на каждом нечетном вводе поверните в одну сторону, а на каждом четном вводе поверните в противоположную сторону, как сказал Синго

Пример

0 голосов
/ 06 февраля 2019

Вы имеете в виду перпендикуляр?Другими словами, поверните вдоль оси х с -90 градусов.

transform.Rotate(new Vector3(-90, 0, 0));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...