- 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
![](https://koobas.hobune.stream/wayback/20220613023703im_/https://answers.unity.com/themes/thub/images/avi.jpg)
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