- Home /
Call an exorcist.
Whenever I start up my game and move the camera my character gets possessed and break dances (I can't get a clear screen shot of it but the orange lines are a drawray from my camera so you can probably see what's wrong):
Here are my Movement and MouseLook scripts:
My mouselook script:
using UnityEngine;
using System.Collections;
public class MouseLook : MonoBehaviour {
// The mouse movement, smoothing and sensitivity vectors.
Vector2 mouseLook;
Vector2 smoothV;
// The sensitivity and smoothing values.
public float sensitivity = 5.0f;
public float smoothing = 2.0f;
public float ClampDegreeCap = 70f;
// The character gameobject.
private GameObject Character;
void Start ()
{
// The character object.
Character = this.transform.parent.gameObject;
}
void Update ()
{
// The original raw movement.
var md = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));
// The movement smoothing and sensitivity.
md = Vector2.Scale(md, new Vector2(sensitivity * smoothing, sensitivity * smoothing));
smoothV.x = Mathf.Lerp(smoothV.x, md.x, 1f / smoothing);
smoothV.y = Mathf.Lerp(smoothV.y, md.y, 1f / smoothing);
mouseLook += smoothV;
// The movement cap.
mouseLook.y = Mathf.Clamp(mouseLook.y, -ClampDegreeCap, ClampDegreeCap);
// The rotation that moves the camera and the character.
transform.localRotation = Quaternion.AngleAxis(-mouseLook.y, Vector3.right);
Character.transform.localRotation = Quaternion.AngleAxis(mouseLook.x, Character.transform.up);
}
}
My movement script:
using UnityEngine;
using System.Collections;
public class CharacterMovement : MonoBehaviour {
// The speed value.
public float speed = 4.0f;
void Start ()
{
// The mouse is invisible when the game is started.
Cursor.lockState = CursorLockMode.Locked;
}
void Update ()
{
// The movement input.
float translation = Input.GetAxis("Vertical") * speed;
float straffe = Input.GetAxis ("Horizontal") * speed;
// The code that smoothes the movement.
translation *= Time.deltaTime;
straffe *= Time.deltaTime;
// The movement output.
transform.Translate(straffe, 0, translation);
// To see the mouse again after pressing a cerntain key.
if (Input.GetKeyDown("escape"))
Cursor.lockState = CursorLockMode.None;
}
}
Any help is MUCH appreaciated.
Answer by Bunny83 · Apr 22, 2017 at 09:40 AM
I suspect this line:
Character.transform.localRotation = Quaternion.AngleAxis(mouseLook.x, Character.transform.up);
It makes no sense to calculate an absolute rotation (I guess your character isn't parented to anything) and use the relative up vector of the character. If there's a slight variation this would quickly explode into what you have witnessed. Since the relative up vector depends on the rotation of the character and you set the rotation of the character based on that up vector the result is pretty random.
Use Vector3.up
Character.transform.localRotation = Quaternion.AngleAxis(mouseLook.x, Vector3.up);
ps: You should store the transform component of your Character instead of the GameObject:
private Transform Character;
void Start ()
{
Character = this.transform.parent;
// [ ... ]
Character.localRotation = Quaternion.AngleAxis(mouseLook.x, Vector3.up);