Подергивание при прыжке с горыC#

Место общения программистов C#
Anonymous
Подергивание при прыжке с горы

Сообщение Anonymous »

Я пытаюсь управлять персонажем. У меня возникают трудности с прыжком вниз.
Так вот, если персонаж прыгает со склона, то при приземлении, как я понимаю, он пытается пройти сквозь землю, но не может этого сделать и "скатывается" на некоторое расстояние вниз. Посмотреть можно на 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

Вернуться в «C#»