1. 坐标系的分类和转化:
1. — World Space(世界坐标):标准的D3D左手坐标系,旋转方向是左手法则包括法向量方向,背面剔除逆时针的。我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在transform.position可以获得该位置坐标。例如:MainCamera的坐标系是 (0,0,-10);
2. — Screen Space(屏幕坐标,鼠标坐标):以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),
3. — 绘制GUI界面的坐标系或NGUI:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。
4. — ndc space, ViewPort Space(视口坐标):视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,屏幕中心为[0.5,0.5],z值保留了透视投影中的正值但是值的大小是世界坐标系的值。不同于D3D中的[-1,-1,0]到[1,1,1],也不同于OGL中的[-1,-1,-1]到[1,1,1]。
世界坐标→屏幕坐标:
camera.WorldToScreenPoint(transform.position);
屏幕坐标→世界坐标
camera.ScreenPointToWorld(transform.position);
屏幕坐标→视口坐标:
camera.ScreenToViewportPoint(Input.GetTouch(0).position); 这样可以将屏幕坐标转换为视camera为场景中的camera对象。
视口坐标→屏幕坐标:
camera.ViewportToScreenPoint();
视口坐标→世界坐标:
camera.ViewportToWorldPoint();
2. 坐标获取(鼠标点击或者手指触摸位置点的坐标)
世界坐标点(3d游戏三维坐标)
通过射线技术获取三维坐标,代码如下:
Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast (ray, out hit))
{
//碰撞信息保存在hit中,如:
//hit.point 碰撞点
//hit.collider.gameObject //碰撞对象
}
屏幕坐标点(平面游戏二位坐标)
Input.mousePosition
3. U3D对象分类、组成和操作
分类:在U3d hierarchy 面板中出现的对象属于GameObject对象。通俗的说,就是当前场景(ps: 在游戏开发过程中,一个游戏可能有多个场景,通过切换场景达到切换关卡的效果)中出现的元素。组成场景的元素,也就是gameobject对象分为三类,一个是地形(2d开发中相当于背景),一个是角色模型(2d中相对于人物图片,术语为精灵),还一个是环境,如灯光、摄像机之类的。这与实际电影拍摄需要环境,演员,道具是一样的道理。
组成: 一个GameObject对象由一个或多个组件构成,比如,一个对象需要受重力加速度的影响,需要添加 RigidBody 组件,如果该gameobject需要受玩家控制,就需要Script组件,通过代码控制游戏对象。通过GetComponent
GameObject的基本操作:
1. GameObject.CreatePrimitive (PrimitiveType.xx); //创建一个u3d固有对象,如方块,球,胶囊体等等
2. GameObject.Instantiate (xx); //实例化一个自定义的对象,预制对象
3. GameObject.Find("xx") //查找一个游戏中存在的对象
4. GameObject.Destroy(xx); //摧毁游戏中存在的对象,还有一个重载 GameObject.Destroy(xx,delaytime),即延迟多久摧毁游戏对象。
4. 基本游戏对象的操作。
1. 直接操作
gameObject.transform.translate(Vector3.forward * Time.delaytime * speed); // 控制角色的前后左右移动
gameobject.transform.rotate(Vector3.up * Time.delayTime * speed); //控制角色的旋转,通过左手定则(大拇指指向(如: Vector.up 就是向上)标记的方向, 四个手指弯曲的方向就是旋转的方向)
gameobject.transform.localScale = new Vector3(x,y,z) 表示xyz三个方向是缩放
2.通过绑定Character Controller组件进行控制
CharacterController controller = gameobject.getComponent
//通过射线技术在鼠标点击的位置
Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast (ray, out hit))
{
//获取物体移动的向量 = 鼠标点击空间坐标 - 物体当前空间坐标
Vector direcPoint = Vector3.ClampMagnitude (hit.point - gameObject.transform.position, 0.3f);
controller.move(direcPoint );
}
3. 通过绑定Nav Mesh Agent组件进行空间寻址
通过此方式可以通过点击屏幕位置,角色对象会自动规划一条路线并进行移动,而制作重点在于bake(烘焙地图)。
1》 在菜单栏Window->Navigation中调出烘焙设置窗口,如下:
2.》 在Hierarchy窗口中选择相关的gameobject对象分别进行烘焙处理,比如说:(胶囊体为控制角色,长方体为静止物体,胶囊体不能从中穿过或从上跳过)
则需要对平面和长方体进行烘焙处理,保证能为胶囊体的运动自动开辟出一条路线,烘焙的关键在于Navigation Area参数的选择
Plane的烘焙设置:
Cube(长方体)
3》 在Capsule(胶囊体)上添加组件Script组件,选择相应的脚本文件进行控制。
Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast (ray, out hit))
{
GameObject hitObj = hit.collider.gameObject;
if (hitObj.name == "Plane")
{
Vector3 endpoint = hit.point;
agent.SetDestination (endpoint);
}
}
ps: Vector3 是一个三维对象类,既可以表示一个三维坐标点,又可以表示一个空间向量。
参考资料:http://blog.csdn.net/blues1021/article/details/49009951