- Home /
Question by
DemonJAZ · Jun 27, 2019 at 10:36 PM ·
collisioncontrollerraycasting2d-physicscharacter movement
Issues with 2d Player controller(Kinematic)
Hi guys,
I am facing issues with my player controller.
When i jump upon landing my character goes inside the ground.
marked in red are my rays. https://ibb.co/6b1pcTK
even the jump is to fast in up and down.
Link to project https://github.com/DemonJAZ/WalkInForest2DGame
@highpockets Below is my script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private bool grounded = false;
public float gravitymodifier = 1f;
public float jumpspeed = 1f;
public float movementSpeed;
private Vector2 Velocity;
private Rigidbody2D Pico;
// Start is called before the first frame update
void Start()
{
Pico = gameObject.GetComponent<Rigidbody2D>();
}
private void Update()
{
Debug.DrawRay(Pico.position + new Vector2(0.3f,-0.6f), Vector2.down*0.1f,Color.red);
Debug.DrawRay(Pico.position + new Vector2(-0.3f,-0.6f), Vector2.down * 0.1f, Color.red);
Debug.DrawRay(Pico.position + new Vector2(0f, -0.7f), Vector2.down * 0.1f, Color.red);
Debug.DrawRay(Pico.position + new Vector2(0.34f, 0.6f), Vector2.right * 0.1f, Color.red);
Debug.DrawRay(Pico.position + new Vector2(0.34f, 0f), Vector2.right * 0.1f, Color.red);
Debug.DrawRay(Pico.position + new Vector2(0.34f, -0.6f), Vector2.right * 0.1f, Color.red);
if (Input.GetKeyDown(KeyCode.Space) && grounded)
{
Velocity.y = jumpspeed * Time.deltaTime;
Pico.position += Velocity;
grounded = false;
}
}
// Update is called once per frame
private void FixedUpdate()
{
if (Input.GetKey(KeyCode.A))
{
Velocity.x = -movementSpeed * Time.deltaTime;
}
else if (Input.GetKey(KeyCode.D))
{
Velocity.x = movementSpeed * Time.deltaTime;
}
else
{
Velocity.x = Vector2.zero.x;
}
if ( (Velocity.x != 0.0f) && HorizontalCollision() )
{
Velocity.x = Vector2.zero.x;
}
if (!grounded)
{
Velocity.y += gravitymodifier * Time.deltaTime;
}
if (VerticalCollisions() && !grounded)
{
Velocity.y = 0;
grounded = true;
}
Pico.position += Velocity;
}
private bool VerticalCollisions()
{
return Physics2D.Raycast(Pico.position + new Vector2(0.3f, -0.6f), Vector2.down, 0.1f) ||
Physics2D.Raycast(Pico.position + new Vector2(-0.3f, -0.6f), Vector2.down, 0.1f) ||
Physics2D.Raycast(Pico.position + new Vector2(0f, -0.7f), Vector2.down, 0.1f);
}
private bool HorizontalCollision()
{
float directionX = Mathf.Sign(Velocity.x);
bool v = (directionX == -1.0f);
Vector2 castDirection = v ? Vector2.left : Vector2.right;
return Physics2D.Raycast(Pico.position + new Vector2(directionX *.34f, -0.6f), castDirection, 0.1f) ||
Physics2D.Raycast(Pico.position + new Vector2(directionX * 0.34f, -0.6f), castDirection, 0.1f) ||
Physics2D.Raycast(Pico.position + new Vector2(directionX * 0.34f, -0.7f), castDirection, 0.1f);
}
}
Comment
Your answer
![](https://koobas.hobune.stream/wayback/20220612203905im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Obstacle avoidance 1 Answer
How to make char animation idle 0 Answers
Linecast is always blocked. 2 Answers
CharacterController is stuck [video and screenshots] 0 Answers