Unity3D封装了一个非常好用的组件来实现第一人称视角与第三人称视角游戏开发,我们称他为角色控制器组件,几乎不用写一行代码就可以完成一切的操作,神奇吧。使用它的方法如下,首先打开Unity游戏引擎编辑器,然后在Project视图中右键选择Import Package -> Charactr Controller(角色控制器)把它导入我们的工程中。如下图所示,第一人称与第三人称的组建已经加入Project视图中。3rd Person Controller 表示第三人称控制器,First Person Controller表示第一人称控制器。

如下图所示,我们将FirstPerson Controller拖拽入Hierarchy(层次视图)中。由于角色控制器是具有一定物理引擎的,所以一定要将它放在地形或面对象之上,否则当它接收物理效果时发现地面没有东西支撑它,它就会掉下去。然后运行游戏你就会发现和CS中的第一人称效果非常相像, W、S、A、D移动人物行走,移动鼠标更改行走的方向,空格键人物会跳跃。

第一人称视角的实现原理是在游戏场景中创建了一个胶囊体的游戏对象,并且给胶囊体对象身上绑定了一个摄像机,摄像机对象如下图所示,它绑定在”Person Controller”中。这时场景中默认的摄像机就会失效,可以直接删掉默认的摄像机。通过按键控制这个胶囊体移动,通过鼠标修改胶囊体的朝向,此时你就会发现第一人称视角已经完全实现,目前为止我们不需要编写一行代码。目前场景中的天空盒子我是使用skyBox组件绑定在摄像机中,因为第一人称视角的摄像机对象在”Person Controller”中,所以需要将SkyBox组件绑定在这个摄像机中,如果绑定在默认摄像机中那么你将不会看到天空的效果。

(点击图片查看大图)

下面我们在看看第三人称视角,如下图所示,在Project视图中将3rd Person Controller拖拽入Hierarchy视图中。第三人称视角需要使用我们原有的摄像机,如果刚刚将摄像机的删掉的话。在Hierarchy视图中点击Creat->Camera 即可。然后选择摄像机,在右侧Inspector视图中设置它的tag为MainCamera,如下图所示。最后在Hierarchy视图中选择3rd Person Controller,在右侧Inspector视图中将Third Person Camera 脚本的 Camera Transform 变量绑定上刚刚创建的主摄像机,此时运行游戏后以第三人称视角移动主角行走与跳跃,摄像机永远都会在跟随在后面除非修改角色控制器组件中默认提供的源码,源码都在右侧监测面板视图中直接点开就可以查看。

(点击图片查看大图)

下面我们学习角色控制器组件在其它模型之间的应用。首先在Hierarchy视图中创建两个Cube(立方体对象) 命名为:Cube0(发出碰撞的对象)Cube1(接收碰撞的对象),然后在Hierarchy视图中选择Cube0对象,接着Unity导航菜单栏中选择Component(组件)-Character->选择任意一个角色控制属性。 补充一句,角色控制器组件一定要在Project视图中导入,否则这里将无法绑定组件。角色控制器组件因为与碰撞组件相互冲突,所以添加角色控制器组建后Collider组件就会消失。下面我们实现一段简单得代码,使用添加过角色控制器组件的Cube0 去碰撞未添加角色控制器组件的Cube1。

C#

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

usingUnityEngine;

usingSystem.Collections;

publicclassTest:MonoBehaviour{

//主动碰撞的对象名称

stringcastName=null;

//接收碰撞的对象名称

stringreceiveName=null;

voidOnGUI()

{

if(castName!=null&&receiveName!=null)

{

//设置显示的颜色为黑色

GUI.color=Color.black;

//显示主动碰撞的对象 与接收碰撞的对象名称

GUI.Label(newRect(100,100,200,30),"主动碰撞的对象名称"+castName);

GUI.Label(newRect(100,200,200,30),"接收碰撞的对象名称"+receiveName);

}

}

//角色控制器组件在与具有Collider组件对象之间的碰撞

voidOnControllerColliderHit(ControllerColliderHithit)

{

//得到接收碰撞名称

GameObjecthitObject=hit.collider.gameObject;

//当它不是地面时间

if(!hitObject.name.Equals("Terrain"))

{

//得到主动碰撞的对象 与接收碰撞的对象名称

castName=gameObject.name;

receiveName=hitObject.name;

}

}

}

