В настоящее время я работаю над школьным игровым проектом, в котором мне нужно, чтобы игрок лазил по стенам и подбирал вещи.В настоящее время я застрял в том, чтобы выяснить, как заставить игрока вращаться перпендикулярно тому, где находятся лица модели, пока он / она движется к углу стены, как показано ниже.
Примерно так:
Я искал несколько методов для достижения этой цели, но пока не нашел ничего конкретного.
Редактировать: Я попробовал метод Ресуррии, и он вроде работает.
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;
}
}
Этот код был взят этим человеком .