Isometric Camera Angle Control in Unity

An update on my isometric side-project

Today I’m taking a break from my usual routine to work on a side-project. My goal for this jaunt was to give the player the option of viewing the scene from one of four different isometric angles. I also wanted a chance to play with the new isometric building block assets I picked up from the Unity Asset store.

First, I constructed a simple environment for my player to explore.

The coolest thing about this asset is the positional coloring— the color of all planes on each are the same, no matter how you rotate the object, and rounded objects get a gradient between the colors of the axes it crosses.

Then I set up my Cinemachine Virtual Cameras.

Each camera is set to follow the player, with its x-rotation at 32deg, Body set to “Framing Transposer” and Aim set to “Do Nothing”

The y-rotation of each camera will be the four diagonal angles: 45, 125, 225, and 305

Next we need to script the actions for the input system. I’ve added two new actions to the Player Action Map:

Next, I need to create a serialized array in the player class and assign the cameras to it, as well as an index variable. I’ll also need to include the two new action functions from Controls.IPlayerActions in the Player Script. For each, I’ll do the following:

If the button is pressed and can rotate is true
… set can rotate to false (so the script only runs once per button press)
…change current camera priority to 10
…increment/decrement camera index
… if the camera index is outside of value, loop around to valid index
…change new current camera priority to 20
if the action has been performed
…set can rotate to true

In C#, here’s our script:

Now when I press E, the camera to the right is raised to highest priority and we transition to that virtual camera. Pressing Q sends us back the other direction.

Once controls are set up, we need to adapt the function that rotates our movement vectors. The old function was designed for a fixed camera. Here’s what it looked like:

That Quaternion.Euler(0, 45.0f, 0) is what needs to change — instead of a hard-coded number, I need the rotation information from each camera to inform the conversion function as to what degree of rotation is necessary.

The reworked code first finds the Euler angles for the current camera’s rotation. Then the rotation variable can use the isolated y-axis information to know how to rotate the vectors so that “up” is always “up” no matter which way the camera turns.

Here it is in action:


Tomorrow I really will tell you about whatever it was I said I was going to write about last time. Thanks for digressing with me.




Unity Developer / Game Developer / Artist / Problem Solver

Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

NativeScript: Giving Hybrid Mobile a Second Chance

How to use Git-lfs ( Large File Storage ) to push large files to Github

Github hosted comments

Building the Future of DeFi on NEAR Protocol: Angel DAO is Funding Innovative DeFi Solutions on…

Configuring your Angular 6 application to use Microsoft B2C authentication

GraphQL, what, why, and when?

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Micha Davis

Micha Davis

Unity Developer / Game Developer / Artist / Problem Solver

More from Medium

Adding Player Audio Effects

Cross-platform Input Controller in Unity

Mastering Unity Scripting | Summary — Chapter 1: Unity C# Refresher

Creating A 2.5D Character Controller In Unity