Here is the code for a rigidbody spherical/linear character controller. The console will assist users on what to do. To create a character controller, all you should need to do is attach a child camera to the object/character that uses the script and name it “camera”. Then attach a MouseLook script to both the camera and the main character. The axes for the MouseLook for the camera will automatically be set to MouseY and the MouseLook for the player will automatically be set to MouseX. Everything will work from there.
VObj is the world’s origin and is a GameObject. It will ONLY be useful when vSpherical is set to true or checked. vGravity is the gravity direction and is a Vector3. vTurnSpeed is the speed used when turning. vSpeed is the speed used when moving. Everything else are the keystrokes for turning, moving, tilting or straffing. Without a rigidbody, transform.Translate()s will be used and with a rigidbody, rigidbody.MovePorition()s will be used (for Physics).
#pragma strict
var vObj : GameObject;
var vGravity : Vector3;
var vTurnSpeed : float;
var vSpeed : float;
var vMoveForwardKey : String = "w";
var vMoveBackwardKey : String = "s";
var vMoveLeftKey : String = "a";
var vMoveRightKey : String = "d";
var vMoveUpKey : String = "e";
var vMoveDownKey : String = "c";
var vTurnLeftKey : String = "f";
var vTurnRightKey : String = "h";
var vTiltLeftKey : String = "v";
var vTiltRightKey : String = "n";
var vSpherical : boolean;
@HideInInspector
var xMove : float = 0;
@HideInInspector
var yMove : float = 0;
@HideInInspector
var zMove : float = 0;
function Start () {
Physics.gravity = Vector3(0,0,0);
if (!transform.Find("camera")) {
Debug.Log(name+" does not have a child camera attached to it named 'camera'. This script will treat the object as a non mouse-controlled object instead of a character controller.");
} else {
if (!transform.Find("camera").GetComponent.<MouseLook>()) {
Debug.Log(name+" has a child camera attached to it called 'camera', but the camera does not have a script attached called 'MouseLook'. This script will treat the object as a non mouse-controlled object instead of a character controller.");
} else {
transform.Find("camera").GetComponent.<MouseLook>().axes = 2;
}
}
if (!GetComponent.<MouseLook>()) {
Debug.Log(name+" does not have a MouseLook script attached to it. You may still use the character controlls to turn left and right, but it is recommended that both the object and a chld camera has a MouseLook script attached so the player can also look up and down as well.");
} else {
GetComponent.<MouseLook>().axes = 1;
}
if (!rigidbody) {
Debug.Log(name+" does not have a rigidbody attached to it. This script will use transformed movements instead of physics.");
}
}
function FixedUpdate () {
if (vSpherical) {
updateSphereControls();
} else {
updateLinearControls();
}
}
function Move(self : Transform, movement : Vector3) : void {
self.Translate(movement);
}
function Turn(self : Transform, Angle : Vector3) : void {
self.Rotate(Angle);
}
function MoveAround(self : Transform, planet : Transform, movement : Vector3) : void {
var pos : Vector3 = self.position;
var pos2 : Vector3;
var upVector : Vector3 = self.position - planet.position;
var height : float = upVector.magnitude;
if (height <= 0) {
return;
}
var circumference : float = 2.0 * Mathf.PI * height;
var unitsToDegrees : float = 360.0 / circumference;
var up : Vector3 = upVector * 1.0 / height;
var forward : Vector3 = self.forward;
var rightAxis : Vector3 = Vector3.Cross(up, forward).normalized;
var forwardAxis : Vector3 = Vector3.Cross(rightAxis, up).normalized;
var rotation : Quaternion = Quaternion.identity;
if(movement.z != 0) {
rotation *= Quaternion.AngleAxis(movement.z * unitsToDegrees, rightAxis);
}
if(movement.x != 0) {
rotation *= Quaternion.AngleAxis(-movement.x * unitsToDegrees, forwardAxis);
}
self.position = rotation * (self.position - planet.position) + planet.position + (up * movement.y);
self.rotation = (rotation * Quaternion.LookRotation(forwardAxis, self.up));
if (rigidbody) {
pos2 = self.position;
rigidbody.position = pos;
rigidbody.MovePosition(pos2);
}
}
function TurnAround(self : Transform, planet : Transform, Angle : Vector3) {
var upAxis : Vector3 = self.position - planet.position;
var height : float = upAxis.magnitude;
var up : Vector3 = upAxis * 1.0 / height;
var forward : Vector3 = self.forward;
var rightAxis : Vector3 = Vector3.Cross(up, forward).normalized;
var forwardAxis : Vector3 = Vector3.Cross(rightAxis, up).normalized;
if (self.eulerAngles.y < .5 self.eulerAngles.y >= 0) {
self.rotation = Quaternion.AngleAxis(.01, upAxis) * self.rotation;
}
if (self.eulerAngles.y > -.5 self.eulerAngles.y < 0) {
self.rotation = Quaternion.AngleAxis(-.01, upAxis) * self.rotation;
}
Angle.x *= rightAxis.x;
self.rotation = Quaternion.AngleAxis(Angle.x, rightAxis) * self.rotation;
self.rotation = Quaternion.AngleAxis(Angle.y, upAxis) * self.rotation;
self.rotation = Quaternion.AngleAxis(Angle.z, forwardAxis) * self.rotation;
}
function updateSphereControls() : void {
MoveAround(transform, vObj.transform, vGravity);
if (transform.Find("camera")) {
if (transform.Find("camera").GetComponent.<MouseLook>()) {
if (vMoveForwardKey != "") {
if (Input.GetKey(vMoveForwardKey)) {
MoveAround(transform, vObj.transform, Vector3(0,-Mathf.Sin(transform.Find("camera").transform.localEulerAngles.x * Mathf.PI / 180),vSpeed*Mathf.Cos(transform.Find("camera").transform.localEulerAngles.x * Mathf.PI / 180)));
}
}
if (vMoveBackwardKey != "") {
if (Input.GetKey(vMoveBackwardKey)) {
MoveAround(transform, vObj.transform, Vector3(0,Mathf.Sin(transform.Find("camera").transform.localEulerAngles.x * Mathf.PI / 180),-vSpeed*Mathf.Cos(transform.Find("camera").transform.localEulerAngles.x * Mathf.PI / 180)));
}
}
} else {
if (Input.GetKey(vMoveForwardKey)) {
if (vMoveForwardKey != "") {
MoveAround(transform, vObj.transform, Vector3(0,0,vSpeed));
}
}
if (Input.GetKey(vMoveBackwardKey)) {
if (vMoveBackwardKey != "") {
MoveAround(transform, vObj.transform, Vector3(0,0,-vSpeed));
}
}
}
} else {
if (Input.GetKey(vMoveForwardKey)) {
if (vMoveForwardKey != "") {
MoveAround(transform, vObj.transform, Vector3(0,0,vSpeed));
}
}
if (Input.GetKey(vMoveBackwardKey)) {
if (vMoveBackwardKey != "") {
MoveAround(transform, vObj.transform, Vector3(0,0,-vSpeed));
}
}
}
if (Input.GetKey(vMoveLeftKey)) {
if (vMoveLeftKey != "") {
MoveAround(transform, vObj.transform, Vector3(vSpeed,0,0));
}
}
if (Input.GetKey(vMoveRightKey)) {
if (vMoveRightKey != "") {
MoveAround(transform, vObj.transform, Vector3(-vSpeed,0,0));
}
}
if (Input.GetKey(vMoveUpKey)) {
if (vMoveUpKey != "") {
MoveAround(transform, vObj.transform, Vector3(0,vSpeed,0));
}
}
if (Input.GetKey(vMoveDownKey)) {
if (vMoveDownKey != "") {
MoveAround(transform, vObj.transform, Vector3(0,-vSpeed,0));
}
}
if (Input.GetKey(vTurnRightKey)) {
if (vTurnRightKey != "") {
TurnAround(transform, vObj.transform, Vector3(0,vTurnSpeed,0));
}
}
if (Input.GetKey(vTurnLeftKey)) {
if (vTurnLeftKey != "") {
TurnAround(transform, vObj.transform, Vector3(0,-vTurnSpeed,0));
}
}
if (Input.GetKey(vTiltLeftKey)) {
if (vTiltLeftKey != "") {
TurnAround(transform, vObj.transform, Vector3(0,0,vTurnSpeed));
}
}
if (Input.GetKey(vTiltRightKey)) {
if (vTiltRightKey != "") {
TurnAround(transform, vObj.transform, Vector3(0,0,-vTurnSpeed));
}
}
}
function updateLinearControls() : void {
Move(transform, vGravity);
if (transform.Find("camera")) {
if (transform.Find("camera").GetComponent.<MouseLook>()) {
if (Input.GetKey(vMoveForwardKey)) {
if (vMoveForwardKey != "") {
Move(transform, Vector3(0,-Mathf.Sin(transform.Find("camera").transform.localEulerAngles.x * Mathf.PI / 180),vSpeed*Mathf.Cos(transform.Find("camera").transform.localEulerAngles.x * Mathf.PI / 180)));
}
}
if (Input.GetKey(vMoveBackwardKey)) {
if (vMoveBackwardKey != "") {
Move(transform, Vector3(0,Mathf.Sin(transform.Find("camera").transform.localEulerAngles.x * Mathf.PI / 180),-vSpeed*Mathf.Cos(transform.Find("camera").transform.localEulerAngles.x * Mathf.PI / 180)));
}
}
} else {
if (Input.GetKey(vMoveForwardKey)) {
if (vMoveForwardKey != "") {
Move(transform, Vector3(0,0,vSpeed));
}
}
if (Input.GetKey(vMoveBackwardKey)) {
if (vMoveBackwardKey != "") {
Move(transform, Vector3(0,0,-vSpeed));
}
}
}
} else {
if (Input.GetKey(vMoveForwardKey)) {
if (vMoveForwardKey != "") {
Move(transform, Vector3(0,0,vSpeed));
}
}
if (Input.GetKey(vMoveBackwardKey)) {
if (vMoveBackwardKey != "") {
Move(transform, Vector3(0,0,-vSpeed));
}
}
}
if (Input.GetKey(vMoveLeftKey)) {
if (vMoveLeftKey != "") {
Move(transform, Vector3(-vSpeed,0,0));
}
}
if (Input.GetKey(vMoveRightKey)) {
if (vMoveRightKey != "") {
Move(transform, Vector3(vSpeed,0,0));
}
}
if (Input.GetKey(vMoveUpKey)) {
if (vMoveUpKey != "") {
Move(transform, Vector3(0,vSpeed,0));
}
}
if (Input.GetKey(vMoveDownKey)) {
if (vMoveDownKey != "") {
Move(transform, Vector3(0,-vSpeed,0));
}
}
if (Input.GetKey(vTurnRightKey)) {
if (vTurnRightKey != "") {
Turn(transform, Vector3(0,vTurnSpeed,0));
}
}
if (Input.GetKey(vTurnLeftKey)) {
if (vTurnLeftKey != "") {
Turn(transform, Vector3(0,-vTurnSpeed,0));
}
}
if (Input.GetKey(vTiltLeftKey)) {
if (vTiltLeftKey != "") {
Turn(transform, Vector3(0,0,vTurnSpeed));
}
}
if (Input.GetKey(vTiltRightKey)) {
if (vTiltRightKey != "") {
Turn(transform, Vector3(0,0,-vTurnSpeed));
}
}
}