This is the first time I've used a character controller, in any project or prototype I've written, but I thought it might be the best option as I wanted the character to go up slopes, and I couldn't get my other controller to work correctly in that situation, sometimes "see below for the code" Anyway as you can see from the screenshot I've created a little prototype with a capsule and added a character controller script plus my own script to it. I've created a form of rails so this can stop the player "capsule" falling off the map if it needed. but what I want to do is if the player hits these rails too hard "velocity" I want the player to bounce off, in the perpendicular direction I know you cannot use a rigidbody or shouldn't and physics materials don't work with the character controller either as you don't use a rigidbody as I said. Code (CSharp): float mass = 3.0F; Vector3 impact = Vector3.zero; private void Update() { if (impact != Vector3.zero) { Character.Move(impact * Time.deltaTime); impact = Vector3.Lerp(impact, Vector3.zero, 10 * Time.deltaTime); //return; } MoveDirection = new Vector3(Input.GetAxis("Horizontal") * MoveSpeed, MoveDirection.y, Input.GetAxis("Vertical") * MoveSpeed); if (Character.isGrounded == true) if (Input.GetButtonDown("Jump") == true) { MoveDirection.y = JumpForce; } MoveDirection.y = MoveDirection.y + Physics.gravity.y * GravityScale; Character.Move(MoveDirection * Time.deltaTime); } private void OnControllerColliderHit(ControllerColliderHit hit) { if (hit != null && hit.gameObject.CompareTag("Rail") == true) { //Vector3.Cross(hit.normal, -Vector3.right) AddImpact(hit.normal, 50); //Debug.Log("Player hit by " + hit.gameObject.name); } } public void AddImpact(Vector3 dir, Single force) { impact += dir.normalized * force / mass; } It does bounce but if the player is still holding the keys down, it moves again to fast, also but a short delay so the Impact.zero would need to happen, but it does not feel like the physics Material bounce. My Slope code On my other controller test. Code (CSharp): public class PlayerComponent : MonoBehaviour { private RaycastHit mHit; public LayerMask Masks; public GameObject GroundObject; public float OffsetY = 1.27F; void Update() { Debug.DrawLine(this.transform.position, this.transform.position + -this.transform.up * 0.27F, Color.yellow, 3F); if (Physics.Raycast(this.transform.position, -this.transform.up, out mHit, 3, Masks.value) == true) { transform.up -= (transform.up - mHit.normal) * 0.1f; transform.position = new Vector3(transform.position.x, mHit.point.y + OffsetY, transform.position.z); Debug.Log("Player on ground: " + mHit.collider.gameObject.name); } } } I was manually moving this in player mode. The code I used for my own Slope test player component is here like I said this sort of worked until I got about 80% to the top of the slope where the Checkground found the bottom ground and not the one the player was under.