- 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 ?