OnTrrigerEnter与OnCollisionEnter、OnControllerColliderHit、Rigidbody、CharacterController

本文主要是介绍OnTrrigerEnter与OnCollisionEnter、OnControllerColliderHit、Rigidbody、CharacterController,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1,测试OnTriggerEnter和OnCollisionEnter的区别

测试:如果两个物体A,B 

两者都有碰撞体collider(Box Collider,Sphere Collider,Capsule Collider等)

A,B都有刚体(Rigidbody)

A或者B中有一个勾选isTrigger或者两者都勾选isTrigger A和B都可以进入OnTriggerEnter方法,但是不可进入OnCollisionEnter方法。

A和B都不勾选isTrigger,A和B能进入OnCollisionEnter方法但是不能进入OnTriggerEnter方法。

结论:

OnCollisionEnter方法必须是在两个碰撞物体都不勾选isTrigger的前提下才能进入,反之只要勾选一个isTrigger那么就能进入OnTriggerEnter方法。

OnCollisionEnter和OnTriggerEnter是冲突的不能同时存在的。

2,OnTriggerEnter和OnCollisionEnter的选择。

如果想实现两个刚体物理的实际碰撞效果时候用OnCollisionEnter,Unity引擎会自动处理刚体碰撞的效果。

如果想在两个物体碰撞后自己处理碰撞事件用OnTriggerEnter。

3,一些技巧。

3.1:刚体(Rigidbody)的使用。

     两个碰撞的物体A 和 B

     现在我们就可以分两种模式来分析了,就是OnTrigger模式和OnCollision模式,因为上面已经详细介绍了两者是对立的模式, 

     在OnCollision模式下:

     测试1:如果只有A有刚体(Rigidbody),那么当A去碰撞B时,发现A弹开B没有动。A和B都进入OnCollisionEnter方法

     结论1:只有刚体能实现真实的物理碰撞。

     测试2:如果只有A有刚体(Rigidbody),那么当B去碰撞A时,发现没有碰撞效果,A和B都没有进入OnCollisionEnter方法。

     结论2:实现碰撞的条件是,发起碰撞方必须具有刚体。

     这里我猜测了刚体是用来实现物理真实碰撞的Component,但是这个想法是错误的,因为OnTriggerEnter也必须有一个物体具有刚体,所以猜测刚体应该是一个判断是否实现碰撞的是与否的标志。

     在OnTrigger模式下:

     A和B必须有一个有刚体(Rigidbody),A和B都可以进入OnTriggerEnter方法。

4,知识扩展。

上面的内容中有的实验是A,B有一个有刚体,有的实验是A,B都有刚体,那么为什么不干脆把两个物体都加刚体就没这么多麻烦了?

其实是这样的,真实游戏里面,有太多的物体,而这些物体如果都有刚体那么对系统的开销是很大的,如果可以减少一半的开销是很不错的选择。

比如地面就可以不设置刚体,因为地面是永远不动的,把人物设置刚体就可以实现真实的物理碰撞效果了。

CharacterController.OnControllerColliderHit 控制碰撞器碰撞 

function OnControllerColliderHit (hit : ControllerColliderHit) : void

Description描述

OnControllerColliderHit is called when the controller hits a collider while performing a Move.

当控制器碰撞一个正在运动的碰撞器时,OnControllerColliderHit 被调用。

This can be used to push objects when they collide with the character

这个可以被用于推动物体,当他们碰撞角色时。

  • C#//OnControllerColliderHit 此函数要挂载在角色控制器CharacterController上。
using UnityEngine;
using System.Collections;public class example : MonoBehaviour {public float pushPower = 2.0F;void OnControllerColliderHit(ControllerColliderHit hit) {Rigidbody body = hit.collider.attachedRigidbody;if (body == null || body.isKinematic)return;if (hit.moveDirection.y < -0.3F)return;Vector3 pushDir = new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z);body.velocity = pushDir * pushPower;}
}
刚体Rigidbody
       是让GameObject能够按照真实的物理规律运动。不再使用Transform组件移动或旋转物体,而是用力(force)!如重力、摩擦力、恒定力等。


角色控制器Character Controller
       主要用于第一或第三人称控制中。它对外界施加的力不作反应,也不自动的把其他的刚体推开(刚体组件撞上另一个刚体会对其施加力)。如果你想推开其他刚体,或在碰到其他刚体时作出反应,需要重载 OnControllerColliderHit() 函数并实现你的逻辑。角色控制器和Collider不能同时存在,可以与Rigidbody同时存在,如果不要求对物理力做出真实的反应的话,它可以取代Rigidbody和Collider。


碰撞器和触发器

