Unity3D的几种坐标系_第1页
Unity3D的几种坐标系_第2页
Unity3D的几种坐标系_第3页
Unity3D的几种坐标系_第4页
Unity3D的几种坐标系_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的。transform.position可以获得该位置坐标。该文章出自【狗刨学习网】Screen Space(屏幕坐标,鼠标坐标):以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡量的。注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标,手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕坐标。ViewPort

2、Space(视口坐标):视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,Z的位置是以相机的世界单位来衡量的。(用的不多,反正我暂时没有用到呵呵)绘制GUI界面的坐标系:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。 LineRender坐标:以屏幕中心为原点,向上向右增加。世界坐标屏幕坐标:camera.WorldToScreenPoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。屏幕坐标视

3、口坐标:camera.ScreenToViewportPoint(Input.GetTouch(0).position);这样可以将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。视口坐标屏幕坐标:camera.ViewportToScreenPoint(); 视口坐标世界坐标:camera.ViewportToWorldPoint(); 案例1在鼠标点击的位置上绘制一张图片出来(关于绘制GUI界面坐标系与屏幕坐标系之间的关系)。1. using UnityEngine;2. using System.Collections;3.4. public class Screen

4、ToGUI : MonoBehaviour 5.6. / Use this for initialization7. void Start () 8. 9. 10. 11. / Update is called once per frame12. void Update () 13. 14. 15. 16. /图片17. public Texture img; 18. /储存鼠标的位置坐标 19. private Vector2 pos;20. void OnGUI()21. 22. /鼠标左击,获取当前鼠标的位置 23. if (Input.GetMouseButton(0)24. 25.

5、pos = Input.mousePosition; /屏幕坐标26. 27. /绘制图片,屏幕坐标和GUI界面坐标只在Y轴上方向相反,只要被Screen.height减就可以互相转换。 28. GUI.DrawTexture(new Rect(pos.x, Screen.height - pos.y, 100, 100), img);29. 30.31. 复制代码 案例2角色头顶的名字(世界坐标转GUI界面坐标)先世界坐标转屏幕坐标,再屏幕坐标转GUI界面坐标代码如下:1. using UnityEngine;2. using System.Collections;3.4. public c

6、lass Blood : MonoBehaviour 5. public static float ScaleWidht = 0f;6. public static float ScaleHeight = 0f;7. private Rect _drawRect = new Rect();8. public float Width = 0f;9. public float Height = 10f;10. public const float DesignStageWidth = 800;11. public const float DesignStageHeight = 480;12.13.

7、 public Vector2 pos2;14. public float size_z;15. / Use this for initialization16. void Start () 17. ScaleWidht = Screen.width / DesignStageWidth;18. ScaleHeight = Screen.height / DesignStageHeight;19. Height = 2f;20.21. size_z = transform.gameObject.collider.bounds.size.z;22. 23.24.25. / Update is c

8、alled once per frame26. void Update () 27. /世界坐标转换到屏幕坐标28. print(transform.forward);29. pos2 = Camera.main.WorldToScreenPoint(transform.position + transform.forward * (size_z / 2);30. /计算角色头顶坐标31. pos2 = new Vector2(pos2.x, Screen.height- pos2.y - Height);32.33.34.35. /Vector3 worldPosition = new Ve

9、ctor3(transform.position.x, transform.position.y + Height, transform.position.z);36. /worldPosition = Camera.mainCamera.WorldToScreenPoint(worldPosition);37. /_drawRect = new Rect(worldPosition.x - 100 * ScaleWidht) / ScaleWidht, (Screen.height - worldPosition.y - 50 * ScaleHeight) / ScaleHeight, 20

10、0, 50);38. 39.40. void OnGUI()41. 42. /GUILayout.BeginArea(_drawRect);43. / GUILayout.Label(=哈哈=);44. /GUILayout.EndArea();45.46. GUI.Label(new Rect(pos2.x, pos2.y, 100, 50), =BETTER=);47. 48. 复制代码 案例3类似屏幕解锁功能的实现(屏幕坐标转换为世界坐标) 首先是创建LineRenderer。GameObject - Create Empty -更名为“LineRendererObj”,给LineRen

11、dererObj添加“Line Renderer”组件,Component -Effects -Line Renderer;将它的Positions 的size 设置为0 接下来是代码touch.CS:1.2. using UnityEngine;3. using System.Collections;4. using System.Collections.Generic;5.6. public class touch : MonoBehaviour 7. private Event e;8.9. public Texture2D Point;10. public Color c1 = Col

12、or.yellow;11. public Color c2 = Color.red;12. public int lengthOfLineRenderer;13. public GameObject LineRendererPrefab;14.15. private LineRenderer lineRenderer;16. / 17. / 保存创建的Line Renderer18. / 19. private List lineRendArray =new List();20.21. private Vector3 screenPoint;22. private Vector3 scanPo

13、s;23.24. private Color color;25.26. / 27. / 记录宫格所在GUI位置28. / 29. public List AreaRect = new List();30. / 31. / 记录宫格中心点32. / 33. public List CenterPointList = new List();34. / 35. / 宫格标签36. / 37. public int RectFlag;38. / 39. / 记录正确的滑动顺序40. / 41. public List KeyOrder = new List();42. / 43. / 记录玩家滑动顺序

14、44. / 45. public List PlayerKeyOrder = new List();46.47. / 48. / 判断开始鼠标位置是否可画49. / 50. public bool CheckStartRect=false;51.52. / 53. / 判断结束鼠标位置是否可画54. / 55. public bool CheckEndRect = false;56.57. / 58. / 行数59. / 60. public int Row = 4;61. / 62. / 列数63. / 64. public int Column = 4;65.66. void Start(

15、)67. 68. e = Event.current;69.70. scanPos = LineRendererPrefab.transform.position;71. lineRenderer = (LineRenderer)LineRendererPrefab.GetComponent(LineRenderer);72. lineRenderer.material = new Material(Shader.Find(Particles/Additive);73. lengthOfLineRenderer = 0;74. lineRenderer.SetColors(c1, c2);75

16、. lineRenderer.SetWidth(0.7F, 0.7F);76. lineRenderer.SetVertexCount(0);77.78. color = new Color8;79. color0 = Color.yellow;80. color1 = Color.blue;81. color2 = Color.cyan;82. color3 = Color.gray;83. color4 = Color.green;84. color5 = Color.grey;85. color6 = Color.magenta;86. color7 = Color.red;87.88.

17、 for (int RowCount = 0; RowCount Row; RowCount+)89. 90. for (int columnCount = 0; columnCount Column; columnCount+)91. 92. Rect IconRect = new Rect(columnCount * Screen.width / Column + Screen.width / Column / 2 - Point.width / 2, RowCount * Screen.height / Row + Screen.height / Row / 2 - Point.heig

18、ht / 2, Point.width, Point.height);93. AreaRect.Add(IconRect);94.95. Vector2 CenterP = IconRect.center;/得到每个的中心点96. CenterPointList.Add(CenterP);97. 98. 99. 100.101. void OnGUI()102. 103. e = Event.current;104. for (int RowCount = 0; RowCount Row; RowCount+)105. 106. for (int columnCount = 0; column

19、Count Column; columnCount+)107. 108. Rect IconRect = new Rect(columnCount * Screen.width / Column + Screen.width / Column / 2 - Point.width / 2, RowCount * Screen.height / Row + Screen.height / Row / 2 - Point.height / 2, Point.width, Point.height);109. GUI.Label(IconRect, Point);110. 111. 112. 113.

20、114. void Update()115. 116. if (e != null)117. 118. if (e.type = EventType.MouseDown)119. 120. for (int i = 0; i AreaRect.Count; i+)121. 122. if (AreaRecti.Contains(new Vector3(Input.mousePosition.x, Screen.height - Input.mousePosition.y, Input.mousePosition.z)123. 124. CheckStartRect = true;125. pr

21、int(Contains);126. PlayerKeyOrder.Add(i);127. RectFlag = i;128. break;129. 130. else131. 132. CheckStartRect = false;133. 134. 135.136. if (CheckStartRect)137. 138. print(MouseDown_);139.140. /Vector3 curPosition = mousePToLineRendererP();141. Vector3 curPosition = centerPToLineRendererP(RectFlag);1

22、42. GameObject newObj;143. newObj = (GameObject)Instantiate(LineRendererPrefab, LineRendererPrefab.transform.position, LineRendererPrefab.transform.rotation);144. lineRenderer = (LineRenderer)newObj.GetComponent(LineRenderer);145.146. int n = Random.Range(1, 8);147. c1 = colorn - 1;148. n = Random.R

23、ange(1, 8);149. c2 = colorn - 1;150. lineRenderer.SetColors(c1, c2);151.152. lineRenderer.SetVertexCount(1);153. lineRenderer.SetWidth(0.7F, 0.7F);154. lineRenderer.SetPosition(0, curPosition);155. lineRendArray.Add(lineRenderer);156. lengthOfLineRenderer+;157. 158. 159.160. if (e.type = EventType.M

24、ouseDrag&CheckStartRect)161. 162. print(MouseDrag_);163. Vector3 curPosition = mousePToLineRendererP();164. DrawRenderLine(lineRendArraylengthOfLineRenderer - 1, curPosition);165. 166.167. if (e.type = EventType.MouseUp & CheckStartRect)168. 169. for (int i = 0; i AreaRect.Count; i+)170. 171. if (Ar

25、eaRecti.Contains(new Vector3(Input.mousePosition.x, Screen.height - Input.mousePosition.y, Input.mousePosition.z)172. 173. CheckEndRect = true;174. PlayerKeyOrder.Add(i);175. RectFlag = i;176. print(EndContains);177. break;178. 179. else180. 181. CheckEndRect = false;182. 183. 184.185. if (CheckEndR

26、ect)186. 187. Vector3 curPosition = centerPToLineRendererP(RectFlag);188. DrawRenderLine(lineRendArraylengthOfLineRenderer - 1, curPosition);189. 190. else191. 192. PlayerKeyOrder.RemoveAt(PlayerKeyOrder.Count - 1);193. Destroy(lineRendArraylengthOfLineRenderer - 1.gameObject);194. /lengthOfLineRend

27、erer-;195. 196.197. 198. 199. 200.201. void DrawRenderLine(LineRenderer line, Vector3 vect3)202. 203. Vector3 newPos = vect3;204. line.SetVertexCount(2);205.206. line.SetPosition(1, newPos);207. print(new point: + newPos);208. 209.210. /public Vector2 RectCenterPoint(Rect AreaRect) /计算一个Rect的中心点211.

28、 /212. / Vector2 CenterPoint=Vector2.zero;213. / print(Rect:+AreaRect);214. / CenterPoint.x=AreaRect.xMin+AreaRect.width/2;215. 216. / CenterPoint.y=AreaRect.yMin+AreaRect.height/2;217. / print(CenterPoint:+CenterPoint);218. / return CenterPoint;219. /220.221. / 222. / 鼠标所在位置转换为LineRenderer的位置223. / 22

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论