- Home /
Trying to make my 2D Character Controller stick to a wall.
Hey all, I'm trying to write my own 2D platformer controller. I found some code to start from that had a basic left and right movement with jumping. I added the info for double jumping, and now I am trying to make it so that the character will "stick" to a specific wall type, and slowly slide down it until you "jump off". There should be no control over the character until you jump off the wall. I'm really struggling with this.
using UnityEngine; using System.Collections;
public class PlatformerController : MonoBehaviour {
public float Gravity = 20f; public float StickyGravity = 20f; public float TerminalVelocity = 20f; public float TerminalVelocitySet = 20f; public float JumpSpeed = 6f; public float DoubleJumpSpeed = 6f; public float MoveSpeedSet = 10f; public float MoveSpeed = 10f; private float jumpCount = 0;
public Vector3 MoveVector {get; set;} public float VerticalVelocity {get; set;}
public CharacterController CharacterController;
// Use this for initialization void Awake () { CharacterController = gameObject.GetComponent("CharacterController") as CharacterController; }
// Update is called once per frame void Update () {
checkMovement(); HandleActionInput(); processMovement(); }
void checkMovement(){ //move l/r var deadZone = 0.1f; VerticalVelocity = MoveVector.y; MoveVector = Vector3.zero; if(Input.GetAxis("Horizontal") > deadZone || Input.GetAxis("Horizontal") < -deadZone){ MoveVector += new Vector3(Input.GetAxis("Horizontal"),0,0); } //jump
}
void HandleActionInput(){ if(CharacterController.isGrounded){ jumpCount = 0; } if(jumpCount < 1){ if(Input.GetButtonDown("Jump")){ jump();
} } else{ if(jumpCount == 1){ if(Input.GetButtonDown("Jump")){ jumpjump(); } } } }
void processMovement(){ //transform moveVector into world-space relative to character rotation MoveVector = transform.TransformDirection(MoveVector);
//normalize moveVector if magnitude > 1 if(MoveVector.magnitude > 1){ MoveVector = Vector3.Normalize(MoveVector); }
//multiply moveVector by moveSpeed MoveVector *= MoveSpeed;
//reapply vertical velocity to moveVector.y MoveVector = new Vector3(MoveVector.x, VerticalVelocity, MoveVector.z);
//apply gravity applyGravity();
//move character in world-space CharacterController.Move(MoveVector * Time.deltaTime);
if(RaycastHit.stickywall){ wallstick (); } }
void applyGravity(){ if(MoveVector.y > -TerminalVelocity){ MoveVector = new Vector3(MoveVector.x, (MoveVector.y - Gravity * Time.deltaTime), MoveVector.z); } if(CharacterController.isGrounded && MoveVector.y < -1){ MoveVector = new Vector3(MoveVector.x, (-1), MoveVector.z); } }
public void jump(){ if(CharacterController.isGrounded){ VerticalVelocity = JumpSpeed; jumpCount++; } } public void jumpjump(){ VerticalVelocity = DoubleJumpSpeed; jumpCount++; } void wallstick(){ TerminalVelocity = 0; MoveSpeed = 0; if(Input.GetButtonDown("Jump")){ MoveVector += new Vector3(JumpSpeed, JumpSpeed/10, 0); if(CharacterController.isGrounded){ MoveVector += new Vector3(MoveVector.x, MoveVector.y, MoveVector.z); } } } }
Can anyone help?
Your answer
