第一个文件,声明枚举类型,分别为均匀变化和加速变化

using UnityEngine;
using System.Collections;

public enum CTRotationType
{
Uniform,
AccelerateUniformly
}



第二个文件:主函数,实现围绕轴变化的两个函数,分别为均匀变化和加速变化


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;
}
}



第三个文件,测试脚本

using UnityEngine;
using System.Collections;

public class TestRotationScript : MonoBehaviour {

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}

void OnGUI ()
{
CTRotation ttscript;
CTChangeAlpha colorScript;
GameObject testObject = GameObject.Find("TestCube");
//Component testObjectScript = testObject.GetComponent("CRotation");
ttscript = (CTRotation)testObject.GetComponent("CTRotation");
colorScript = (CTChangeAlpha)testObject.GetComponent("CTChangeAlpha");

if (GUI.Button (new Rect (20,40,80,20), "UniRotate")) {
ttscript.RotateTo(3600f, 2, 2f);
}

if(GUI.Button(new Rect(20,60,80,20),"AccRotate")){
ttscript.RotateTo(3600f, 2, 2f, 0.5f);
}

if(GUI.Button(new Rect(20,80,80,20),"Color")){
colorScript.ColorTo(2,5.0f);
}
}
}


其中:第一个和第二脚本赋给目标物体;第三个脚本赋给任何一个物体作为测试物体使用


代码目的是方便外部调用和函数重用;注意isRotating参数的使用