Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Third Person Camera Stutter When Mouse Moved On Vertical Axis (Z axis problem)

Discussion in 'Scripting' started by Obsineon, Jul 8, 2018.

  1. Obsineon

    Obsineon

    Joined:
    Jan 21, 2018
    Posts:
    10
    I tried writing a third person camera like the default Unreal Engine camera where you can rotate with your mouse but your camera is positioned on a certain point away from your character.

    After struggling for 2 hours, I managed to lock my Z axis when mouse rotation is happening but the camera stutters and it annoys me while playing.

    Is there any optimization techniques you can suggest me ?

    Thanks in advance.

    (I put a empty game object in my character's belly and parented the camera. So I can rotate the game object and keep the offset stable.)


    Code (CSharp):
    1. using UnityEngine;
    2. public class CameraTrypod : MonoBehaviour {
    3.     GameObject cameraTarget;
    4.     GameObject cameraTargetRotate;
    5.     Vector3 lastPosition;
    6.     Vector2 mousePos;
    7.     float horMove;
    8.     float verMove;
    9.     float zkill;
    10.     public float offsetDistance;
    11.     public float offsetHeight;
    12.     bool preventMove = false;
    13.     // Use this for initialization
    14.     void Start () {
    15.         cameraTarget = GameObject.FindGameObjectWithTag("Player");
    16.         cameraTargetRotate = GameObject.FindGameObjectWithTag("Pivot");
    17.         cameraTargetRotate.transform.position = cameraTarget.transform.position+Vector3.up;
    18.         lastPosition = new Vector3(cameraTarget.transform.position.x, cameraTarget.transform.position.y + offsetHeight, cameraTarget.transform.position.z - offsetDistance);
    19.         transform.position = lastPosition;
    20.         transform.LookAt(cameraTarget.transform.position + Vector3.up);
    21.         mousePos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
    22.     }
    23.     // Update is called once per frame
    24.     void Update () {
    25.         if (Input.GetKeyDown(KeyCode.Escape))
    26.         {
    27.             preventMove = !preventMove;
    28.         }
    29.         if (preventMove)
    30.         {
    31.             return;
    32.         }
    33.         else
    34.         {
    35.             cameraTargetRotate.transform.position = cameraTarget.transform.position + Vector3.up;
    36.             // Camera wall avoidance
    37.             //transform.LookAt(cameraTarget.transform.position);
    38.             Debug.Log(Input.mousePosition.x + "   " + Input.mousePosition.y + "   " + Input.mousePosition.z + " POS: " + mousePos + "Rotation : " + cameraTargetRotate.transform.rotation );
    39.             horMove = mousePos.x - Input.mousePosition.x;
    40.             verMove = mousePos.y - Input.mousePosition.y;
    41.             Debug.Log(horMove + " " + verMove);
    42.            
    43.             if (mousePos.x < Input.mousePosition.x)
    44.             {
    45.                 cameraTargetRotate.transform.Rotate(new Vector3(0, horMove, 0f), Space.World);
    46.                 zkill = -cameraTargetRotate.transform.eulerAngles.z;
    47.                 cameraTargetRotate.transform.Rotate(0,0,zkill );
    48.                 //mousePos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
    49.             }
    50.             if (mousePos.x > Input.mousePosition.x)
    51.             {
    52.                 cameraTargetRotate.transform.Rotate(new Vector3(0, horMove, 0f), Space.World);
    53.                 zkill = -cameraTargetRotate.transform.eulerAngles.z;
    54.                 cameraTargetRotate.transform.Rotate(0, 0, zkill );
    55.                 //mousePos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
    56.             }
    57.             if (mousePos.y > Input.mousePosition.y)
    58.             {
    59.                 cameraTargetRotate.transform.Rotate(new Vector3(verMove, 0, 0f), Space.World);
    60.                 zkill = -cameraTargetRotate.transform.eulerAngles.z;
    61.                 cameraTargetRotate.transform.Rotate(0, 0, zkill );
    62.                 //mousePos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
    63.             }
    64.             if (mousePos.y < Input.mousePosition.y)
    65.             {
    66.                 cameraTargetRotate.transform.Rotate(new Vector3(verMove, 0, 0f), Space.World);
    67.                 zkill = -cameraTargetRotate.transform.eulerAngles.z;
    68.                 cameraTargetRotate.transform.Rotate(0, 0, zkill);
    69.                 //mousePos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
    70.             }
    71.             //cameraTargetRotate.transform.rotation = Quaternion.Euler(cameraTargetRotate.transform.rotation.x, cameraTargetRotate.transform.rotation.y, 0f);
    72.             mousePos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
    73.         }
    74.     }
    75. }
    76.