- Home /
 
 
               Question by 
               Thor625 · Jun 26, 2013 at 02:53 PM · 
                javascriptmovementplayeraicharactercontroller  
              
 
              Keeping Character From Walking Through Walls
Hello everyone, I have a square character, that walks around the scene. I do not want to use character controller for a number of reasons, also I do not want to use rigidbody. To keep the character from walking through walls I have been using:
 var fwd = transform.TransformDirection (Vector3.forward);
 
 var right = transform.TransformDirection(Vector3.right);
 
 var left = transform.TransformDirection(Vector3.right * -1);
 
 var back = transform.TransformDirection(Vector3.forward * -1);
 
 var down = transform.TransformDirection(Vector3.up * -1);
 
 var up = transform.TransformDirection(Vector3.up);
 
 if (Physics.SphereCast (transform.position, gameObject.width, up, hit, 0.01)) {
 
 MoveUp = false;
 
 }else{
 
 MoveUp=true;
 
 }
 
 if (Physics.SphereCast (transform.position, 1, gameObject.width, hit, 0.01)) {
 
 MoveDown = false;
 
 IsGrounded = true;
 
 }else{
 
 MoveDown = true;
 
 IsGrounded = false;
 
 }
 
 if (Physics.SphereCast (transform.position, 1, gameObject.height, hit, 0.01)) {
 
 MoveForward=false;
 
 }else{
 
 MoveForward=true;
 
 }
 
 if (Physics.SphereCast (transform.position, 1, gameObject.height, hit, 0.01)) {
 
 MoveRight=false;
 
 }else{
 
 MoveRight=true;
 
 }
 
 if (Physics.SphereCast (transform.position, 1, gameObject.height, hit, 0.01)) {
 
 MoveLeft=false;
 
 }else{
 
 MoveLeft=true;
 
 }
 
 if (Physics.SphereCast (transform.position, 1, gameObject.height, hit, 0.01)) {
 
 MoveBack=false;
 
 }else{
 
 MoveBack=true;
 
 }
 
               Suddenly, (I am not exactly sure what) this stopped working. I also tried:
 function OnCollisionEnter(hit : Collision)
 
 {
 
  
 
     if (hit.transform.position.x > transform.position.x) {
 
     MoveRight = false;
 
     
 
     } 
 
     if(hit.transform.position.x < transform.position.x){
 
     MoveRight = false;
 
     
 
     }
 
  
 
     if (hit.transform.position.y > transform.position.y) {
 
     MoveUp = false;
 
     }
 
     if(hit.transform.position.y < transform.position.y){
 
     MoveDown = false;
 
     IsGrounded = true;
 
     }
 
  
 
     if (hit.transform.position.z > transform.position.z) {
 
     MoveForward = false;
 
     }
 
     if(hit.transform.position.z <transform.position.z){
 
     MoveBack = false;
 
     }
 
     }
 
     
 
 function OnCollisionExit(hit:Collision){
 
 if (hit.transform.position.x > transform.position.x) {
 
     MoveRight = true;
 
     
 
     } 
 
     if(hit.transform.position.x < transform.position.x){
 
     MoveRight = true;
 
     }
 
     if (hit.transform.position.y > transform.position.y) {
 
     MoveUp = true;
 
     }
 
     if(hit.transform.position.y < transform.position.y){
 
     MoveDown = true;
 
     IsGrounded = false;
 
     }
 
  
 
     if (hit.transform.position.z > transform.position.z) {
 
     MoveForward = true;
 
     }
 
     if(hit.transform.position.z <transform.position.z){
 
     MoveBack = true;
 
     }
 
 }
 
               Neither of these seem to be working. All help is apprectiated, Thanks,
Thor
               Comment
              
 
               
              Just use a character controller. Thats basically everything you got there, already done for you
 
               Best Answer 
              
 
              Answer by Thor625 · Jun 26, 2013 at 07:56 PM
I actually ended up using rigidbody with this:
 #pragma strict
 var canFly:boolean;
 var speed = 10.0;
 var gravity = 10.0;
 var maxVelocityChange = 10.0;
 var canJump:boolean;
 var jumpHeight = 2.0;
 private var grounded = false;
 var stats:PlayerStats;
 @script RequireComponent(Rigidbody, BoxCollider)
  
 function Awake ()
 {
     
     stats = GetComponent(PlayerStats);
     rigidbody.freezeRotation = true;
     rigidbody.useGravity = false;
 }
  
 function FixedUpdate ()
 {
     jumpHeight = stats.jumpHeight;
     canJump = stats.jump;
     canFly = stats.flight;
     speed = stats.speed;
     if (grounded)
     {
         // Calculate how fast we should be moving
         var targetVelocity = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
         targetVelocity = transform.TransformDirection(targetVelocity);
         targetVelocity *= speed;
  
         // Apply a force that attempts to reach our target velocity
         var velocity = rigidbody.velocity;
         var velocityChange = (targetVelocity - velocity);
         velocityChange.x = Mathf.Clamp(velocityChange.x, -maxVelocityChange, maxVelocityChange);
         velocityChange.z = Mathf.Clamp(velocityChange.z, -maxVelocityChange, maxVelocityChange);
         velocityChange.y = 0;
         rigidbody.AddForce(velocityChange, ForceMode.VelocityChange);
  
         // Jump
         if (canJump && Input.GetButton("Jump"))
         {
             rigidbody.velocity = Vector3(velocity.x, CalculateJumpVerticalSpeed(), velocity.z);
         }
     }
  
     if(canFly == false){
     rigidbody.AddForce(Vector3 (0, -gravity * rigidbody.mass, 0));
      }
     grounded = false;
 }
  
 function OnCollisionStay ()
 {
     grounded = true;    
 }
  
 function CalculateJumpVerticalSpeed ()
 {
     // From the jump height and gravity we deduce the upwards speed 
     // for the character to reach at the apex.
     return Mathf.Sqrt(2 * jumpHeight * gravity);
 }
 
              Answer by ishwara_a · Jun 18, 2017 at 04:26 PM
One query (I am new to Unity3D). What are the reasons , not to use standard character controllers ?
Your answer