本文实例为大家分享了Unity相机移动之屏幕边缘检测的具体代码,供大家参考,具体内容如下
功能:
类似LOL 红警 相机移动方式。
鼠标移动到屏幕边缘,相机随之移动。
当然还有可以加亿一点点细节,比如鼠标指针变化,滚轮推进拉远视野,中键平移视野等。(没做)。
效果图:
这里做了可视化数据(可以看到限定的屏幕距离),线框内为检测的距离。
代码:
复制脚本,直接挂载相机上就可以用。
复制代码
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
131using UnityEngine; /// <summary> /// 相机边缘移动 /// </summary> [RequireComponent(typeof(Camera))] public class CameraScreenEdgeMove :MonoBehaviour { [Header("使用边缘移动")] public bool isUseMoveOnScreenEdge = true; /// <summary> /// 打开调试 /// </summary> public bool isDebugScreenEdge = true; //移动速度 public float moveSpeed = 1f; /// <summary> /// 距离屏幕边缘多远就开始移动相机 /// </summary> public int ScreenEdgeSize = 20; private bool MoveUp; private bool MoveDown; private bool MoveRight; private bool MoveLeft; private Rect RigthRect; private Rect UpRect; private Rect DownRect; private Rect LeftRect; private Material mat; private Vector3 dir = Vector3.zero; private void Start() { CreateLineMaterial(); } private void Update() { if (isUseMoveOnScreenEdge) { UpRect = new Rect(1f, Screen.height - ScreenEdgeSize, Screen.width, ScreenEdgeSize); DownRect = new Rect(1f, 1f, Screen.width, ScreenEdgeSize); LeftRect = new Rect(1f, 1f, ScreenEdgeSize, Screen.height); RigthRect = new Rect(Screen.width - ScreenEdgeSize, 1f, ScreenEdgeSize, Screen.height); MoveUp = (UpRect.Contains(Input.mousePosition)); MoveDown = (DownRect.Contains(Input.mousePosition)); MoveLeft = (LeftRect.Contains(Input.mousePosition)); MoveRight = (RigthRect.Contains(Input.mousePosition)); dir.z = MoveUp ? 1 : MoveDown ? -1 : 0; dir.x = MoveLeft ? -1 : MoveRight ? 1 : 0; transform.position = Vector3.Lerp(transform.position, transform.position + dir * moveSpeed,Time.deltaTime); } } void CreateLineMaterial() { if (!mat) { Shader shader = Shader.Find("Hidden/Internal-Colored"); mat = new Material(shader); mat.hideFlags = HideFlags.HideAndDontSave; mat.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); mat.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); mat.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off); mat.SetInt("_ZWrite", 0); } } void OnPostRender() { if (isUseMoveOnScreenEdge && isDebugScreenEdge) { DrawRect(UpRect, MoveUp, Color.cyan, Color.red); DrawRect(DownRect, MoveDown, Color.green, Color.red); DrawRect(LeftRect, MoveLeft, Color.yellow, Color.red); DrawRect(RigthRect, MoveRight, Color.blue, Color.red); } } private void DrawRect(Rect rect, bool isMouseEnter, Color normalColor, Color HeighLightColor) { if (isMouseEnter) { DrawScreenRect(rect, HeighLightColor); } else { DrawScreenRect(rect, normalColor); } } private void DrawScreenRect(Rect rect, Color color) { GL.LoadOrtho(); GL.Begin(GL.LINES); { mat.SetPass(0); GL.Color(color); GL.Vertex3(rect.xMin / Screen.width, rect.yMin / Screen.height, 0); GL.Vertex3(rect.xMin / Screen.width, rect.yMax / Screen.height, 0); GL.Vertex3(rect.xMin / Screen.width, rect.yMax / Screen.height, 0); GL.Vertex3(rect.xMax / Screen.width, rect.yMax / Screen.height, 0); GL.Vertex3(rect.xMax / Screen.width, rect.yMax / Screen.height, 0); GL.Vertex3(rect.xMax / Screen.width, rect.yMin / Screen.height, 0); GL.Vertex3(rect.xMax / Screen.width, rect.yMin / Screen.height, 0); GL.Vertex3(rect.xMin / Screen.width, rect.yMin / Screen.height, 0); } GL.End(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持靠谱客。
最后
以上就是威武帅哥最近收集整理的关于Unity相机移动之屏幕边缘检测的全部内容,更多相关Unity相机移动之屏幕边缘检测内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复