Я пытаюсь управлять персонажем. У меня возникают трудности с прыжком вниз.
Так вот, если персонаж прыгает со склона, то при приземлении, как я понимаю, он пытается пройти сквозь землю, но не может этого сделать и "скатывается" на некоторое расстояние вниз. Посмотреть можно на Youtube (смотрите на скорости воспроизведения 0,5х или 0,25х, иначе сложно заметить).
Я пробовал менять значения определения столкновений, но результат никак не изменился. Я также пробовал сбрасывать параметр скорости при столкновении с землей, но из-за того, что моя сфера расположена чуть ниже нижнего коллайдера, персонаж на мгновение завис в воздухе.
Совершенно не понимаю причину этих "толчков". Я хотел бы понять, почему это происходит и как это исправить.
Мой код:
using UnityEngine;
public class player : MonoBehaviour
{
public LayerMask playerMask;
public CapsuleCollider player_collider;
private Rigidbody rb_player;
private Vector3 movementdirection = Vector3.zero;
private float decelerationSpeed = 240;
private float speed = 350;
private PhysicMaterial zero_friction, max_friction;
private int force_jump = 5;
public bool IsGround()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
RaycastHit hit;
if ( Physics.SphereCast(transform.position, 0.5f, Vector3.down, out hit, 0.53f, ~playerMask))
{
movementdirection = (transform.right * horizontal + transform.forward * vertical) - Vector3.Dot((transform.right * horizontal + transform.forward * vertical), hit.normal) * hit.normal;
return true;
}
return false;
}
private void Start()
{
zero_friction = new PhysicMaterial("Zero_Friction");
zero_friction.dynamicFriction = 0f;
zero_friction.staticFriction = 0;
zero_friction.frictionCombine = PhysicMaterialCombine.Minimum;
zero_friction.bounceCombine = PhysicMaterialCombine.Minimum;
max_friction = new PhysicMaterial("Max_Friction");
max_friction.dynamicFriction = 1;
max_friction.staticFriction = 1;
max_friction.frictionCombine = PhysicMaterialCombine.Maximum;
max_friction.bounceCombine = PhysicMaterialCombine.Average;
rb_player = transform.GetComponent();
}
void Jump()
{
rb_player.velocity = (Vector3.right * rb_player.velocity.x) + (Vector3.forward * rb_player.velocity.z);
rb_player.AddForce(Vector3.up * (force_jump), ForceMode.Impulse);
player_collider.sharedMaterial = zero_friction;
}
private void FixedUpdate()
{
if (IsGround())
{
if (movementdirection.magnitude == 0 && rb_player.velocity.magnitude > 0.1f)
{
rb_player.AddForce(-new Vector3(rb_player.velocity.x, rb_player.velocity.y - Physics.gravity.y , rb_player.velocity.z) * (decelerationSpeed * Time.fixedDeltaTime), ForceMode.Force);
}
else
{
rb_player.velocity = (Vector3.MoveTowards(rb_player.velocity, Vector3.ClampMagnitude(((movementdirection) * ((speed) * Time.fixedDeltaTime)), speed), 2));
}
player_collider.sharedMaterial = movementdirection.magnitude > 0 ? zero_friction : max_friction;
}
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space)) Jump();
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... g-downhill