From: http://blog.csdn.net/czlilove/article/details/9139103

今天下午碰到个问题纠结了很久:
人物加上了Rigidbody并使用了重力,遇到悬崖居然不掉下,如履平地地走了过去。
想了很久又请教了别人,花了很长时间才发现,CharacterController与Rigidbody两个组件有冲突。
Unity圣典中的说法是:
 角色控制器允许你在受制于碰撞的情况下很容易的进行运动,而不用处理刚体。(个人理解:用CharacterController组件,它包含Rigidbody组件的一些属性,就不用用Rigidbody组件了)。  角色控制器不受力的影响,仅仅当你调用Move函数时才运动。然后它将执行运动,但是受制于碰撞。
下面说说我自己的理解:
1.添加了CharacterController组件后,人物将不受力影响,这时即使加上Rigidbody组件,并启用Use Gravity,人物也不会受重力影响,在脚本中通过rigidbody对人物施加力也是无效的。
也就是说CharacterController屏蔽了Rigidbody的所有属性和方法。
要控制CharacterController移动,可以通过在脚本中调用Move方法使其移动。
2.虽然CharacterController不受力,但是有个例外是,它受碰撞的影响。
一般的碰撞发生条件是:碰撞的两个物体必须都有Collider,并且其中一个有Rigidbody。
但是如果一方有CharacterController,则不需要。这时碰撞发生的条件为:
一方有CharacterController,另一方有Collider。CharacterController本身就继承自Collider。

3.碰撞发生时,CharacterController不会推动其它物体移动,也就是说CharacterController不会对它所碰撞的物体施加物理作用。除非我们在脚本中添加了OnControllerColliderHit()函数,在该函数中使用被碰撞物体的rigidbody对被碰撞物体施加力。

补充:仅仅加上CharacterController组件还不行,还必须在脚本中调用CharacterController的方法,这样才能屏蔽Rigidbody

// this script pushes all rigidbodies that the character touches
// 这个脚本推动所有的角色碰撞到的刚体。
var pushPower = 2.0;
function OnControllerColliderHit (hit : ControllerColliderHit) {
var body : Rigidbody = hit.collider.attachedRigidbody;
// no rigidbody
// 没有刚体。
if (body == null || body.isKinematic)
return; // We dont want to push objects below us
// 我们不想推动在我们下边的物体。
if (hit.moveDirection.y < -0.3)
return; // Calculate push direction from move direction,
// we only push objects to the sides never up and down
// 通过移动方向计算推动方向,我们只把物体推到两侧,从不向上和向下推。
var pushDir : Vector3 = Vector3(hit.moveDirection.x, , hit.moveDirection.z); // If you know how fast your character is trying to move,
// then you can also multiply the push velocity by that.
// 如果你知道你的角色移动的有多快,那么你也可以用它乘以推动速度。
// Apply the push
// 应用推力。
body.velocity = pushDir * pushPower;
}

