unity3d第一人称视角角和人物运动不一致unity3d

您所在的位置: &
Unity3D研究之角色控制器组件研究
Unity3D研究之角色控制器组件研究
Unity3D 封装了一个非常好用的组件来实现第一人称视角与第三人称视角游戏开发,我们称他为角色控制器组件,几乎不用写一行代码就可以完成一切的操作,神奇吧。
使用它的方法如下,首先打开Unity游戏引擎编辑器,然后在Project视图中右键选择Import Package -& Charactr Controller(角色控制器)把它导入我们的工程中。如下图所示,第一人称与第三人称的组建已经加入Project视图中。3rd Person Controller 表示第三人称控制器,First Person Controller表示第一人称控制器。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' title="屏幕快照
下午1.20.29" alt="" src="/files/uploadimg/4260.png" />
如下图所示,我们将FirstPerson Controller拖拽入Hierarchy(层次视图)中。由于角色控制器是具有一定物理引擎的,所以一定要将它放在地形或面对象之上,否则当它接收物理效果时发现地面没有东西支撑它,它就会掉下去。然后运行游戏你就会发现和CS中的第一人称效果非常相像, W、S、A、D移动人物行走,移动鼠标更改行走的方向,空格键人物会跳跃。 &
第一人称视角的实现原理是在游戏场景中创建了一个胶囊体的游戏对象,并且给胶囊体对象身上绑定了一个摄像机,摄像机对象如下图所示,它绑定在&Person Controller&中。这时场景中默认的摄像机就会失效,可以直接删掉默认的摄像机。通过按键控制这个胶囊体移动,通过鼠标修改胶囊体的朝向,此时你就会发现第一人称视角已经完全实现,目前为止我们不需要编写一行代码。目前场景中的天空盒子我是使用skyBox组件绑定在摄像机中,因为第一人称视角的摄像机对象在&Person Controller&中,所以需要将SkyBox组件绑定在这个摄像机中,如果绑定在默认摄像机中那么你将不会看到天空的效果。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' width="475" height="280" title="屏幕快照
下午1.44.21" alt="" src="/files/uploadimg/4261.png" />
下面我们在看看第三人称视角,如下图所示,在Project视图中将3rd Person Controller拖拽入Hierarchy视图中。第三人称视角需要使用我们原有的摄像机,如果刚刚将摄像机的删掉的话。在Hierarchy视图中点击Creat-&Camera 即可。然后选择摄像机,在右侧Inspector视图中设置它的tag为MainCamera,如下图所示。最后在Hierarchy视图中选择3rd Person Controller,在右侧Inspector视图中将Third Person Camera 脚本的 Camera Transform 变量绑定上刚刚创建的主摄像机,此时运行游戏后以第三人称视角移动主角行走与跳跃,摄像机永远都会在跟随在后面除非修改角色控制器组件中默认提供的源码,源码都在右侧监测面板视图中直接点开就可以查看。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' width="541" height="289" title="屏幕快照
下午2.24.52" alt="" src="/files/uploadimg/4262.png" />
下面我们学习角色控制器组件在其它模型之间的应用。首先在Hierarchy视图中创建两个Cube(立方体对象) 命名为:Cube0(发出碰撞的对象)Cube1(接收碰撞的对象),然后在Hierarchy视图中选择Cube0对象,接着Unity导航菜单栏中选择Component(组件)-Character-&选择任意一个角色控制属性。 补充一句,角色控制器组件一定要在Project视图中导入,否则这里将无法绑定组件。角色控制器组件因为与碰撞组件相互冲突,所以添加角色控制器组建后 Collider组件就会消失。下面我们实现一段简单得代码,使用添加过角色控制器组件的Cube0 去碰撞未添加角色控制器组件的Cube1。
[代码]java代码:
using UnityE
using System.C
public class Test : MonoBehaviour {
//主动碰撞的对象名称
string castName =
//接收碰撞的对象名称
string receiveName =
void OnGUI ()
if(castName!= null && receiveName !=null)
//设置显示的颜色为黑色
GUI.color = Color.
//显示主动碰撞的对象 与接收碰撞的对象名称
GUI.Label(new Rect(100,100,200,30),&主动碰撞的对象名称&+castName);
GUI.Label(new Rect(100,200,200,30),&接收碰撞的对象名称&+receiveName);
//角色控制器组件在与具有Collider组件对象之间的碰撞
void OnControllerColliderHit(ControllerColliderHit hit)
//得到接收碰撞名称
GameObject hitObject = hit.collider.gameO
//当它不是地面时间
if(!hitObject.name.Equals(&Terrain&))
//得到主动碰撞的对象 与接收碰撞的对象名称
castName = gameObject.
receiveName = hitObject.
将上面这段代码绑定在Cube0中,运行游戏后W、A、S、D按键来控制Cube1立方体移动。当Cube0与Cube1发生碰撞时,程序将进入方法 OnControllerColliderHit(),通过参数就可以得到接收碰撞的游戏对象也就是Cube1对象,而gameObject就是当前主动发生碰撞的Cube1。如下图所示,当两个立方体碰撞时使用GUI已经将碰撞的信息打印出来。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' title="屏幕快照
下午4.43.07" alt="" src="/files/uploadimg/4263.png" />
接着我在说说刚体组件,默认在Unity中创建的模型是不具备接收物理引擎的,除非给模型添加刚体组件或角色控制器组件。我们先说说刚体,还用奋斗的小鸟来举例子。发射小鸟以后,小鸟以一个抛物线轨迹去撞击物体,发生碰撞后被碰撞的物体会根据小鸟撞击的角度以及力度发生不同的物理效果,并且几乎是完全模拟真实的物理引擎。但是这种物理引擎的效果不能绑定在比如RPG游戏的主角身上。原因很简单,因为刚体所添加的物理引擎太过于真实以至于会影响用户的对主角的操作,举个例子比如用户在控制主角移动时他碰撞到质量较大的物体,根据真实的物理引擎会被这个物体的反弹力把主角反弹回原位。但是这个是不符合逻辑的,因为刚体组件太过于物理话了,所以我们需要给主角添加角色控制器组件,它操作起来比较灵活,更容易让我们操作主角。
下面我们给Cube1对象绑定刚体组件,选择Cube1对象然后在导航菜单栏中选择Component-&physics -&Rigidbody(刚体)。我们看看下面这段代码,使用添加了角色控制器组件的Cube0 去碰撞添加刚体组件的Cube1,当他生碰撞时计算一下Cube0碰撞Cube1时的碰撞角度向量,然后通过刚体向他施加一个力把它推开。
[代码]java代码:
using UnityE
using System.C
public class Test : MonoBehaviour {
//角色控制器组件在与具有Collider组件对象之间的碰撞
void OnControllerColliderHit(ControllerColliderHit hit)
//判断碰撞的对象是否具备刚体组件
GameObject hitObject = hit.collider.gameO
Rigidbody rigidbody = hitObject.
if(rigidbody != null && !rigidbody.isKinematic)
//地面也具备刚体组件,这里判断一下
if(!hitObject.name.Equals(&Terrain&) )
rigidbody.AddForce(new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z) * 10);
也可以将同样的脚本直接绑定在第三人称的角色控制器组件中。如下图所示,主角移动将周围的箱子都推开了。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' width="479" height="343" title="屏幕快照
下午5.54.43" alt="" src="/files/uploadimg/4264.png" />
总的来说角色控制器组件适用于 既需要感应物理引擎的支持但是又不能完全依赖与物理引擎,需要自己代码去编写一些东西的模型,所以非常适合游戏中主角对象的使用。雨松MOMO祝大家学习愉快,哇咔咔。
【编辑推荐】
【责任编辑: TEL:(010)】
关于&&的更多文章
本书是一部应运而生的实用指南,讲述了如何构建出能在Apple Stor
网友评论TOP5
随着云计算、物联网、大数据、移动互联网的大发展,你应该知道这些。
本系列视频教程由正益无线与51CTO共同推出,目的是让
本系列视频教程由正益无线与51CTO共同推出,目的是让
本系列视频教程由正益无线与51CTO共同推出,目的是让
信息安全风险评估理论研究日趋成熟,相关资料比较充分,但有关评估实际工作的参考资料很少。本书以信息安全风险评估实践为基础,
Windows Phone专家
Android开发专家
51CTO旗下网站1,如果我们的Unity 5.X 是从下载的,***后不会有资源包,则需要从下载资源包:&Standard Assets (Unity 5.x)&
& & 下载后***后,Unity 编辑器的***目录下看到这些资源包,如图:
2,项目中 Import Package & Environment 中可以找到草地、石头等纹理效果添加到场景中:
3,给Terrain(地形)添加草地纹理(Texture),按住Shift+鼠标左键 删除纹理:
4, 添加第一人称视角,项目中导入角色资源包 Assets & Import Package & Characters 。 然后在项目中选择Characters & Prefabs & FPSControl 添加第一人称视角。第一人称视角,运行后可以用鼠标控制视角方向。
5, 地形设置,设置地形相关参数和数据,如:地形是否显示,是否显示阴影,树、草进入视野多少米开始渲染显示,风的大小等
  参考文档:
6, 添加Fog效果,5.x版本的Edit下面并没有&Render Settings& ; 不过可以在 Window & Lighting 中找到 Fog 组件:
  第二种添加Fog的方法是,在脚本中添加Fog,然后把脚本附加到Main Camera上面即可
import UnityEngine.C
#pragma strict
function Start () {
RenderSettings.fog = true;
RenderSettings.fogColor =Color (0, 0.4, 0.7, 0.6);// UnityEngine.Color.
RenderSettings.fogDensity = 0.04;
function Update () {
&7, 添加湖泊 (水纹波动效果由于缺少素材暂时未实现成功)
  下面这段是做湖泊的思路:&&直接在抬高笔刷中按住shift就可以画出低洼地了,但是的确,必须要实现在&地形设定&(也就是齿轮图标)中设定出terrain height也就是高度,之后用固定高度笔刷把整个平面刷高,然后再画低洼地。凹陷是不能低于最低(也就是0)的。所以说这是个新手经常犯的错误(咱已经吃了好几次亏了&)如果事先没有设置好的话,重新设置地形的最大高度会导致全部地形数据的丢失。所以必须注意这一点,开始的时候就必须设定好高度&& 。
  所以,我们需要先设置低洼地形,然后挖下去,然后添加Water 组件
  Environment & Water ,然后需要设置各个属性:
  添加湖泊还可以参考:
&8, Package导入,资源包文件必须复制到英文路径下,才能导入,或者直接Copy到***目录下(Unity\Editor\Standard Assets&)
阅读(...) 评论()

参考资料

 

随机推荐