Skip to main content

Third person camera with free look in Unity3D

I first experienced this camera system in Mass Effect 1. Was a bit annoying during a couple of minutes, but then I got used to it and started to like it. Was also used in The Witcher 2 and 3, and I wanted to implement it for a future RPG project we are designing. But my lack of math skills prevented me from implementing a working prototype, until a few days ago, when I figured out a way to achieve it.So, I decided to post this little TPS tutorial, in case it can help somebody.

Look at the following gameobject hierarchy:



The relevant objects are player and Pivot. The first one is the player (model, collider, etc) obviously. The second is the parent of the camera and handles its rotations, via the following script:

float rotationY = 0F;
    Camera cam;

    // Use this for initialization
    void Start () {
        cam = gameObject.GetComponentInChildren<Camera> ();
    }
   
    // Update is called once per frame
    void Update () {
               
        if (Input.GetAxis ("Mouse X") != 0 || Input.GetAxis ("Mouse Y") != 0) {
           
            float rotationX = gameObject.transform.localEulerAngles.y + Input.GetAxis("Mouse X") * 2f;

            rotationY += Input.GetAxis("Mouse Y") * 5f;
           
            gameObject.transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
           
        }
    }

The player gameobject also has an script, that deals with player movements, and also keeps the pivot sinchronized with its own position:

public GameObject pivot;
    // Use this for initialization
    void Start () {       
        Cursor.visible = false;
        Screen.lockCursor = true;
    }
   
    // Update is called once per frame
    void Update () {
        pivot.transform.position = gameObject.transform.position;
        if (Input.GetKey (KeyCode.W)) {
            Vector3 rot = gameObject.transform.localEulerAngles;
            rot.y = pivot.transform.localEulerAngles.y;
            gameObject.transform.rotation = Quaternion.Slerp (gameObject.transform.rotation, Quaternion.Euler (rot), 5f * Time.deltaTime);
            gameObject.transform.Translate (0, 0, 20 * Time.deltaTime);
            pivot.transform.Translate (0, 0, 20 * Time.deltaTime);
        } else if (Input.GetKey (KeyCode.S)) {
            //go back
            Vector3 rot = gameObject.transform.localEulerAngles;
            rot.y = pivot.transform.localEulerAngles.y+180f;           
            gameObject.transform.rotation = Quaternion.Slerp (gameObject.transform.rotation, Quaternion.Euler (rot), 5f * Time.deltaTime);
            gameObject.transform.Translate (0, 0, 20 * Time.deltaTime);
            pivot.transform.Translate (0, 0, 20 * Time.deltaTime);
        }
    }

Perhaps not the most elegant solution, but seems to work.

Comments

Popular posts from this blog

Isometric camera with Godot

Took some effort and some of my sleep hours, but at last, I made it. Here is my first videotutorial: implementing an isometric camera in 3D, with Godot. Useful if you want to emulate the look of old classics like Fallout 2, but with some extra features. Considering that my voice is not so nice, and my english pronounciation is even worse, I also added texts to help you underestand what Im saying. You will also notice some background noise, but cant do anything to solve that. Any suggestion is welcome. Expect another tutorial soon.... or sor tof. This time, will be about my AI system.

Unity3d isometric camera tutorial

I had pending this since a month ago, so Im forcing myself to post it today. The goal is to provide a fully functional isometric like system that you can use with few or none modifications in your own game. So, lets get started. Start Unity3d and in your scene, add an empty GameObject, we will call it target . Create a camera object and drag it to target to make it child. The result looks like this: Now select Camera and set the values to this: For a true isometric like feeling, ortho projection is essential. You could use perspective, but it is not the same. Play with Size to suit your needs (we will be using this later, when implementing zoom). Now, lets create an script named CameraController, or whatever, and drag it to target GameObject. Lets implement scrolling, the easier part: go to Update() and add the following code: if (Input.GetKeyDown(KeyCode.W)) {             dir = UP;         } e...

Vulkan and open source engines

It is weird, but even when Vulkan has embraced the open source philosophy (open drivers, tools, etc), Im not seeing too much enthusiasm to adopt it in open source game engines. I have been following mostly Godot and Urho3D, yet Ogre3D and Irrlicht doesnt seems to be rushing to implement the new renderers. It is worth to mention that Godot promissed they would delay the long needed refactoring of its 3D renderer until Vulkan release, but now they say they wont be using it, favoring GL ES 3 instead. The other engines seems to be dealing with lack of man power (Urho3D leader left the work on hands of community, as he is not working on Vulkan renderer right now) and base code designed for older APIs, specifically, DirectX 9. Lot of work is required to adapt this code base, not only for Vulkan, but for DirectX 12 too. Well, nobody said that developing a game engine was easy. The advantages of Vulkan have been widely detailed. From engine point of view, it would centralize all renderers...