- Home /
Duplicate Question
Slips off block when landing
So, while back I created a game which is voxel based, and it is similar to minecraft. But like i said, the odd thing is since the beginning I slip off a block when I land to the little part of it. and I think it ruins the gameplay all together, So I want to fix that.do you guys know what the problem is? here is the code for the player movement
using UnityEngine; using System.Collections;
public class CharacterMotor : MonoBehaviour {
private CharacterCollider character;
private CharacterMotorMoving motorMoving = new CharacterMotorMoving(); private CharacterMotorJumping motorJumping = new CharacterMotorJumping();
[System.NonSerialized] public Vector3 inputMoveDirection = Vector3.zero;
[System.NonSerialized] public bool inputJump = false;
[System.NonSerialized] public bool holdingInputJump = false;
void Awake() { character = GetComponent(); }
void FixedUpdate() { Vector3 velocity = character.GetDeltaPosition() / Time.deltaTime; motorMoving.ApplyMoving(this, ref velocity); motorMoving.ApplyGravity(this, ref velocity); motorJumping.ApplyJumping(this, ref velocity);
character.Move( velocity*Time.deltaTime );
}
public bool IsGrounded() { return character.IsGrounded(); } }
class CharacterMotorMoving { // максимаьные скорости движения private const float moveSpeed = 4f;
// максимальное изменение скорости за секунду private const float maxGroundAcceleration = 20; private const float maxAirAcceleration = 1;
// гравитация public const float gravity = 17; // максимальная скорость падения private const float maxFallSpeed = 15;
public void ApplyMoving(CharacterMotor motor, ref Vector3 velocity) { Vector3 desiredVelocity = motor.inputMoveDirection moveSpeed; Vector3 delta = desiredVelocity - new Vector3(velocity.x, 0, velocity.z); float maxDelta = GetMaxAcceleration(motor.IsGrounded()) Time.deltaTime; velocity += Vector3.ClampMagnitude(delta, maxDelta); }
public void ApplyGravity(CharacterMotor motor, ref Vector3 velocity) { velocity.y -= gravity * Time.deltaTime; velocity.y = Mathf.Max(velocity.y, -maxFallSpeed); if(motor.IsGrounded()) velocity.y = Mathf.Min(velocity.y, 0); }
private static float GetMaxAcceleration(bool grounded) { if(grounded) return maxGroundAcceleration; return maxAirAcceleration; } }
class CharacterMotorJumping {
private const float baseHeight = 1.0f; private const float extraHeight = 1.4f;
private bool jumping = false; private float jumpStartTime;
public void ApplyJumping(CharacterMotor motor, ref Vector3 velocity) { if (motor.IsGrounded() && !jumping && motor.inputJump) { jumping = true; jumpStartTime = Time.time;
// Apply the jumping force to the velocity. Cancel any vertical velocity first.
velocity.y = 0;
velocity += Vector3.up * CalculateJumpVerticalSpeed(baseHeight);
return;
}
if (jumping && motor.holdingInputJump) {
// увеличиваем высоту прыжка
if (Time.time < jumpStartTime + extraHeight / CalculateJumpVerticalSpeed(baseHeight)) {
velocity += Vector3.up * CharacterMotorMoving.gravity * Time.deltaTime;
}
}
if(motor.IsGrounded() || velocity.y <= 0) {
jumping = false;
}
}
private static float CalculateJumpVerticalSpeed(float targetJumpHeight) { // From the jump height and gravity we deduce the upwards speed // for the character to reach at the apex. return Mathf.Sqrt(1 targetJumpHeight CharacterMotorMoving.gravity); } }
IF you can't figure that out then check out the game to see WHAT the problem is with the sliding off of blocks, Idk if this is allowed but.. www.deltabug.bugs3.com
http://answers.unity3d.com/questions/692729/skips-off-block-when-landing.html
Update your current post with anything new or relevant
Follow this Question
Related Questions
Rotate 2d object to facing direction 1 Answer
Skips off block when landing 0 Answers
How can I get the position of Input.touches in World Space? 1 Answer
compair data from vector3 1 Answer
C# to Jacascript 1 Answer