找回密码
 立即注册
查看: 6853|回复: 72

[基础] Unity3D游戏制作之3D横版场景的角色移动控制

[复制链接]
发表于 2013-4-1 22:02 | 显示全部楼层 |阅读模式
资源信息 Tutorial Information
教程名称: Unity3D游戏制作之3D横版场景的角色移动控制(发帖教程)
适用引擎:   (适用引擎,为空默认为Unity)
教程语种: 中文
教程等级: 1
教程格式: 图文(请用IE9以上浏览器访问本版块)
教程作者: 转载自互联网 (如有问题请短消息联系作者或发表回复)
下载地址: (兑换积分)
点击查看原图
美丽分割线
本系列文章由 Amazonzx 编写,欢迎转载,转载请注明出处。
http://blog.csdn.net/amazonzx/article/details/7824112

开博写Unity的东西也写了好多,但大部分都是翻译,原创很少,接下来的一段日子,我会多写一些原创文章,介绍一些在项目中积累的简单实用的技术。

一、导入场景,并在场景中加入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 plaincopy


  • 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 plaincopy


  • void LookatTargetPos(Vector3 tarPos)  
  • {  
  •     // 判断当前角色是否可以移动  
  •     if (!m_bWalk)  
  •         return;  
  •     // 记录下目标点  
  •     m_targetPos = new Vector3(tarPos.x, tarPos.y, tarPos.z);  
  •     // 将角色朝向目标点  
  •     transform.LookAt(m_targetPos);  
  •     // 改变移动State  
  •     m_bMoving = true;  
  • }  


MoveController.cs中的Update函数如下:
[csharp] view plaincopy


  • void Update ()   
  • {  
  •     Move();  
  •     // 如果可以移动的话  
  •     if (m_bMoving)  
  •     {  
  •         // 改变角色的Animation  
  •         animation.CrossFade("Run");  
  •         // 设定rigidbody的速度,由于之前已经将角色朝向目标点,所以现在的速度朝向即为transform.forward  
  •         rigidbody.velocity = transform.forward * 8.0f;  
  •       
  •         // 判断角色是否该停止移动  
  •         if (Vector3.Distance(transform.position, m_targetPos) < 0.1f)  
  •         {  
  •             rigidbody.velocity = Vector3.zero;  
  •             m_bMoving = false;  
  •             animation.CrossFade("Idle");  
  •         }  
  •     }  
  • }  

四、实现效果
通过以上设置即可控制角色在横版场景中的移动,效果图如下:

五、小结
1、该做法只适合平面的地表,如果是有起伏的,则需要使用Navmesh或其他trick来解决。
2、该做法并没有让角色与地面去做碰撞,因为本身是平面的,所以直接限定其y值,不让其使用重力作用,这样的好处可以避免不必要的物理计算。
3、角色的移动可以不用rigidbody来搞定,一般的做法还是通过Time.deltatime来一帧一帧来计算步长、移动物体,这里只是给出另外一种方法,原来其实是一样的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2013-4-21 18:38 | 显示全部楼层
謝謝分享
對不會程式的我來說
實在是一大福音
发表于 2013-5-10 17:01 | 显示全部楼层
太好了 学习学习学习
发表于 2013-6-1 16:49 | 显示全部楼层
{:5_387:} 不错。。
发表于 2016-7-21 23:14 | 显示全部楼层
22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy22sy
发表于 2016-10-23 17:56 | 显示全部楼层
好东西,值得拥有
发表于 2016-10-24 17:19 | 显示全部楼层
sadsadsadsadsa
发表于 2016-11-25 21:23 | 显示全部楼层

感谢楼主的无私分享!
发表于 2016-12-5 14:58 | 显示全部楼层
好的 回复一个
发表于 2017-4-10 20:18 | 显示全部楼层
好帖就是要顶
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-3-29 07:21 , Processed in 0.123007 second(s), 32 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表