转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持!
开篇废话:
在大学时稍微自学过一段时间Unity3D,虽然现在在做安卓,但一直对游戏开发很感兴趣,所以平时偶尔有空也会稍微看看,不过水平还是未入门菜鸟级的。
下面这个demo是看了雨松MOMO大神所写的几篇基础文章后,写的一个练习demo,用来展示简易的3D图表。
这个Demo非常初级,纯粹是为了练习知识点,但是所应用到的知识点非常基础,非常重要,适合初学者学习。截图如下:
简介:
这个Demo可以分为4个部分
第一部分——建立3D坐标系:
外框首先由四个平面所围成的一个“3D坐标系”,和X、Y、Z三个“坐标”组成。
1.四个平面
这四个平面所用的就是系统自带的cube,创建并调整cube的大小和方向组成上面的形状。
2.创建坐标系prefab
创建一个预设,并将左平面,右平面和后平面添加到下平面中最后添加到预设里,这样他们就变成了一个整体。如下图所示:
3.调整prefab在世界中的位置和他的scale
由于要设立坐标点,所以需要使刚才建立的坐标系的零点对应世界坐标的零点。
在本例中:假设每个单位长度为1,X坐标需要分成12份(12个月)坐标系scale的x值为24(每两份代表一个刻度)。Y轴代表百分比,分为5份(每份一个刻度)。Z轴同理。
通过上面的3个步骤,3D坐标系的样子已经出来了,下面开始为这个坐标系添加“刻度名称”。
第二部分——为坐标添加刻度名称:
刻度名称使用两个知识点:
1.世界坐标转换为屏幕坐标:
添加刻度名称其实就是将世界坐标的坐标值(因为我们已经在上一步中将坐标系和世界坐标同步了)转换为屏幕坐标值。
2.使用GUI.Label写出坐标名称:
通过刚才算出的屏幕坐标处使用GUI.Label函数写出当前坐标点的名称。
下面是本例中这个方法的代码:
- // isY代表是不是Y轴
- void drawCoordinate (Vector3 point, string name, bool isY) {
- // 将世界坐标转换为屏幕坐标
- Vector2 position = camera.WorldToScreenPoint (point);
- position = new Vector2 (position.x, position.y);
- // 设置刻度的大小和颜色
- Vector2 nameSize = GUI.skin.label.CalcSize (new GUIContent(name));
- GUI.color = Color.yellow;
- // 根据X,Y轴的不同加上适当偏移量画出刻度
- if (isY) {
- GUI.Label(new Rect(position.x-nameSize.x-coordOffset ,Screen.height-position.y,nameSize.x,nameSize.y), name);
- }
- else {
- GUI.Label(new Rect(position.x-nameSize.x ,Screen.height-position.y,nameSize.x,nameSize.y), name);
- }
- }
- void OnGUI()
- {
- drawCoordinate (new Vector3 (0 , 0, 0), "0.00%", true);
- drawCoordinate (new Vector3 (2 , 0, 0), "Jan", false);