- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Unity3D游戏制作
开博写Unity的东西也写了好多,但大部分都是翻译,原创很少,接下来的一段日子,我会多写一些原创文章,介绍一些在项目中积累的简单实用的技术。
?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);
文档评论(0)