unity 怎么判断碰撞的物体?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity 怎么判断碰撞的物体?相关的知识,希望对你有一定的参考价值。

我的场景里面有A模型(cube) 和B模型(cube),在A和B上都加了物理属性,(都会落到地上) 现在我想写一个碰撞脚本,只有当A和B相撞才会触发...请问各位怎么写?

我看了个老外是这么写的:
function OnControllerColliderHit(hit:ControllerColliderHit)
if(hit.gameObject.tag == "one") //被撞的物体的名字为“one”

aa.text="1";


但是我这没一点反映...
求解?

发生碰撞条件如下:

两个对象都有Collider组件且至少一个有Rigidbody组件其中至少一个物体(必须运动的)必须带有碰撞器(collider)+刚体(Rigidbody),另一个物体(可以静止也可以运动)也必须至少带collider也有说一方有CharacterController,另一方有Collider。

详解如下:

(1)添加了CharacterController组件后,人物将不受力影响,这时即使加上Rigidbody组件,并启用Use Gravity。人物也不会受重力影响,在脚本中通过rigidbody对人物施加力也是无效的。

也就是说CharacterController屏蔽了Rigidbody的所有属性和方法。要控制CharacterController移动,可以通过在脚本中调用Move方法使其移动。

(2)虽然CharacterController不受力,但是有个例外是,它受碰撞的影响。

一般的碰撞发生条件是:碰撞的两个物体必须都有Collider,并且其中一个有Rigidbody。

但是如果一方有CharacterController,则不需要。

这时碰撞发生的条件为:一方有CharacterController,另一方有Collider。CharacterController本身就继承自Collider。

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

扩展资料:

如何学习unity:

第一步首先了解unity3d的菜单,视图界面。这些是最基本的基础,可以像学word操作一样,大致能明白有几个菜单,几个基本的视图,各自起什么作用的就可以了。当然还要了解人物基本的比例和结构。

第二步理解场景里面的坐标系统,输入系统,简单的向量概念。Unity3D的坐标系统及向量概念如果不理解清楚,不理解世界坐标,局部坐标的关系,即使一个简单的移动,缩放,旋转的几行代码,也会困惑你半天。

第三步学习创建基本的场景的一些基本概念:游戏对象,组件,脚本。在界面上分别体现在层次视图,项目视图及属性视图,要理清楚彼此之间的关系

第四步学习资源导入方面的一些基本元素:网格,材质,贴图,动画等。

第五步学习脚本的生命周期,Start,UpDate,ONGUI这些基本的方法。了解,预制,时间,数学等常用的类及相关方法。理解游戏对象,组件,脚本彼此之间的关系。

第六步进一步学习摄像机,灯光,地形,渲染,粒子系统,物理系统等等,这些每一个深入进去都是一个很复杂的主题。

第七步一些更高级的概念:向量的加减法点乘叉乘,光照法线贴图,内存管理,图形优化等等。Unity3D入门容易,真的要精通,那是相当难的。

参考资料:百度百科-unity3D



参考技术A

发生碰撞条件如下:

两个对象都有Collider组件且至少一个有Rigidbody组件

其中至少一个物体(必须运动的)必须带有碰撞器(collider)+刚体(Rigidbody),另一个物体(可以静止也可以运动)也必须至少带有collider

也有说一方有CharacterController,另一方有Collider,于是这里对 CharacterController做点补充。

CharacterController角色控制器允许你在受制于碰撞的情况下很容易的进行运动,而不用处理刚体。

角色控制器不受力的影响,仅仅当你调用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对被碰撞物体施加力。

扩展资料:

检测碰撞有两种方式,一种是利用碰撞器,另外一种就是触发器。

碰撞器的种类:

1.Static Collider 静态碰撞器

指的是相互碰撞的两个物体没有附加刚体而只附加了Collider的游戏对象。这类对象在碰撞时会保持静止,发生碰撞时不会触发任何的方法函数。

2.Rigidbody Collider 刚体碰撞器
在静态碰撞器的基础上,处于运动状态的物体必须要附加刚体组件和带有碰撞检测函数的脚本,被撞的物体可以没有刚体组件或碰撞检测脚本。

当两个物体发生碰撞时,带有刚体组件的物体会发生物理特性,如被撞飞,或有摩擦力的影响下移动一段距离。

3.Kinematic Rigidbody Collider 运动学刚体碰撞器
在第2点得基础上勾选了刚体组件中的IsKinematic属性,在发生碰撞时能检测到碰撞,但是勾选ISkinematic属性的物体不会因为撞击而发生位移。

它任待在原地不动,若要想让它发生移动,只能用transform.translate的方法。(如果要移动这类对象,就只能修改它的Transform,而不是用力)

触发器:
这三种碰撞器如果被撞击的物体的Collider勾选了IsTrigger复选框,就变成了相应的触发器了。

若此时该物体被撞击,撞击该物体的对象会穿进被撞的物体中,同时触发void OnTriggerEnter(Collider other)方法。

碰撞器的检测函数:(只有带刚体的碰撞才能触发检测函数,而且处于运动中的物体必须带检测函数的脚本,other.gameObject为撞击中的对方物体)

