Unity3D – Character Controller – Move – Basic – JS
Character Controller is a special Unity3D component for characters. You can use this to control first person or third person characters.
Rotate around Y, move forward/backward
We are going to create a script to:
– Rotate around y axis -> using right/left arrow
– Move forward/backward -> using up/down arrow
Let’s go on!
Create a scene with:
– Main Camera
– (parent)Empty Object
– (child) Character Geometry, your .fbx
– (child) Props of the Character, your .fbx
– PlayerController.js
PlayerController.js:
#pragma strict // Attach this script to the player // Rotate around y axis - using right/left arrow // Move forward - using up/down arrow // It request CharacterController component @script RequireComponent(CharacterController) var speed : float = 3.0; // move speed var rotateSpeed : float = 3.0; // rotate speed function Update () { // Get the component var controller : CharacterController = GetComponent(CharacterController); // Rotate around y axis - using right/left arrow START ----------- transform.Rotate(0, Input.GetAxis ("Horizontal") * rotateSpeed, 0); // Rotate around y axis - using right/left arrow END ------------- // Move forward / backward START --------------------------------- var forward : Vector3 = transform.TransformDirection(Vector3.forward); var curSpeed : float = speed * Input.GetAxis ("Vertical"); // .SimpleMove forward - using up/down arrow controller.SimpleMove(forward * curSpeed); // Move forward / backward END ----------------------------------- }// END Update()
Move forward/sideways, jump
Change the script to:
– Move the character controller forward and sideways based on the arrow keys.
– Jump when pressing space.
#pragma strict /// Attach this script to your player /// This script moves the character controller forward /// and sideways based on the arrow keys. /// It also jumps when pressing space. /// Make sure to attach a character controller to the same game object. /// It is recommended that you make only one call to Move or SimpleMove per frame. // It request CharacterController component @script RequireComponent(CharacterController) var speed : float = 6.0; // the speed of the character var jumpSpeed : float = 8.0; // the jump speed var gravity : float = 20.0; // the gravity private var moveDirection : Vector3 = Vector3.zero; // shorthand for writing Vector3(0, 0, 0). function Update() { // Get the component CharacterController var controller : CharacterController = GetComponent(CharacterController); // if touching the ground during the last move if (controller.isGrounded) { // We are grounded, so recalculate // move direction directly from axes START ----------------------- moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed; // move direction directly from axes END ------------------------- // jump START ---------------------------------------------------- if (Input.GetButton ("Jump")) { moveDirection.y = jumpSpeed; } // jump END ------------------------------------------------------ }// END if .isGrounded // Apply gravity moveDirection.y -= gravity * Time.deltaTime; // Move the controller controller.Move(moveDirection * Time.deltaTime); }// END Update()
Move as 2.5D Platform – single jump
Change the script to:
– Move the character controller sideways XY plane, based on the left/right arrow keys.
– Jump when pressing space.
#pragma strict /// 2.5D platform Character Controller - single jump /// Attach this script to your player /// This script moves the character controller /// sideways based on the left/right arrow keys. /// It also jumps when pressing space. /// Make sure to attach a character controller to the same game object. /// It is recommended that you make only one call to Move or SimpleMove per frame. // It request CharacterController component @script RequireComponent(CharacterController) var speed : float = 6.0; // the speed of the character var jumpSpeed : float = 8.0; // the jump speed var gravity : float = 20.0; // the gravity private var moveDirection : Vector3 = Vector3.zero; // shorthand for writing Vector3(0, 0, 0). function Update() { // Get the component CharacterController var controller : CharacterController = GetComponent(CharacterController); // if touching the ground during the last move if (controller.isGrounded) { // We are grounded, so recalculate // move direction directly from axes START ----------------------- moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, 0); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed; // move direction directly from axes END ------------------------- // jump START ---------------------------------------------------- if (Input.GetButton ("Jump")) { moveDirection.y = jumpSpeed; } // jump END ------------------------------------------------------ }// END if .isGrounded // Apply gravity moveDirection.y -= gravity * Time.deltaTime; // Move the controller controller.Move(moveDirection * Time.deltaTime); }// END Update()
Inspector> setup Speed, Jump Speed, Gravity vars
Notice:
moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, 0);
I have removed GetAxis(“Vertical”)
Move as 2.5D Platform – double jump (Air Jump)
Change the script to:
– Move the character controller sideways XY plane, based on the left/right arrow keys.
– Ground jump and Air jump
#pragma strict /// 3D and 2.5D platform Character Controller /// http://blog.lucedigitale.com /// Author: Andrea Tonin /// Attach this script to your player /// This script moves the character controller /// sideways based on the left/right arrow keys. /// It also jumps when pressing space. /// Make sure to attach a character controller to the same game object. /// It is recommended that you make only one call to Move or SimpleMove per frame. // It request CharacterController component @script RequireComponent(CharacterController) var speed : float = 6.0; // the speed of the character var jumpSpeed : float = 8.0; // the jump speed var gravity : float = 20.0; // the gravity var canJump : boolean = true; // the player can jump, uncheck to disable jump var disableZMov : boolean = true;// disable Z movement var falling : boolean = false; // the player is falling down var apex : float; // max relative height to perform an Air Jump -> Assign in Inspector // (apice) la massima altezza relativa all'interno della quale può innestare l'Air Jump var MaxJumpHeight : float; // max absolute height to perform an Air Jump -> calculate into Update() private var moveDirection : Vector3 = Vector3.zero; // shorthand for writing Vector3(0, 0, 0). function Update() { // Get the component CharacterController var controller : CharacterController = GetComponent(CharacterController); // Move direction directly from axes START ######################################## // if touching the ground during the last move if (controller.isGrounded) {// We are grounded if (disableZMov) // use it to move in 2.5D space moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, 0); if (!disableZMov) // use it to move in 3D space moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed; }// END if .isGrounded // Move direction directly from axes END ############################################ // Jump START ####################################################################### // GROUND Jump START ------------------------------------------------------- // salta se ----------- --------------> è a terra AND è abilitato a saltare if (Input.GetButton ("Jump") && controller.isGrounded && canJump) { // record Y position... var RecPositionY : float = transform.position.y; // calculate the absolute height in the world space to be able Air Jump MaxJumpHeight = RecPositionY + apex; // perform your best jump moveDirection.y = jumpSpeed; } // END if // AIR Jump START ---------------------------------------------------------- // salta se -------------------------------> è in aria AND è abilitato a saltare AND non sta cadendo AND non ha superato l'altezza del primo salto if (Input.GetButton ("Jump") && !controller.isGrounded && canJump && !falling && transform.position.y <= MaxJumpHeight) { moveDirection.y = jumpSpeed; } // END if // Jump END ########################################################################### // Apply gravity moveDirection.y -= gravity * Time.deltaTime; // Move the controller controller.Move(moveDirection * Time.deltaTime); // others useful datas -------------------------------------------- // The speed from gravity or jumping var verticalSpeed : float = controller.velocity.y; // Non ho bisogno di altri controlli perchè .velocity è relativa e non tiene conto del movimento indotto da altri oggetti, ad esempio una piattaforma mobile if (verticalSpeed < 0) falling = true; // the Character Controller is falling if (verticalSpeed >= 0) falling = false; // debug code Debug.Log("Posizione Y" + transform.position.y + "Altezza Max" + MaxJumpHeight); }// END Update()
Inspector> setup all vars
Notice:
... var apex : float; // max relative height to perform an Air Jump -> Assign in Inspector var MaxJumpHeight : float; // max absolute height to perform an Air Jump -> calculate into Update() ... // Jump START ####################################################################### // GROUND Jump START ------------------------------------------------------- // salta se ----------- --------------> è a terra AND è abilitato a saltare if (Input.GetButton ("Jump") && controller.isGrounded && canJump) { // record Y position... var RecPositionY : float = transform.position.y; // calculate the absolute height in the world space to be able Air Jump MaxJumpHeight = RecPositionY + apex; // perform your best jump moveDirection.y = jumpSpeed; } // END if // AIR Jump START ---------------------------------------------------------- // salta se -------------------------------> è in aria AND è abilitato a saltare AND non sta cadendo AND non ha superato l'altezza del primo salto if (Input.GetButton ("Jump") && !controller.isGrounded && canJump && !falling && transform.position.y <= MaxJumpHeight) { moveDirection.y = jumpSpeed; } // END if // Jump END ###########################################################################
For italian people, come funziona?
1. – Input.GetButton (“Jump”) && controller.isGrounded – dal salto da terra, registro la Y assoluta di partenza – RecPositionY
2. – Input.GetButton (“Jump”) && !controller.isGrounded – dal salto in aria, controllo che l’altezza max del primo salto non venga superata – transform.position.y <= MaxJumpHeight -