本文实例为大家分享了unity实现车方向盘转动效果的具体代码,供大家参考,具体内容如下
效果:
c#脚本如下:
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
|
using system; using system.collections; using system.collections.generic; using unityengine; using unityengine.eventsystems; public class newbehaviourscript : monobehaviour, idraghandler,ibegindraghandler,ienddraghandler { /// <summary> /// 需要旋转的模型 /// </summary> public transform model; /// <summary> /// 父物体的recttransform /// </summary> public recttransform parentrect; /// <summary> /// 旋转的ui /// </summary> public recttransform img; /// <summary> /// 摄像机 /// </summary> public camera cam; /// <summary> /// 是否在拖拽 /// </summary> private bool drag = false ; /// <summary> /// 初始角度 /// </summary> private float originangle = 0; /// <summary> /// 自身角度 /// </summary> private float selfangle1 = 0; /// <summary> /// 上一次和当前的角度 /// </summary> private float lastangle = 0f; private float currentangle = 0f; /// <summary> /// 上一次和当前的位置 /// </summary> private vector2 currentpos; private vector2 lastpos; public void onbegindrag(pointereventdata eventdata) { drag = true ; originangle = getangle(eventdata.position); selfangle1 = (img.transform as recttransform).eulerangles.z; } public void ondrag(pointereventdata eventdata) { if (drag) { lastangle = currentangle; currentangle = getangle(eventdata.position); float val = touchjudge(currentpos, ref lastpos, vector2.zero); if (val > 0f && val <180f) { img.eulerangles = new vector3(0f,0f, -currentangle + originangle + selfangle1); model.eulerangles = new vector3(0f, 0f, -currentangle + originangle + selfangle1); } } } public void onenddrag(pointereventdata eventdata) { drag = false ; } /// <summary> /// 将屏幕坐标转成ui坐标 /// </summary> /// <param name="pos1"></param> /// <returns></returns> float getangle(vector2 pos1) { vector2 pos; recttransformutility.screenpointtolocalpointinrectangle(parentrect, pos1, cam, out pos); currentpos = pos; return mathf.atan2(pos.x, pos.y) * mathf.rad2deg; } /// <summary> /// 判断顺时针还是逆时针旋转 /// </summary> /// <param name="current"></param> /// <param name="last"></param> /// <param name="anchor"></param> /// <returns></returns> private float touchjudge(vector2 current, ref vector2 last, vector2 anchor) { vector2 lastdir = (last - anchor).normalized; vector2 currentdir = (current - anchor).normalized; float lastdot = vector2.dot(vector2.right, lastdir); float currentdot = vector2.dot(vector2.right, currentdir); float lastangle = last.y < anchor.y ? mathf.acos(lastdot) * mathf.rad2deg : -mathf.acos(lastdot) * mathf.rad2deg; float currentangle = current.y < anchor.y ? mathf.acos(currentdot) * mathf.rad2deg : -mathf.acos(currentdot) * mathf.rad2deg; last = current; return currentangle - lastangle; } } |
canvas设置如下:
脚本赋值如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/yiwei151/article/details/78716705