- Home /
 
2D Torque rotation - stop at certain angle
Hi
I'm working on a script that basically moves my player to the left and the right depending on the X coordinate of the screen when touched. When touched the player object should rotate to a certain angle (30 in my code). When the player doesn't press the screen anymore the player object should change to it's initial rotation z value which is 0.
Rotation can be easily achieved trough transform.rotate but I want to follow the Physics guidelines for Unity.
To achieve rotation in Unity I should use rigidbody2D.AddTorque. I've used rigidbody2D.rotation to check the rotation z-value. This works correctly in the following script but when I tap the screen for half a second my object starts to make a jittery movement.
Code:
 using UnityEngine;
 using System.Collections;
 public class RotatePlayer : MonoBehaviour {
 private Transform transformCache;
 private double halfScreen;
 // Use this for initialization
 void Start () {
     RotateNormal ();
     halfScreen = Screen.width / 2.0;
 }
 void Awake(){
     transformCache = transform;
 }
 
 // Update is called once per frame
 void FixedUpdate () {
     //Only rotate when the game is not paused
     if(Time.timeScale == 1){
         if (Input.touchCount == 0) {
             RotateNormal();
         }
         if(Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Stationary)
         {
             Vector2 touchPosition = Input.GetTouch(0).position;
                             
             //Check if it is left or right?
             if(touchPosition.x < halfScreen){
                 RotateLeft ();
             }
             if (touchPosition.x > halfScreen) {
                 RotateRight ();
             }
         }
         if (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Canceled) {
             RotateNormal ();
         }
         if (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Ended) {
             RotateNormal ();
         }
     }
 }
 
 void RotateNormal(){
     //transformCache.localEulerAngles = new Vector3(0,0,0);
     if (rigidbody2D.rotation >= 31 && rigidbody2D.rotation != 0) {
         transformCache.localEulerAngles = new Vector3(0 ,0 ,0);
     } else if (rigidbody2D.rotation <= -31 && rigidbody2D.rotation != 0) {
         transformCache.localEulerAngles = new Vector3(0, 0, 0);
     } else if (rigidbody2D.rotation == 0) {
         transformCache.localEulerAngles = new Vector3(0, 0, 0);
     }
 }
 
 void RotateLeft(){
         //transformCache.Rotate(0,0,30);
     if (rigidbody2D.rotation >= 21) {
         rigidbody2D.angularVelocity = 0;
     } else {
         gameObject.rigidbody2D.AddTorque(30);
     }
 }
 
 void RotateRight(){
         //transformCache.Rotate(0, 0, -30);
     if (rigidbody2D.rotation <= -21){
         rigidbody2D.angularVelocity = 0;
         
     } else {
         gameObject.rigidbody2D.AddTorque(-30);
     }
 }
 }
 
               Thanks for the help in advance!
~monserboy
Your answer
 
             Follow this Question
Related Questions
Rotating Joystick on Touch 0 Answers
How to get the growth of an angle from touch 1 Answer
How to change an angle of object with Rigidbody2D in a specific range? 0 Answers
Set rotation based on 2 points problem 1 Answer
why is torque always the same? 2 Answers