- 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