using UnityEngine;
using System.Collections;
public class CTRotation : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (isRotating)
{
executeRotate();
}
}
bool isRotating = false ;
Quaternion definedRotation = new Quaternion(0, 0, 0,0);
Vector3 rotateVector = new Vector3(1,0,0);
float rotateVelocity = 0;
float accelerateDuration = 0;
float leftDuration = 0;
float rotateDuration = 0;
int rotateAxis = 0;
float angleRange = 0;
float deltaRotate = 0; //0;
// acceleration when it is in the accelerating process.
float rotateAcceleration = 0;
CTRotationType rotateType;
//int RotateType = 0;
private void initRotateArgument( float _initAngleRange, int _initRotateAxis, float _initRotateDuration)
{
rotateAxis = _initRotateAxis;
rotateDuration = _initRotateDuration;
leftDuration = _initRotateDuration;
angleRange = _initAngleRange;
rotateType = CTRotationType.Uniform;
}
public void RotateTo( float _angleRange, int _axis, float _duration)
{
print( "in the rotateto" );
isRotating = false ;
rotateType = CTRotationType.Uniform;
//RotateType = 0;
initRotateArgument(_angleRange, _axis, _duration);
switch (rotateAxis)
{
case 0: //rotate around X axis
{
rotateVector = Vector3.right;
break ;
}
case 1: //rotate around Y axis
{
rotateVector = Vector3.up;
break ;
}
case 2: //rotate around Z axis
{
rotateVector = Vector3.forward;
break ;
}
default :
break ;
}
deltaRotate = angleRange/rotateDuration;
isRotating = true ;
}
public void RotateTo( float _angleRange, int _axis, float _duration, float _accelerateDuration)
{
isRotating = false ;
rotateType = CTRotationType.AccelerateUniformly;
//RotateType = 1;
rotateAcceleration = 1/((rotateDuration - accelerateDuration)*accelerateDuration);
initRotateArgument(_angleRange, _axis, _duration);
switch (rotateAxis)
{
case 0: //rotate around X axis
{
rotateVector = Vector3.right;
break ;
}
case 1: //rotate around Y axis
{
rotateVector = Vector3.up;
break ;
}
case 2: //rotate around Z axis
{
rotateVector = Vector3.forward;
break ;
}
default :
break ;
}
accelerateDuration = _accelerateDuration;
// deltaRotate = angleRange/(_duration - _accelerateDuration*2);
isRotating = true ;
}
void executeRotate()
{
switch (rotateType)
{
//case 0://CTMoveType.Uniform:
case CTRotationType.Uniform:
uniformRotate();
break ;
//case 1://CTMoveType.AccelerateUniformly:
case CTRotationType.AccelerateUniformly:
accelerateRotate();
break ;
}
leftDuration -= Time.deltaTime;
/* if (leftDuration <= 0)
{
transform.position = targetPosition;
isMoving = false;
}*/
}
private void accelerateRotate()
{
print(leftDuration);
if (leftDuration > (rotateDuration - accelerateDuration))
{
rotateVelocity = ( float )((angleRange*(rotateDuration - leftDuration))*rotateAcceleration);
// transform.Rotate(rotateVelocity * Time.deltaTime*rotateVector, Space.World);
transform.Rotate(rotateVelocity * rotateVector*Time.deltaTime, Space.World);
}
else if (leftDuration > accelerateDuration)
{
rotateVelocity = ( float )((angleRange*accelerateDuration)*rotateAcceleration);
transform.Rotate(rotateVelocity*rotateVector*Time.deltaTime, Space.World);
}
else if (leftDuration > 0)
{
rotateVelocity= ( float )((angleRange*leftDuration)*rotateAcceleration);
transform.Rotate(rotateVelocity*rotateVector*Time.deltaTime, Space.World);
}
else
isRotating = false ;
}
private void uniformRotate()
{
print(leftDuration);
//if(leftDuration)
if (leftDuration > 0)
{
transform.Rotate(rotateVector*deltaRotate*Time.deltaTime, Space.World);
//transform.Rotate(rotateVector * Time.deltaTime*deltaRotate, Space.World);
}
else
isRotating = false ;
}
}
|