- Home /
 
 
               Question by 
               Davelicious · Jan 21, 2021 at 02:54 AM · 
                rotationrolllimited  
              
 
              Limited sideway roll
I'm building a 2.5D top down spaceship shooter. I want to gradually roll the a ship sideways limited to a specific angle when I move horizontally and gradually roll it back when stopping the side movement.
For some unclarified reason my ship keeps rolling over pass my angle limit and far to slow when I move sideways and when I stop it returns back to the original 0° roll angle and even faaaaaar slower.
 using System;
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using Unity.Mathematics;
 
 
 public class Player : MonoBehaviour
 {
     [SerializeField] [Range(5.0f, 100f)] float playerXSpeed = 50f;
     [SerializeField] [Range(5.0f, 100f)] float playerYSpeed = 50f;
     [SerializeField] float xPadding = 1f;
     [SerializeField] float yPadding = 1f;
 
     [SerializeField] float rollLimit = 25f;
     [SerializeField] float rollSpeed = 10f;
 
     float xMin;
     float xMax;
     float yMin;
     float yMax;
 
 
     // Start is called before the first frame update
     void Start()
     {
         SetupMoveBoundries();
     }
 
     private void SetupMoveBoundries()
     {
         Mesh mesh = GetComponent<MeshFilter>().mesh;
         Debug.Log("bounds:" + mesh.bounds); //extents are 1/2 of the size
         xPadding = mesh.bounds.extents.x;
         yPadding = mesh.bounds.extents.y;
 
         Camera gameCamera = Camera.main;
         xMin = gameCamera.ViewportToWorldPoint(new Vector3(0, 0, 0)).x + xPadding;
         xMax = gameCamera.ViewportToWorldPoint(new Vector3(1, 0, 0)).x - xPadding;
         yMin = gameCamera.ViewportToWorldPoint(new Vector3(0, 0, 0)).y + yPadding;
         yMax = gameCamera.ViewportToWorldPoint(new Vector3(1, 1, 0)).y - yPadding;
 
     }
 
     // Update is called once per frame
     void Update()
     {
         Move();
     }
 
     private void Move()
     {
         var deltaX = Input.GetAxis("Horizontal") * Time.deltaTime * playerXSpeed;
         var deltaY = Input.GetAxis("Vertical") * Time.deltaTime * playerYSpeed;
         var newXPos = Mathf.Clamp(transform.position.x + deltaX, xMin, xMax);
         var newYPos = Mathf.Clamp(transform.position.y + deltaY, yMin, yMax);
 
         var zRot = 0f;
 
         if (deltaX > 0)  //Move right/roll
         {
             if (transform.rotation.z >= -rollLimit)
             {
                 zRot = -rollLimit;
                 //zRot = Mathf.Clamp(-rollLimit, (-rollLimit + transform.rotation.z), 0f);
             }
         }
         else if (deltaX < 0)  //Move left/roll
         {
             if (transform.rotation.z <= rollLimit)
             {
                 zRot = rollLimit;
                 //zRot = Mathf.Clamp(rollLimit, 0f, (rollLimit - transform.rotation.z));
             }
         }
         else //Return to default pos
         {
             zRot = -transform.rotation.z;
         }
 
         //Roll only
         if (Input.GetKey(KeyCode.Q))
         {
             if (transform.rotation.z > -rollLimit)
             {
                 //zRot = -rollLimit + transform.rotation.z;
                 zRot = Mathf.Clamp(-rollLimit * Time.deltaTime, (-rollLimit + transform.rotation.z), 0f);
             }
         }
         if (Input.GetKey(KeyCode.E))
         {
             if (transform.rotation.z < rollLimit)
             {
                 //zRot = rollLimit - transform.rotation.z;
                 zRot = Mathf.Clamp(rollLimit * Time.deltaTime, 0f, (rollLimit - transform.rotation.z));
             }
         }
 
         transform.position = new Vector3(newXPos, newYPos);
         transform.Rotate(0, 0, zRot * Time.deltaTime, Space.Self);
 
     }
 }
 
              
               Comment
              
 
               
              Your answer
 
             Follow this Question
Related Questions
How to smoothly align an object to a surface, but only partially 2 Answers
Eliminate Roll effect in fps using keyboard 0 Answers
Tilt object acceloremeter limited 0 Answers
Finding roll angle 0 Answers
If a ball that you roll has a projector for shadows, how do you stop the rotation of the projector? 1 Answer