博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现物体绕不同轴旋转,并可以外部调用的函数
阅读量:6987 次
发布时间:2019-06-27

本文共 5391 字,大约阅读时间需要 17 分钟。

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

1
2
3
4
5
6
7
8
using
 UnityEngine;
using
 System.Collections;
 
public
 enum CTRotationType
{
    
Uniform,
    
AccelerateUniformly
}

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
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
;
    
}
}

 

第三个文件,测试脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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参数的使用

转载地址:http://vampl.baihongyu.com/

你可能感兴趣的文章
pandas 修改 DataFrame 列名
查看>>
《2018年云上挖矿态势分析报告》发布,非Web类应用安全风险需重点关注
查看>>
leetcode409.Longest Palindrome
查看>>
以太坊客户端Ethereum Wallet与Geth区别简介
查看>>
蚂蚁区块链平台BaaS技术解析与实践
查看>>
Nervos 双周报第 3 期:佛系新年之后的开工大吉!
查看>>
测试开发系类之接口自动化测试
查看>>
【PHP 扩展开发】Zephir 基础篇
查看>>
HTML
查看>>
HashMap浅析?
查看>>
字节跳动开源Go结构体标签表达式解释器,成请求参数校验的杀手锏
查看>>
怎么将在线录制的视频转为GIF动态图
查看>>
js的setTimeout和Promise---同步异步和微任务宏任务
查看>>
【剑指offer】顺时针打印矩阵
查看>>
以太坊交易池处理逻辑
查看>>
怎么将图片上传封装成指令?
查看>>
leetcode讲解--861. Score After Flipping Matrix
查看>>
干货 | 金融级互联网产品持续交付的挑战与应对
查看>>
一道面试题引发的思考 --- 理解 new 运算符
查看>>
聊聊JavaScript和Scala的表达式 Expression
查看>>