将上面这段代码绑定在Cube0中,运行游戏后W、A、S、D按键来控制Cube1立方体移动。当Cube0与Cube1发生碰撞时,程序将进入方法OnControllerColliderHit(),通过参数就可以得到接收碰撞的游戏对象也就是Cube1对象,而gameObject就是当前主动发生碰撞的Cube1。如下图所示,当两个立方体碰撞时使用GUI已经将碰撞的信息打印出来。

接着我在说说刚体组件,默认在Unity中创建的模型是不具备接收物理引擎的,除非给模型添加刚体组件或角色控制器组件。我们先说说刚体,还用奋斗的小鸟来举例子。发射小鸟以后,小鸟以一个抛物线轨迹去撞击物体,发生碰撞后被碰撞的物体会根据小鸟撞击的角度以及力度发生不同的物理效果,并且几乎是完全模拟真实的物理引擎。但是这种物理引擎的效果不能绑定在比如RPG游戏的主角身上。原因很简单,因为刚体所添加的物理引擎太过于真实以至于会影响用户的对主角的操作,举个例子比如用户在控制主角移动时他碰撞到质量较大的物体,根据真实的物理引擎会被这个物体的反弹力把主角反弹回原位。但是这个是不符合逻辑的,因为刚体组件太过于物理话了,所以我们需要给主角添加角色控制器组件,它操作起来比较灵活,更容易让我们操作主角。

下面我们给Cube1对象绑定刚体组件,选择Cube1对象然后在导航菜单栏中选择Component->physics ->Rigidbody(刚体)。我们看看下面这段代码,使用添加了角色控制器组件的Cube0 去碰撞添加刚体组件的Cube1,当他生碰撞时计算一下Cube0碰撞Cube1时的碰撞角度向量,然后通过刚体向他施加一个力把它推开。

C#

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

usingUnityEngine;

usingSystem.Collections;

publicclassTest:MonoBehaviour{

//角色控制器组件在与具有Collider组件对象之间的碰撞

voidOnControllerColliderHit(ControllerColliderHithit)

{

//判断碰撞的对象是否具备刚体组件

GameObjecthitObject=hit.collider.gameObject;

Rigidbodyrigidbody=hitObject.rigidbody;

if(rigidbody!=null&&!rigidbody.isKinematic)

{

//地面也具备刚体组件,这里判断一下

if(!hitObject.name.Equals("Terrain"))

{

rigidbody.AddForce(newVector3(hit.moveDirection.x,0,hit.moveDirection.z)*10);

}

}

}

}

也可以将同样的脚本直接绑定在第三人称的角色控制器组件中。如下图所示,主角移动将周围的箱子都推开了。

总的来说角色控制器组件适用于 既需要感应物理引擎的支持但是又不能完全依赖与物理引擎,需要自己代码去编写一些东西的模型,所以非常适合游戏中主角对象的使用。雨松MOMO祝大家学习愉快,哇咔咔。

最后编辑:2012-05-09作者:雨松MOMO

专注移动互联网,Unity3D游戏开发

捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

