文档详情

Unity3D场景角色制作.doc

发布:2017-09-17约1.9万字共46页下载文档
文本预览下载声明
Unity3D游戏制作 一:?3D横版场景的角色移动控制 一、导入场景,并在场景中加入TouchPlane TouchPlane为鼠标屏幕时的Raycast平面,如下图场景中的绿线部分。由于是横版场景,地面一般是平坦的,所以可以选择进行一个平面来作为计算鼠标投射交点。 之所以是绿线,是因为我disable该平面的MeshRender,该平面的Inspector视图如下: 值得注意的是: 1、 该平面使用Box Collider,而不用Mesh Collider,这样做的好处是可以减少碰撞的计算量; 2、 Tag设定为“Plane”,这是为了鼠标点击时的Raycast选取; 3、 Layer设定为“TouchPlane”,这样做也是为了以后进行Raycast鼠标选取操作。 二、设定角色Component 角色Inspector视图如下图所示: 一共四个Component:Animation、Rigidbody、Capsule Collider以及Move Controller。 Animation组件主要是角色的动作动画; Rigidbody组件是为了角色的移动,这个我在后面会解释,这里还有一点需要注意就是不使用“Use Gravity”,这样做一是因为角色只在地面上跑(如果你的游戏需要角色有跳跃功能,那么应该使用“Use Gravity”,二是可以在不影响效果的同时,减少模型的物理计算); Capsule Collider是碰撞器,与该文章所介绍移动内容没有关系; Move Controller是自定义的角色移动控制组件,其中MoveController.cs为其对应脚本。 三、如何移动角色 流程可设定如下: 1、 鼠标点击地面,通过屏幕位置来计算出其所在三维空间中角色移动的目的位置。 2、 将角色从当前位置移动到鼠标点击位置 这样,我们就根据上述两个步骤来完成人物的移动操作。 (1) 鼠标拾取操作 [csharp] view plaincopyprint? void?Move()?? {?? ????if(Input.GetMouseButtonDown(0))?? ????{?? ????????//?m_layerMask是指TouchPlane的layer数,这也是为什么之前在设定//TouchPlane时要设定其layer的原因,这样做是为了方便鼠标拾取 ?? ????????m_layerMask?=?1??8;?? ????????//?根据鼠标在屏幕空间的位置计算射线 ?? ????????m_ray?=?Camera.main.ScreenPointToRay(Input.mousePosition);?? ????????//?进行三维场景中的射线求交 ?? ????????if?(Physics.Raycast(m_?ray,?out?m_?hitInfo,?100,?m_layerMask))?? ????????{?? ????????????//?如果拾取的tag为“Plane”的话 ?? ????????????if?(m_hitInfo.transform.tag?==?Plane)?? ????????????{?? ????????????????//?将角色朝向目标点 ?? ????????????????LookatTargetPos(m_?hitInfo.point);?? ????????????}?? ????????}?? ????}?? }?? void Move() { if(Input.GetMouseButtonDown(0)) { // m_layerMask是指TouchPlane的layer数,这也是为什么之前在设定//TouchPlane时要设定其layer的原因,这样做是为了方便鼠标拾取 m_layerMask = 1 8; // 根据鼠标在屏幕空间的位置计算射线 m_ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 进行三维场景中的射线求交 if (Physics.Raycast(m_ ray, out m_ hitInfo, 100, m_layerMask)) { // 如果拾取的tag为“Plane”的话 if (m_hitInfo.transform.tag == Plane) { // 将角色朝向目标点 LookatTargetPos(m_ hitInfo.point); } } } } ? (2) 角色移动操作 [csharp] view plaincopyprint? void?LookatT
显示全部
相似文档