x


Walking On Walls With Mouselook!

Hi! I just started using unity recently and I already figured out how to do a few simple things. My problem is as follows: I would like a script that would make the character be able to walk on walls (in other words, change gravity to the opposite of the character's normal) all while being able to use mouselook as well. I found this code, which looks and works great, except for the fact that the "a" and "d" keyes turn the character instead of making it sidestep. Any help would be appreciated! Here's the code I found earlier. Thanks in advance! :D By the way, the script is added to an empty which has rigid body and a box collider.

var moveSpeed: float = 8; // move speed
var turnSpeed: float = 90; // turning speed (degrees)
var gravity: float = 10; // character gravity
var isGrounded: boolean;
var deltaGround: float = 0.2; // character is grounded up to this distance
var jumpSpeed: float = 10; // vertical jump initial speed
var jumpRange: float = 10; // range to detect target wall

private var myNormal: Vector3; // character normal
private var turnAngle: float = 0; // current character direction
private var distGround: float; // distance from character position to ground
private var jumping = false; // flag "I'm jumping to wall"
private var vertSpeed: float = 0; // vertical jump current speed 

function Start(){

    myNormal = transform.up; // starting character normal 
    rigidbody.freezeRotation = true; // disable physics rotation
    // distance from transform.position to ground
    distGround = collider.size.y / 2 - collider.center.y;  
}

function FixedUpdate(){
    // apply constant weight force
    rigidbody.AddForce(-gravity * myNormal);
}

function Update(){

    var ray: Ray;
    var hit: RaycastHit;

    if (!jumping){ // does nothing while jumping to wall
       if (Input.GetButtonDown("Jump")){ // jump pressed:
         ray = Ray(transform.position, transform.forward);
         if (Physics.Raycast(ray, hit, jumpRange)){ // wall ahead?
          JumpToWall(hit.point, hit.normal); // yes: jump to the wall
         }
         else if (isGrounded){ // no: if grounded, jump up
          vertSpeed = jumpSpeed;
         }          
       }
       else {
         var turn = Input.GetAxis("Horizontal") * turnSpeed * Time.deltaTime;
         turnAngle = (turnAngle + turn) % 360; // update character direction 
         ray = Ray(transform.position, -myNormal); // cast ray downwards
         if (Physics.Raycast(ray, hit)){ // use it to update myNormal and isGrounded
          isGrounded = hit.distance <= distGround + deltaGround;
          myNormal = Vector3.Lerp(myNormal, hit.normal, Time.deltaTime);
         }
         else {
          isGrounded = false;
         }
         // rotate character to myNormal...
         var rot = Quaternion.FromToRotation(Vector3.up, myNormal);
         rot *= Quaternion.Euler(0,turnAngle,0); // and to current direction
         transform.rotation = rot;
         var move = Input.GetAxis("Vertical") * moveSpeed * Vector3.forward;
         move.y = vertSpeed; // include jump speed, if any
         transform.Translate(move * Time.deltaTime, Space.Self); // move the character
         vertSpeed -= gravity * Time.deltaTime; // apply gravity to jump, if any
         if (vertSpeed < 0) vertSpeed = 0; // clamp to zero
       }        
    }
}

function JumpToWall(point: Vector3, normal: Vector3){
    // jump to wall 
    jumping = true; // signal it's jumping to wall
    rigidbody.isKinematic = true; // disable physics while jumping
    var orgPos = transform.position;
    var orgRot = transform.rotation;
    var dstPos = point + normal * (distGround + 0.5); // will jump to 0.5 above wall
    var dir = dstPos - orgPos;
    var dstRot = Quaternion.FromToRotation(Vector3.up, normal);
    dstRot *= Quaternion.Euler(0, turnAngle, 0); // keep character direction
    for (var t: float = 0.0; t < 1.0; ){
       t += Time.deltaTime;
       transform.position = Vector3.Lerp(orgPos, dstPos, t);
       transform.rotation = Quaternion.Slerp(orgRot, dstRot, t);
       yield; // return here next frame
    }
    myNormal = normal; // update myNormal
    rigidbody.isKinematic = false; // enable physics
    jumping = false; // jumping to wall finished
}
more ▼

asked May 30 '12 at 09:44 PM

TheTimeLord gravatar image

TheTimeLord
0 1 1 2

can you use lookAt while walking on the wall? iam using a similar script and cant use lookat while wall walking any tips?

Feb 14 at 12:42 AM MiraiTunga

LookAt makes it so that the Y axis of whatever transform you are affecting points as close to "up" in worldspace as possible.

If I had to guess, it's probably using Quaternion.SetLookRotation() to do this. You should be able to use this function to manipulate whatever it is you want to look in a specific direction and have the Y axis point towards the character's relative "up."

for example (not real code):

transform.localRotation = Quaternion.LookRotation(directionToLookIn, transform.localRotation * Vector3.up);

You'll have to do some work to get the specifics, but that is most definitely the function you want to work with. Check it out in the Scripting Reference.

Feb 14 at 12:58 AM drizztmainsword

thanks for the hint this is what iam using now

player.transform.localRotation = Quaternion.LookRotation(objectIWantlookat.transform.localPosition- player.transform.localPosition );

its working when i look at the object on the original floor but when i try look at an object on the wall i am currently walking on my character is just shaking

Feb 14 at 01:30 AM MiraiTunga

my actual question is on this link

Feb 14 at 01:59 AM MiraiTunga

Got it to work!! used raycast and Rotate

Feb 16 at 06:29 AM MiraiTunga
(comments are locked)
10|3000 characters needed characters left

2 answers: sort voted first

Alright.

First, to disable rotation with the a and d keys, find these lines and comment them out:

var turn = Input.GetAxis("Horizontal") * turnSpeed * Time.deltaTime;
turnAngle = (turnAngle + turn) % 360; // update character direction

Now, to make it so that you strafe, find this line:

var move = Input.GetAxis("Vertical") * moveSpeed * Vector3.forward;

And under it add:

move.x = Input.GetAxix("Horizontal") * moveSpeed;

That should work. If you are strafing, but in opposite directions, add a "*-1" to the end of that line. If you are moving backwards and forwards (which shouldn't happen, but hey), change "move.x" to "move.z".

more ▼

answered Jun 02 '12 at 08:23 AM

drizztmainsword gravatar image

drizztmainsword
243 1 4 5

That's great, thanks! It works well, but there's one problem that I can't figure out. Everything works except for the horizontal mouse look. I can move my character forwards backwards, strafe and jump. It also does the gravity thing, and I can make the camera look up and down. The only thing it's not letting me do is rotating the character using the mouselook script. What could the problem be? Thanks in advance!

Jun 10 '12 at 02:57 PM TheTimeLord

Right, so when you edited the script, we disabled the the horizontal axis. To get it to map to the mouse, you should be able to grab the horizontal mouse information from Input.

Try changing those first two lines you commented out to read like this:

var turn = Input.GetAxis("Mouse X') * turnSpeed * Time.deltaTime; turnAngle = (turnAngle + turn) % 360;

That might be your ticket, though you'll probably have to tweak whatever the value of "turnSpeed" is. If turning with the mouse still feels strange, trying removing the " * Time.deltaTime" bit from that line and see if it works any better.

Jun 10 '12 at 08:11 PM drizztmainsword
(comments are locked)
10|3000 characters needed characters left

Thanks it worked great! I didn't realize it could have been something as small as one name but hey, that's code for you! :D

more ▼

answered Jun 11 '12 at 01:45 AM

TheTimeLord gravatar image

TheTimeLord
0 1 1 2

(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x162
x72
x72
x68
x19

asked: May 30 '12 at 09:44 PM

Seen: 571 times

Last Updated: Feb 16 at 06:29 AM