unity3d人物跳_Unity3D研究院之角色控制器组件研究(二十二)相关推荐

  1. Unity3D基础38:角色控制器组件

    前文:https://blog.csdn.net/Jaihk662/article/details/87906156(Input控制面板) 一.CharacterController角色控制器 为什么 ...

  2. unity3d 人物对话_unity3d实现插件快速开发对话系统

    作为一款RPG游戏,对话系统的开发是必不可少的.不对,现在几乎什么游戏都需要对话系统,这点可是毋庸置疑的.今天我给大家介绍一款对话插件,叫做"Localized Dialogs Cutsce ...

  3. unity3d 工程原理_Unity3D研究院之两个游戏工程资源同步问题(八十六)

    有的公司是不想让美术和策划有程序权限的,但是Unity在处理团队协作上不太理想,这就造成需要把美术工程的资源同步到程序工程里.目前我有两个方法,各有利弊. 1.由美术或者策划同步 Unity提供了.u ...

  4. Unity3d之角色控制器

    我们要控制角色的移动,可以全部细节都由自己来实现.控制角色模型的移动,同时移动摄影机,改变视角.当然Unity也提供了一些组件,可以让我们做更少的工作,实现我们所期望的功能.今天我们就一起系统来学习相 ...

  5. 【Unity游戏开发教程】零基础带你从小白到超神16——四种方法控制人物移动之角色控制器

    角色控制器 控制人物移动的四种方式 直接修改组件位置 去资源商城下载角色控制系统成品 unity提供的角色控制器组件 Character Controller API 通过物理系统自己做 拓展 常用的 ...

  6. Unity3D 角色控制器 Character Controller

    添加组件 角色控制器组件介绍 [Slope Limite]爬坡角度限制(如图限制爬坡角度为10度,超过10度的斜坡无法前进) [Step Offset]脚步长度限制 [Skin Width]和胶囊体相 ...

  7. unity3d鸿蒙系统支持,Unity3D之处理角色控制器实现上坡爬坡减速

    按照正常情况游戏中角色在上坡爬坡的时候速度应该减慢,可是角色控制器组件没有帮我们做这个判断,刚好最近工作中需要做这个功能, 我就用勾股定理的法则来解决这个问题.如下图所示,当角色在爬坡的时候,角色控制 ...

  8. Unity手游之路lt;七gt;角色控制器

    我们要控制角色的移动,能够所有细节都由自己来实现.控制角色模型的移动,同一时候移动摄影机,改变视角.当然Unity也提供了一些组件,能够让我们做更少的工作,实现我们所期望的功能.今天我们就一起系统来学 ...

  9. Unity3D游戏开发之仿仙剑奇侠传角色控制效果

    在上一篇文章中,我们从Unity3D为我们提供的相机原型实现了非编码式的小地图,如果结合GUI在这个小地图下面绘制一些背景贴图,相信整体的效果会更好一些.博主希望这个问题大家能够自己去做更深入的研究, ...

最新文章

  1. UGUI的优点新UI系统二 直观、易于使用
  2. JSP页面退出时清除会话Session
  3. 神经网络与原子轨道线性组合算法LCAO
  4. Application ProvidedAar 完结篇
  5. CruiseControl中应用NCover和NCoverExplore
  6. hdfs读写流程_一文读懂HDFS分布式存储框架分析
  7. 关于页面的多种自适应布局——两列布局
  8. C++之泛型编程(模板)
  9. notempty注解属于哪个依赖_Spring框架 之@Valid注解的使用(嵌套类型的效验)
  10. 信息学奥赛一本通 1177:奇数单增序列 | OpenJudge NOI 1.10 02:奇数单增序列
  11. 生产是什么意思_俗话说:“牛遇无春年,出力好耕田”是啥意思?有什么道理?...
  12. oracle --- to_date('2015','yyyy')
  13. atitit.团队建设总结fx O622
  14. html项目答辩ppt范文,论文答辩ppt 论文ppt答辩模板|论文答辩ppt范文6页
  15. 电脑软件:主流的压缩软件对比,看完你就会选择了
  16. 分布式操作系统 - 4.分布式通信管理
  17. 【CVPR 2021】 Lifelong Person Re-Identification via Adaptive Knowledge Accumulation
  18. 计算机计划实施800字,大学计划书范文800字3篇
  19. 计算机基本操作评课记录,《Word的基本操作》评课稿--李存业
  20. 软件定义的网络(中)

热门文章

  1. 解决导出CSV后在EXCEL打开纯数字前面0丢失问题
  2. springboot集成shiro 前后端分离 统一处理shiro异常
  3. Java的各种中文乱码解决方法
  4. JPA和Hibernate-条件与JPQL或HQL
  5. 是==和!=相互依赖?
  6. 在同一窗口和同一选项卡中打开URL
  7. linux查看绑定ipv6的端口号,[原创]如何在windows和linux绑定IPV6
  8. android对话框合集AlertDialog
  9. activiti(7.0)排他网关
  10. Freemarker生成静态化文件