In this tutorial, we will port the third-person camera types to Android. This tutorial is an extension of what we have implemented in our previous tutorial. Here we will port the five different types, viz.,
- Track
- Follow
- Follow and Track Rotation
- Follow and Independent Rotation
- Top-Down
Of third-person camera controls to the touch-sensitive device (we will export to Android phone).
If you have not read the previous tutorial, I strongly suggest that you read that tutorial first before going through this.
Section 1 – Scene and Character Setup
Section 2 – Implement Third-person Camera Controls
Section 3 – Porting the 5 Camera Controls to Android
To implement the movement and camera control, we will use a virtual joystick package. You can directly go to https://assetstore.unity.com/packages/tools/input-management/joystick-pack-107631#content or go to Unity Asset Store and search for “Joystick Pack”.
Download and import the package.
You will also need the FixedTouchField.cs script. Download and put it in your scripts folder. This allows you to create a touch field. We will see the usage later in our tutorials.
Create a Canvas and Add the Joystick
Right-click on the Hierarchy click on UI -> Canvas.
Now browse to Joystick Pack->Prefabs and drag and drop the Fixed Joystick.prefab into the Canvas.
You can configure the Joystick parameters, including the images. But we will leave it as it is now.
Port the Player movement script
For Player movement, we use the PlayerMovement.cs script file. In our original tutorial, we took inputs from the GetAxis Unity functions. Now we will take inputs from our virtual joystick controls. We will add a public variable called joystick. Then we will associate the Fixed Joystick in the canvass with this variable.
We will use platform-dependent conditional compilation.
#if UNITY_ANDROID
public FixedJoystick mJoystick;
#endif
Code language: C# (cs)
Change the Build Settings to Android.
Modify the Move function
#if UNITY_STANDALONE
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
#endif
#if UNITY_ANDROID
float h = mJoystick.Horizontal;
float v = mJoystick.Vertical;
#endif
Code language: C# (cs)
This means that we will get the h and v values from the virtual joystick for the Android build.
Click Play and drag the virtual joystick for the player to move.
Now open the ThirdPersonCamera.cs. There will be no changes to 4 of the 5 camera modes. Changes are only required for the Follow_IndependentRotation camera type.
This is because all except Follow_IndependentRotation requires no input. They passively follow the player. Whereas, Follow_IndependentRotation uses the mouse to orient the camera. We will replace the mouse with FixedTouchFiled input.
Create a Touch Field
Right-click on the Canvas and create a UI->Image.
Attached is the FixedTouchFiled.cs script to the image. Resize and position the image to your liking (this is where the user will touch and drag to orient the camera). Change the transparency to 50 for now so that it is slightly visible. Later we will make the image to be completely transparent.
ThirdPersonCamera.cs
Add a new public variable using a platform-specific conditional check.
#if UNITY_ANDROID
public FixedTouchField mTouchField;
#endif
Code language: C# (cs)
Drag and drop the Image from the Canvas and associate with this field.
We amend the Follow_IndependentRotation() function to use the touch field’s x and y changes rather than the mouse’s x and y changes.
#if UNITY_STANDALONE
float mx, my;
mx = Input.GetAxis("Mouse X");
my = Input.GetAxis("Mouse Y");
#endif
#if UNITY_ANDROID
float mx, my;
mx = mTouchField.TouchDist.x * Time.deltaTime;
my = mTouchField.TouchDist.y * Time.deltaTime;
#endif
Code language: C# (cs)
Click Play and see the behaviour on your screen.
We will make one last chance to make our Player move left and right using the virtual joystick. We will also remove the Left Shift key to move to run, and instead, we will use the full extent of your joystick button.
So open up PlayerMovement.cs and make the following changes.
public void Move()
{
#if UNITY_STANDALONE
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
#endif
#if UNITY_ANDROID
float h = mJoystick.Horizontal;
float v = mJoystick.Vertical;
#endif
#if UNITY_STANDALONE
float speed = mWalkSpeed;
if (Input.GetKey(KeyCode.LeftShift))
{
speed = mRunSpeed;
}
#endif
#if UNITY_ANDROID
float speed = mRunSpeed;
#endif
if (mFollowCameraForward)
{
// Only allow aligning of player's direction when there is a movement.
if (v > 0.1 || v < -0.1 || h > 0.1 || h < -0.1)
{
// rotate player towards the camera forward.
Vector3 eu = Camera.main.transform.rotation.eulerAngles;
transform.rotation = Quaternion.RotateTowards(
transform.rotation,
Quaternion.Euler(0.0f, eu.y, 0.0f),
mTurnRate * Time.deltaTime);
}
}
else
{
transform.Rotate(0.0f, h * mRotationSpeed * Time.deltaTime, 0.0f);
}
mCharacterController.Move(transform.forward * v * speed * Time.deltaTime);
// Move forward / backward
Vector3 forward = transform.TransformDirection(Vector3.forward).normalized;
forward.y = 0.0f;
Vector3 right = transform.TransformDirection(Vector3.right).normalized;
right.y = 0.0f;
if (mAnimator != null)
{
if (mFollowCameraForward)
{
mCharacterController.Move(forward * v * speed * Time.deltaTime + right * h * speed * Time.deltaTime);
mAnimator.SetFloat("PosX", h * speed / mRunSpeed);
mAnimator.SetFloat("PosZ", v * speed / mRunSpeed);
}
else
{
mCharacterController.Move(forward * v * speed * Time.deltaTime);
mAnimator.SetFloat("PosX", 0);
mAnimator.SetFloat("PosZ", v * speed / mRunSpeed);
}
}
// apply gravity.
mVelocity.y += mGravity * Time.deltaTime;
mCharacterController.Move(mVelocity * Time.deltaTime);
if (mCharacterController.isGrounded && mVelocity.y < 0)
mVelocity.y = 0f;
}
Code language: C# (cs)
Now, let’s export to an Android phone. Before exporting, double confirm that you have selected M Follow Camera Forward in PlayerMovement and you have selected Follow_IndependentRotation from the drop-down in your ThirdPersonCamera.
Note that after you have tested and found everything is working as desired, you may want to change the transparency for the Fixed Touch Field image to be 0 so that there is no white image seen on the screen.
Read My Other Tutorials
- Implement Constant Size Sprite in Unity2D
- Implement Camera Pan and Zoom Controls in Unity2D
- Implement Drag and Drop Item in Unity
- Graph-Based Pathfinding Using C# in Unity
- 2D Grid-Based Pathfinding Using C# and Unity
- 8-Puzzle Problem Using A* in C# and Unity
- Create a Jigsaw Puzzle Game in Unity
- Implement a Generic Pathfinder in Unity using C#
- Create a Jigsaw Puzzle Game in Unity
- Generic Finite State Machine Using C#
- Implement Bezier Curve using C# in Unity
- Create a Jigsaw Tile from an Existing Image
- Create a Jigsaw Board from an Existing Image
- Solving 8 puzzle problem using A* star search
- A Configurable Third-Person Camera in Unity
- Player Controls With Finite State Machine Using C# in Unity
- Finite State Machine Using C# Delegates in Unity
- Enemy Behaviour With Finite State Machine Using C# Delegates in Unity
- Augmented Reality – Fire Effect using Vuforia and Unity
- Implementing a Finite State Machine Using C# in Unity
- Solving 8 puzzle problem using A* star search in C++
- What Are C# Delegates And How To Use Them
- How to Generate Mazes Using Depth-First Algorithm
A committed and optimistic professional who brings passion and enthusiasm to help motivate, guide and mentor young students into their transition to the Industry and reshape their careers for a fulfilling future. The past is something that you cannot undo. The future is something that you can build.
I enjoy coding, developing games and writing tutorials. Visit my GitHub to see the projects I am working on right now.
Educator | Developer | Mentor
Can I get the final player movement and third person camera scripts please. There is an unknown error which took whole night but even did not solved.
Hi Kunal,
May I know what error are you getting?
The package is already included in the tutorial. https://faramira.com/downloads/Tutorials/ThirdPersonCamera/ThirdPersonCamera_Android.unitypackage
regards
Shamim
THanks very much