zoukankan      html  css  js  c++  java
  • 实现物体绕不同轴旋转,并可以外部调用的函数

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

    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参数的使用
  • 相关阅读:
    CF1033F Boolean Computer
    CF1027G X-mouse in the Campus
    LOJ2570 [ZJOI2017]线段树
    清华强基&交大浙大三一
    java制作unicode代码在excel中批量导入图片
    laravel8新功能和笔记
    缩小图片比例大小和占用空间
    2018-2019-2 20175216张雪原 实验五《网络编程与安全》实验报告
    2018-2019-2 20175216张雪原 实验四《Android程序设计》实验报告
    20175216 《Java程序设计》第十一周学习总结
  • 原文地址:https://www.cnblogs.com/lm3515/p/1839420.html
Copyright © 2011-2022 走看看