- Home /
Modifying physics in 2D
I have a 2D platformer game and in it I have recently implemented wall jumping, and the way I have it works great. However when one jumps with the character and moves towards the wall one can hold themselves stationary against the wall. This is something that I do not want. This is due to unity's inbuilt physics and is something that I would like to modify. I was wondering what the best way to go about this would be? This was quite difficult for me to explain and if you don't understand please don't hesitate to ask questions.
EDIT: Since the code was demanded I have it here: however I don't think it is to do with my code, I think that it is to do with the physics that unity employs.
using UnityEngine;
using System.Collections.Generic;
public class Player_Movement : MonoBehaviour {
public bool facingRight = true;
public float moveForce = 365f; // Amount of force added to move the player left and right.
public float maxSpeed = 5f; // The fastest the player can travel in the x axis.
public float jumpForce = 1000f; //force added on jump
private Transform groundCheck;
private Transform [] leftWallCheck,rightWallCheck; // A position marking where to check if the player is grounded.
private bool grounded = false;
private bool jump=false;
public float speed;
public int dubJumpDivisor;
private bool dubjump=false;
private bool wallJumpEnabled,WallJumping;//prevents continuous wall jumping
private List <HillSpawner> hillMovement;
void Start(){
hillMovement = new List<HillSpawner> ();
// hillMovement=GameObject.FindGameObjectWithTag("HillSpawners").GetComponent<HillSpawner>();
GameObject[] hills=GameObject.FindGameObjectsWithTag("HillSpawners");
for(int i = 0; i<hills.Length; i++){
hillMovement.Add (hills[i].GetComponent<HillSpawner>());
}
}
void Awake () {
int aloc =0 , bloc =0;
leftWallCheck=new Transform[2];
rightWallCheck=new Transform[2];
foreach(Transform b in transform){
if(b.name=="leftWallCheck"){
leftWallCheck[aloc]=b;
aloc++;
}
if(b.name=="rightWallCheck"){
rightWallCheck[bloc]=b;
bloc++;
}
}
// Setting up references.
groundCheck = transform.Find("groundCheck");
}
// Update is called once per frame
void Update () {
// Check if grounded
bool wallJump=false;
grounded = Physics2D.Linecast(transform.position, groundCheck.position, 1 << LayerMask.NameToLayer("level"));
if(Physics2D.Linecast(transform.position, leftWallCheck[0].position, 1 << LayerMask.NameToLayer("level")) ||Physics2D.Linecast(transform.position, rightWallCheck[0].position, 1 << LayerMask.NameToLayer("level"))||Physics2D.Linecast(transform.position ,leftWallCheck[1].position, 1 << LayerMask.NameToLayer("level")) ||Physics2D.Linecast(transform.position, rightWallCheck[1].position, 1 << LayerMask.NameToLayer("level"))){
wallJump = true;
}else{
wallJumpEnabled = true;
}
if(wallJump&&wallJumpEnabled&&(Input.GetButtonDown("Jump")&&!grounded)){
wallJumpEnabled = false;
WallJumping =true;
}
if(Input.GetButtonDown("Jump")&&!dubjump){
if(!grounded){
dubjump=true;
}
jump=true;
}
movement();
}
void LateUpdate(){
if(WallJumping){
jumpUp((int)(jumpForce));
WallJumping = false;
}
if(jump)//first jump
{
if(dubjump){
// Add a vertical force to the player.
jumpUp((int)(jumpForce/dubJumpDivisor));
}else{
// Add a vertical force to the player.
jumpUp((int)(jumpForce));
}
// Make sure the player can't jump again until the jump conditions from Update are satisfied.
jump=false;
}
if(grounded){dubjump=false;}
movement();
}
void movement(){
float h = Input.GetAxis("Horizontal");
if(h * rigidbody2D.velocity.x < maxSpeed){
// ... add a force to the player.
rigidbody2D.AddForce(Vector2.right * h * moveForce);
}
// If the player's horizontal velocity is greater than the maxSpeed...
if(Mathf.Abs(rigidbody2D.velocity.x) > maxSpeed){
// ... set the player's velocity to the maxSpeed in the x axis.
rigidbody2D.velocity = new Vector2(Mathf.Sign(rigidbody2D.velocity.x) * maxSpeed, rigidbody2D.velocity.y);
// backgroundUpdate.run(1.0f);
}
// If the input is moving the player right and the player is facing left...
if(h > 0 && !facingRight)
// ... flip the player.
Flip();
// Otherwise if the input is moving the player left and the player is facing right...
else if(h < 0 && facingRight)
// ... flip the player.
Flip();
// If the player should jump...
for(int i =0; i<hillMovement.Count; i++){
hillMovement[i].move(-h);
}
speed= Input.GetAxis("Horizontal");
}
private void jumpUp(int i){
rigidbody2D.velocity=new Vector2(rigidbody2D.velocity.x,0f);//this sets y velocity to zero, should this be done
rigidbody2D.AddForce(new Vector2(0f, i));
}
void Flip(){}
}
Seeing the code you are currently using could help people help you. You could try experimenting with the physics materials, but if your script "locks" in place when touching the wall it will not help.
Since it is a 2d game I have to use the physics2D$$anonymous$$aterial right? THe problem with this is that it only give two options; bounciness and friction. If I could change friction in the vertical plane only then I might be able to do something with it?
Your answer
Follow this Question
Related Questions
2D 360 degress platformer example needed 0 Answers
Need to restrict "air control" 2D platformer. 1 Answer
Should 2.5D use 3D or 2D settings ? 3 Answers
2D Slope acceleration 1 Answer
physics materials not showing up? 1 Answer