- 最后登录
- 2014-5-7
- 注册时间
- 2013-7-12
- 阅读权限
- 90
- 积分
- 11615
- 纳金币
- 454
- 精华
- 31
|
第一个文件,声明枚举类型,分别为均匀变化和加速变化
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参数的使用
|
|