碰撞器和触发器的区别在于Collider的isTrigger 参数是true or false ,如果是true,那它就是一个触发器,可以被穿透,对应函数为OnTriggerEnter,OnTriggerExit,OnTriggerStay;如果值为false,那它就是一个碰撞器,不可被穿透,在碰撞时调用OnCollisionEnter,OnCollisionExit,OnCollisionStay 函数,其函数的参数为Collision类,类中包括接触点,接触速度等信息。

  • Runtime Classes 实时运行类
    • Attributes 属性
    • Enumerations 枚举
  • Editor Classes 编辑器类
    • Enumerations 枚举
  • Index 总索引
CharacterController
  • center
  • collisionFlags
  • detectCollisions
  • height
  • isGrounded
  • Move
  • OnControllerColliderHit
  • radius
  • SimpleMove
  • slopeLimit
  • stepOffset
  • velocity

CharacterController.OnControllerColliderHit 控制碰撞器碰撞

function OnControllerColliderHit (hit : ControllerColliderHit) : void

Description描述

OnControllerColliderHit is called when the controller hits a collider while performing a Move.

当控制器碰撞一个正在运动的碰撞器时,OnControllerColliderHit 被调用。

This can be used to push objects when they collide with the character

这个可以被用于推动物体,当他们碰撞角色时。

  • C#
  • JavaScript
using UnityEngine;
using System.Collections;public class example : MonoBehaviour {public float pushPower = 2.0F;void OnControllerColliderHit(ControllerColliderHit hit) {Rigidbody body = hit.collider.attachedRigidbody;if (body == null || body.isKinematic)return;if (hit.moveDirection.y < -0.3F)return;Vector3 pushDir = new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z);body.velocity = pushDir * pushPower;}
}

这篇关于OnTrrigerEnter与OnCollisionEnter、OnControllerColliderHit、Rigidbody、CharacterController的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150135

相关文章

【unity实战】使用新版输入系统Input System+Rigidbody实现第三人称人物控制器(附项目源码)

最终效果 前言 使用CharacterController实现3d角色控制器,之前已经做过很多了: 【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用 【unity实战】Cinemachine虚拟相机+Character Controller实现俯视角、第三人称角色控制,复制粘贴即用

【unity实战】使用新版输入系统Input System+Rigidbody实现第三人称人物控制器

最终效果 前言 使用CharacterController实现3d角色控制器,之前已经做过很多了: 【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用 【unity实战】Cinemachine虚拟相机+Character Controller实现俯视角、第三人称角色控制,复制粘贴即用

解决使用CharacterController移动角色发生角色升高问题

给角色移动添加一个向下的方向,即y轴添加向下值

mesh rigidbody drawing

方法一:获取顶点和索引的方法来画出碰撞膜 hkpRigidBody* createMesh(const hkVector4& position, hkReal scale) {     hkpStorageExtendedMeshShape* extendedMesh = new hkpStorageExtendedMeshShape();     for(int numobj=0; numob

【Unity】Transform、Rigidbody、CharacterController移动

前言 在使用Unity开发的时候,移动是最最基础的一个需求,我来给大家简单的讲一下Unity中的几种常见的移动方法。 1.Transform移动 Transform移动就是修改物体的position ①修改位置 这里要注意:坐标分为世界坐标和本地坐标 //将物体的世界坐标修改为(1,1,1)transform.position = new Vector3(1, 1, 1);//将物体

unity基础开发----Rigidbody,Collider,PhysicMaterial问题

其中最基本的关系: Collider是最基本的触发物理的条件,例如碰撞检测。基本上,没有Collider物理系统基本没有意义(除了重力)。 Rigidbody是物体的基本物理属性设置,当检测碰撞完之后,就要计算物理效果,而Rigidbody就是提供计算基本参数的玩意。 PhysicMaterial则是附加的基本物理参数,是一个物理材质,UNITY3D有自带默

unity脚本API中OnCollisionEnter()、OnTriggerEnter()二者的区别

Unity中的OnCollisionEnter和OnTriggerEnter两个函数在日常的开发中很常见但也容易混淆,下面说一说两者的区别。 碰撞器(Collider)与触发器(Trigger)的概念 碰撞器(Collider)和触发器(Trigger)都是Unity中用于检测物体之间交互的组件。它们的主要区别在于对物体之间交互的处理方式。 碰撞器(Collider) 用于检测两个

Unity 关于Rigidbody刚体组件的理解

一、基本了解 刚体Rigidbody因具体物理相关的属性,使得实际应用中更有真实感。应用也多: Rigidbody它可以受到重力、碰撞或者力的作用,所以我们可以用它模拟物体的真实物理行为,如受到重力的作用、与其他刚体对象进行碰撞,并模拟物体的运动和旋转。一个带有刚体Rigidbody组件的物体是可以与其它的刚体或者带有碰撞体的物体发生碰撞事件,从而通过碰撞事件执行特定事件或行为。通过Rigid