void OnCollisionEnter(Collision other);

void OnCollisionStay(Collision other);

void OnCollisionExit(Collision other);

触发器的检测函数:(任何带有触发器的碰撞都能触发检测函数)

void OnTriggerEnter(Collider other);

void OnTriggerStay(Collider other);

void OnTriggerExit(Collider other);

参考资料:百度百科-Unity3D

参考技术B

unity 判断碰撞用的是 OnControllerColliderHit(),这个是用于角色碰撞的,物体如果附加了Charactor Controller(Unity自带的用于角色控制的脚本)则使用这个函数检测碰撞,这是不需要加刚体的。

一般的刚体之间碰撞使用OnCollisionEnter(),范围触发用OnTriggerEnter(),如果你是让两个CUBE碰撞,请确保其中一个附加了RigidBody,

OnControllerColliderHit碰撞器,一个叫collider box的东东。打比方a,b两个物体都有那个东东你a上放一个脚本,用oncillisionenter方法就可以获取你碰撞到的东西的信息。

拓展资料:

Unity 最初出现在Ubuntu Netbook 10.10中。它最初的目的是更有效地利用上网本有限的屏幕尺寸。和 GNOME, KDE 不同,Unity并非一个完整桌面程序安装包,而采用了现有的方案。

Unity 环境利用了来自 GNOME 3 中的一些关键组件,包括 Mutter 混合型窗口管理器和 Zeitgeist活动记录引擎。其启动器使用 Clutter 建立,这与构建 GNOME Shell所用的图形框架相同。虽然底层的技术相似,但 Unity 用户界面完全是不同的实现,它并没有使用来自 GNOME Shell 的任何代码。

参考技术C 上面这个老外用的是 OnControllerColliderHit(),这个是用于角色碰撞的,物体如果附加了Charactor Controller(Unity自带的用于角色控制的脚本)则使用这个函数检测碰撞,这是不需要加刚体的。一般的刚体之间碰撞使用OnCollisionEnter(),范围触发用OnTriggerEnter(),如果你是让两个CUBE碰撞,请确保其中一个附加了RigidBody,然后这样写(我用C#):
void OnCollisionEnter(Collision collision)

Debug.Log("You touch me");

collision是个变量,通过它可以获得你所碰撞的目标的属性以及碰撞点信息和相对速度,如:
collision.collider.某个组件或脚本。
void OnCollisionEnter(Collision collision)

if(collision.collider.tag=="enemy")//tag是物体的标签,相当于物体的类别名称。在每一个物体的组件栏(也就是加脚本的那个区域)的最上面可以找到,默认的是UnTagged,也就是没有标签,你找找,然后点击会出现一个下拉列表,默认的已有几个Tag,你也可以加自定义的,点击下拉列表最下方的Add Tag就可以加Tag,最后选择一个Tag作为物体的名称就可以了。

Destroy(collision.collider.gameObject);//如果检测到对方是敌人,则消灭对方。

本回答被提问者采纳
参考技术D 去查询自带的帮助文档,搜索OnCollision,有详细的范例

你的例子里面不是单纯的碰撞判断,还能给予碰撞的刚体推力。具体搜索帮助文档OnControllerColliderHit。

至于你没有反应,可能是因为标签没有定义,hit.gameObject.tag == "one"并不是物体名字为“one”而是物体的标签(tag)名称为“one”,而tag是需要预先定义的。

如果想判断碰撞物体的名称,应该是hit.gameObject.name == "one"追问

hit.gameObject.name == "one" 也不行...我看了教程里面是用的 tag 请问我该怎么设置呢?

追答

你不要拿原来那个参考看了,我都不用那样做的。如果你就两个物体,根本就不需要加那个if 的条件,直接碰撞到什么都生效。直接去看自带的帮助文档,搜索OnCollision,有详细的例子。

小功能⭐️Unity解决物体移动速度过快不能检测到碰撞

文章目录


碰撞分为2D碰撞3D碰撞,解决办法是不同的。


3D碰撞解决办法
已封装好一个脚本,只需在移动的物体上挂载它即可。需要请添加下方联系方式。




2D解决办法
该办法转载自:链接

问题: 当物体移动速度过快时,物体直接穿透其他物体而不产生碰撞。

因为unity每一帧的检测时间大概是0.02秒,也就是说如果物体A速度过快,在不用0.02秒的时间就已经穿过了其他物体,那么这个时候是无法检测A与其他物体之间的碰撞信息的。

解决办法:将快速运动的物体设为Continuous





大家还有什么问题,欢迎在下方留言!



如果你有 技术的问题 项目开发

都可以加下方联系方式

和我聊一聊你的故事🧡

以上是关于unity 怎么判断碰撞的物体?的主要内容,如果未能解决你的问题,请参考以下文章

unity3D 篮球怎么实现碰撞到一个物体然后计分?

unity3d 怎么使物体碰撞后消失 求代码

unity2d如何判断高度

unity判断任务在哪个房间

如图,如何在Unity中判断一个物体自身的旋转是不是处于某个特定范围内?

unity3d 怎么检测碰撞?比如主角碰撞到物体之后销毁被撞到的物体