[转]CharacterController与Rigidbody的更多相关文章

  1. Unity3D重要知识点

    数据结构和算法很重要!图形学也很重要!大的游戏公司很看重个人基础,综合能力小公司看你实际工作能力,看你的Demo. 1.什么是渲染管道? 是指在显示器上为了显示出图像而经过的一系列必要操作. 渲染管道 ...

  2. Unity3D 面试题汇总

    最先执行的方法是: 1.(激活时的初始化代码)Awake,2.Start.3.Update[FixUpdate.LateUpdate].4.(渲染模块)OnGUI.5.再向后,就是卸载模块(TearD ...

  3. [Unity3D]上海某大型游戏公司的基础面试题

    一个小老乡跟我聊到去上海某大公司的基础面试题,面试结果不尽如人意,但还是分享了下面试的试题,刚刚第一次录制视频,给某人讲课,我感觉讲的还算比较耐心,但发现一些新手入门学习的弊端,可能是很普遍的现象,这 ...

  4. Unity随机随学

    1.什么是渲染管道? 是指在显示器上为了显示出图像而经过的一系列必要操作.渲染管道中的步骤很多,都要将几何物体从一个坐标系中变换到另一个坐标系中去. 主要步骤有: 本地坐标->视图坐标-> ...

  5. Unity3D面试题汇总

    1.请描述游戏动画有哪几种,以及其原理. 2.alpha blend 工作原理 3.写光照计算中的diffuse的计算公式 4.lod是什么,优缺点是什么 5.两种阴影判断的方法工作原理 6.MipM ...

  6. unity3d最新面试题与参考答案汇总

    1.在类的构造函数前加上static会报什么错?为什么? 构造函数格式为 public+类名,如果加上static会报错(静态构造函数不能有访问修饰符)原因:静态构造函数不允许访问修饰符,也不接受任何 ...

  7. unity 面试题(答案)

    一.什么是渲染管道?是指在显示器上为了显示出图像而经过的一系列必要操作.渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去.主要步骤有:本地坐标->视图坐标->背面裁 ...

  8. Unity全面的面试题(包含答案)

    一:什么是协同程序? 在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足. 二:Unity3D中 ...

  9. 总结的U3D面试题

    1.配置Unity 3d调试环境? 1)          Visual Studio Tools for Unity 2)          访问http://unityvs.com 3)      ...

随机推荐

  1. oracle linux下oracle 10g启动EM、isqlplus及相关命令语法

    转载:http://hancang2000.blog.sohu.com/139239421.html ORACLE_HOME/bin/emctl start dbconsole $ORACLE_HOM ...

  2. YYKit之YYText

    原文:http://www.cnblogs.com/lujianwenance/p/5716804.html   本文的目的是希望能帮助到我们更快的熟悉和学习YYText的结构和实现的思路,如有不正确 ...

  3. mysql 根据某个字段将多条记录的某个字段拼接成一个字段

    未合并情况 SELECT a.id, b.name AS "role" FROM sys_user a INNER JOIN sys_user_role c ON a.id=c.u ...

  4. bzoj1478:Sgu282 Isomorphism

    思路:由于题目中是通过改变点的编号来判断两种染色方案是否相同,而染色的确是边,于是考虑如何将点置换转化为边置换. 对于一个有n个点的完全图,其点置换有n!个(即全排列个数),又由于每一个边置换都对应了 ...

  5. 【ADO.NET】3、从TXT中导入数据到数据库

    数据库字段与类型id int,Name nvarchar(20),Age int TXT文本内容为 小高-20张三-18李四-19 private void btnInput_Click(object ...

  6. 【转】CHAR CHARACTER VARCHAR NCHAR NVARCHAR NVARCHAR2区别

    http://blog.csdn.net/lhl6688/article/details/44156823?ref=myread oracle提供了五种字符数据类型:char.nchar.varcha ...

  7. ruby环境sass编译中文出现Syntax error: Invalid GBK character错误解决方法

    sass文件编译时候使用ruby环境,无论是界面化的koala工具还是命令行模式的都无法通过,真是令人烦恼. 容易出现中文注释时候无法编译通过,或者出现乱码,找了几天的解决方法终于解决了. 这个问题的 ...

  8. (转载)将DELPHI数据库连接写进INI配置文件中

    将DELPHI数据库连接写进INI配置文件中 procedure TDM.DataModuleCreate(Sender: TObject); var piececonfg:Tinifile; pat ...

  9. 解决android调用IIS Express中的WCF服务时,出现错误400问题

    IIS Express仅支持localhost主机名地址访问. 找到IIS Express Config文件下的 applicationhost.confi   修改配置 再来调试android应用, ...

  10. [转]ef获取某个表中的部分字段值

    我有个新闻表 id,title,body,createtime,author,click 使用ef4.1 仅仅读取 id,title,createtime 并显示在页面上. public static ...