Check out the finished code below the videos
Part 1 - Player Movement Joystick
Part 2 - Player Rotation Joystick
- 0:15 - Quick fix for a problem with our player movement script from the last tutorial
- 2:10 - Setting up our scene for the new joystick
- 2:35 - Creating an enum to choose what type of joystick we want in a drop down menu
- 4:45 - Using the enum to change the functionality of our joystick for rotation
- 6:30 - Adding in our rotation logic
- 7:38 - Using touch2Watch to make our joystick pay attention to the correct finger
- 8:25 - Quick overview of our rotation script
- 9:00 - Demonstration of the look rotation joystick working
- 9:35 - Changing the sky color with our third joystick, for funzies
- 10:50 - Demonstration of third joystick controlling sky color
- 11:15 - Overview of why we need to manage our touch2Watch indexes
- 12:20 - Creating a TouchManager script
- 14:15 - Explaination of how we will manage our touches2Watch
- 16:38 - Adding in a failsafe to make sure our joysticks never get stuck when there are no touches on the screen
- 17:35 - Outro, thanks for watching :D
Check out the videos above to hear the explanation and see the code in action
/*/
* Script by Devin Curry
* www.Devination.com
* www.youtube.com/user/curryboy001
* Please like and subscribe if you found my tutorials helpful :D
* Twitter: https://twitter.com/Devination3D
/*/
using UnityEngine;
using System.Collections;
public class Joystick : TouchLogicV2//NOTE: This script has been updated to V2 after video recording
{
public enum JoystickType {Movement, LookRotation, SkyColor};
public JoystickType joystickType;
public Transform player = null;
public float playerSpeed = 2f, maxJoyDelta = 0.05f, rotateSpeed = 100.0f;
private Vector3 oJoyPos, joyDelta;
private Transform joyTrans = null;
public CharacterController troller;
private float pitch = 0.0f,
yaw = 0.0f;
//cache initial rotation of player so pitch and yaw don't reset to 0 before rotating
private Vector3 oRotation;
void Start ()
{
joyTrans = this.transform;
oJoyPos = joyTrans.position;
//cache original rotation of player so pitch and yaw don't reset to 0 before rotating
oRotation = player.eulerAngles;
pitch = oRotation.x;
yaw = oRotation.y;
}
public override void OnTouchBegan()
{
//Used so the joystick only pays attention to the touch that began on the joystick
touch2Watch = TouchLogicV2.currTouch;
}
public override void OnTouchMovedAnywhere()
{
if(TouchLogicV2.currTouch == touch2Watch)
{
//move the joystick
joyTrans.position = MoveJoyStick();
ApplyDeltaJoy();
}
}
public override void OnTouchStayedAnywhere()
{
if(TouchLogicV2.currTouch == touch2Watch)
{
ApplyDeltaJoy();
}
}
public override void OnTouchEndedAnywhere()
{
//the || condition is a failsafe so joystick never gets stuck with no fingers on screen
if(TouchLogicV2.currTouch == touch2Watch || Input.touches.Length <= 0)
{
//move the joystick back to its orig position
joyTrans.position = oJoyPos;
touch2Watch = 64;
}
}
void ApplyDeltaJoy()
{
switch(joystickType)
{
case JoystickType.Movement:
troller.Move ((player.forward * joyDelta.z + player.right * joyDelta.x) * playerSpeed * Time.deltaTime);
break;
case JoystickType.LookRotation:
pitch -= Input.GetTouch(touch2Watch).deltaPosition.y * rotateSpeed * Time.deltaTime;
yaw += Input.GetTouch(touch2Watch).deltaPosition.x * rotateSpeed * Time.deltaTime;
//limit so we dont do backflips
pitch = Mathf.Clamp(pitch, -80, 80);
//do the rotations of our camera
player.eulerAngles += new Vector3 ( pitch, yaw, 0.0f);
break;
case JoystickType.SkyColor:
Camera.mainCamera.backgroundColor = new Color(joyDelta.x, joyDelta.z, joyDelta.x*joyDelta.z);
break;
}
}
Vector3 MoveJoyStick()
{
//convert the touch position to a % of the screen to move our joystick
float x = Input.GetTouch (touch2Watch).position.x / Screen.width,
y = Input.GetTouch (touch2Watch).position.y / Screen.height;
//combine the floats into a single Vector3 and limit the delta distance
//If you want a rectangularly limited joystick (used in video), use this
Vector3 position = new Vector3 (Mathf.Clamp(x, oJoyPos.x - maxJoyDelta, oJoyPos.x + maxJoyDelta),
Mathf.Clamp(y, oJoyPos.y - maxJoyDelta, oJoyPos.y + maxJoyDelta), 0);//use Vector3.ClampMagnitude instead if you want a circular clamp instead of a square
//If you want a circularly limited joystick, use this (uncomment it)
//Vector3 position = Vector3.ClampMagnitude(new Vector3 (x-oJoyPos.x, y-oJoyPos.y, 0), maxJoyDelta) + oJoyPos;
//joyDelta used for moving the player
joyDelta = new Vector3(position.x - oJoyPos.x, 0, position.y - oJoyPos.y).normalized;
//position used for moving the joystick
return position;
}
void LateUpdate()
{
if(!troller.isGrounded)
troller.Move(Vector3.down * 2);
}
}