实现物体绕不同轴旋转,并可以外部调用的函数

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

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参数的使用
原文地址:https://www.cnblogs.com/lm3515/p/1839420.html