• 好吧,网上好多资料显示发生碰撞条件如下: 两个对象都有Collider组件且至少一个有Rigidbody组件 其中至少一个物体(必须运动的)必须带有碰撞器(collider)+刚体(Rigidbody),另一个物体(可以静止也可以运动)也...

    好吧,网上好多资料显示发生碰撞条件如下:

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

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

    这里再引用一篇关于碰撞的函数调用归纳较好的文章:点击打开链接

    Unity圣典中的说法是:
     CharacterController角色控制器允许你在受制于碰撞的情况下很容易的进行运动,而不用处理刚体。(个人理解:用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对被碰撞物体施加力。

    感谢转载:点击打开链接

    // 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, 0, 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;  
    }  


    展开全文
  • unity3D Collider 碰撞

    2018-08-02 09:34:54
    unity3D Collider 碰撞碰撞器的种类: 1、盒碰撞器(Box Collider) 2、椭圆碰撞器(Sphere Collider) 3、胶囊碰撞器(Capsule Collider) 4、车轮碰撞器(Wheel Collider)专用于车辆 5、网格碰撞器(Mesh ...

    unity3D Collider 碰撞器

    碰撞器的种类:

    1、盒碰撞器(Box Collider)
    2、椭圆碰撞器(Sphere Collider)
    3、胶囊碰撞器(Capsule Collider)
    4、车轮碰撞器(Wheel Collider)专用于车辆
    5、网格碰撞器(Mesh Collider)
    6、地形碰撞器(Terrain Collider)


    • 盒碰撞器(Box Collider)

      盒子碰撞器是一个立方体外形的基本碰撞体,该碰撞体可以调整为不同大小的长方体,可以做门,墙等.
      这里写图片描述

     Edit Collider  编译碰撞器
     Is Trigger  触发器
     Material  材质
     Center  中心
    • 椭圆碰撞器(Sphere Collider)

      椭圆碰撞器是一个基本球形的基本碰撞体,球形碰撞体的三维大小可以均匀的调节,适用于落石,球形障碍物。
      这里写图片描述

    Radius  半径
    • 胶囊碰撞器(Capsule Collider)

      是由一个圆柱体和与其相连的两个半球体组成
      这里写图片描述

    Radius  半径(圆柱体,球体半径)
    Height  圆柱体高度
    Direction 方向(在对象局部坐标系中,胶囊的纵方向对应的坐标轴,默认Y轴)
    • 车轮碰撞器(Wheel Collider)专用于车辆

      是一种针对地面车辆的特殊碰撞体,有内置的碰撞检测、车轮物理系统及有滑胎摩擦的参考体。
      这里写图片描述

    车轮碰撞器讲解—传送门

    • 网格碰撞器(Mesh Collider)

      通过获取网格对象并在其基础上构建碰撞碰撞。更加精细,但是会使用更多系统资源。开启Convex参数的网格碰撞体才可以与其他网格碰撞体发生碰撞
      这里写图片描述

      1. 地形碰撞器(Terrain Collider)
    展开全文
  • 今天我们来一起来学习Unity3D中一个很重要的概念:碰撞。为什么说碰撞很重要呢?因为在游戏中无时无刻不充满碰撞啊,在飞行类游戏中我们需要判断炮弹是否击中了敌人,在RPG游戏中我们需要判断玩家是否对敌人造成了...

       大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei。

       今天我们来一起来学习Unity3D中一个很重要的概念:碰撞。为什么说碰撞很重要呢?因为在游戏中无时无刻不充满碰撞啊,在飞行类游戏中我们需要判断炮弹是否击中了敌人,在RPG游戏中我们需要判断玩家是否对敌人造成了伤害,在射击类游戏中我们需要判断子弹是否打中了敌人.......总而言之,在游戏中所谓的打击感就是我们今天要讲的碰撞,从概念上来说,一个物体受到来自其它物体的力的影响并发生位置或者状态上的改变,我们就可以称为碰撞。在Unity3D中系统已经提供了碰撞检测的相关方法,这里我们介绍两种碰撞检测的方法:

       Collision检测:使用Collision检测需要用到下面三个重要的方法:OnCollisionEnter()在刚体与刚体接触时立即调用此方法、OnCollisionStay()在刚体与刚体碰撞中调用此方法、OnCollisionExit()在刚体与刚体碰撞结束时调用此方法。

       Trigger检测使用Trigger检测需要勾选IsTrigger属性,并用到下面的三个重要方法:OnTriggerEnter():开始碰撞、OnTriggerStay():碰撞中 、 OnTriggerExit():结束碰撞。

       那么两种检测方法的区别是什么呢?Collision将造成物理碰撞,Trigger将造成非物理碰撞 。于此同时,请牢记下面的碰撞原则:发生接触(Trigger)的前提是:双方都有碰撞器,且至少一方有刚体,且至少一方勾选了IsTrigger属性。发生碰撞(Collision)的前提是:双方都有碰撞器,且至少一方有刚体。

       下面我们来看一个演示项目,首先创建如图所示的场景。



      

       这里我们对碰撞的目标做了判断,如果我们碰撞的对象的Sphere,则会执行目标对象的脚本中的方法,并输出碰撞信息。目标对象Sphere的脚本和Cube类似,这里就不给出了。最后我们来看结果,如我们所预期的那样,屏幕上打印出了碰撞信息,控制台同样输出了相应的信息。

       在这个演示项目中,我们将使用键盘来控制左边的Cube来碰撞右边的球体,然后再屏幕上打印碰撞信息,在控制台中输出脚本的调用情况。

       首先我们来看为Cube编写的部分脚本代码:

            //一个控制台输出方法
    	public void Log(string msg)
    	{
    	  Debug.Log(msg);
    	}
    	
    	//碰撞开始
    	void OnCollisionEnter(Collision collision)
    	{
    	  if(collision.gameObject.name=="Sphere")
    	  {
    	     Message="进入碰撞,碰撞名称:"+collision.gameObject.name;
    	     collision.gameObject.GetComponent<TargetScript>().Log(Message);
    	  }
    	}
    	
    	//碰撞中
    	void OnCollisionStay(Collision collision)
    	{ 
    	  if(collision.gameObject.name=="Sphere")
    	  {
    	    Message="碰撞中,碰撞名称:"+collision.gameObject.name;
    	    collision.gameObject.GetComponent<TargetScript>().Log(Message);
    	  }
    	}
    	
    	//碰撞结束
    	void OnCollisionExit(Collision collision)
    	{ 
    	  if(collision.gameObject.name=="Sphere")
    	  {
    	    Message="碰撞结束,碰撞名称:"+collision.gameObject.name;
    	    collision.gameObject.GetComponent<TargetScript>().Log(Message);
    	    collision.gameObject.rigidbody.Sleep();
    	  }
    	}



        为什么这里要编写两个输出到控制台的方法呢?因为在实际的游戏开发中,当发生碰撞的时候,我们可能需要作出一些更为实际的事情,比如给敌人减血啦,给我方加血啦,这里只是简单地了解了Unity3D的碰撞机制,Trigger检测和这个基本类似,这里就不再赘述啦,谢谢大家,今天的内容就是这样啦!

             

    展开全文
  • unity3d碰撞的添加

    2019-01-28 16:59:23
    unity3d中实现碰撞要求碰撞的双方至少有一方具有碰撞体组件。 通过在Component中点击 Physics 2D→Polygon Collider 2D。 可对一个不规则形状的对象添加碰撞体。效果如下图所示 具体要想调整碰撞体的形状 做出...

    在unity3d中实现碰撞要求碰撞的双方至少有一方具有碰撞体组件。

    通过在Component中点击 Physics 2D→Polygon Collider 2D。 可对一个不规则形状的对象添加碰撞体。效果如下图所示

    具体要想调整碰撞体的形状 做出微调,可以在右侧组件中Polygon Collider2D处点击“Edit Collider”选项。

    之后再Scene界面处就可以通过拖拽等操作对碰撞体形状进行微调

    另外,如果想要制定某两个层(layer)中的碰撞体发生碰撞或者不发生碰撞。则可通过Edit→project settings→physics 2d(2d模式情况下)

    之后,通过勾选指定的对勾,来选定某两个层中的对象是否会发生碰撞。

    展开全文
  • Unity3d中的碰撞检测教程.最新最详细!!!!
  • 2.在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。这两种方式的应用非常广泛。为了完整的了解这两种方式,我们必须理解以下概念: (一)碰撞器是一群组件,它包含了很多种类,...

    碰撞器由来

    1.系统默认会给每个对象(GameObject)添加一个碰撞组件(ColliderComponent),一些背景对象则可以取消该组件。

    2.在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。这两种方式的应用非常广泛。为了完整的了解这两种方式,我们必须理解以下概念:
    (一)碰撞器是一群组件,它包含了很多种类,比如:Box Collider,Capsule Collider等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。
    (二)所谓触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框
    (三)在Unity3d中,主要有以下接口函数来处理这两种碰撞检测:

    触发信息检测:
    1.MonoBehaviour.OnTriggerEnter( Collider other )当进入触发器
    2.MonoBehaviour.OnTriggerExit( Collider other )当退出触发器
    3.MonoBehaviour.OnTriggerStay( Collider other )当逗留触发器

    碰撞信息检测:
    1.MonoBehaviour.OnCollisionEnter( Collision collisionInfo ) 当进入碰撞器
    2.MonoBehaviour.OnCollisionExit( Collision collisionInfo ) 当退出碰撞器
    3.MonoBehaviour.OnCollisionStay( Collision collisionInfo )  当逗留碰撞器


    碰撞使用场景

    1.给主角添加刚体(Rigidbody)组件,并且取消刚体组件的重力选项UseGravity。

    2.主角碰到一些物体后会有一系列反应。举例,完雷电游戏时,飞机可以获取一些加速球能量球,碰到这些球体,飞机自身属性会有所提高
    下图:蓝色球为“加速球”,红色球为能量球,的当飞机接触球体时,属性就会增加



    主角的脚本代码如下:
    using UnityEngine;
    using System.Collections;
    
    public class Hero : MonoBehaviour {
    
        private float move_v = 0;//纵向移动距离
        private float move_h = 0;//横向移动距离
        public float m_speed = 1.5f;//移动速度
        public float m_power = 1.0f;//飞机的威力能量
        private Transform m_transform;
    
    	void Start () {
            m_transform = this.transform;
    	}
    	
    	
    	void Update () {
            Move();
    	}
    
       
       //飞机与物体发生碰撞,需要判断碰撞体是什么类型
        void OnTriggerEnter(Collider e)
        {
            if (e.gameObject.tag.CompareTo("tagSpeedBall")==0)
            { 
                Debug.Log("捡到加速球");
                m_speed += 5;//速度+2
                Destroy(e.gameObject);//销毁加速球
            }
    
            if (e.gameObject.tag.CompareTo("tagPowerBall") == 0)
            {
                Debug.Log("捡到能量球");
                m_power += 2;//威力+2
                Destroy(e.gameObject);//销毁能量球
            }
        }
        //移动方法
        void Move()
        {
            //向上
            if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
            {
                //移动距离
                m_transform.Translate(-Vector3.forward * Time.deltaTime * m_speed);
    
            }
            //向下
            if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
            {
    
                m_transform.Translate(Vector3.forward * Time.deltaTime * m_speed);
    
            }
    
            //向左
            if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
            {
    
                m_transform.Translate(Vector3.right * Time.deltaTime * m_speed);
            }
    
            //向右
            if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
            {
    
                m_transform.Translate(Vector3.left * Time.deltaTime * m_speed);
            }
    
        }
    
    }



    展开全文
  • 在目前掌握的情况分析,在Unity中参与碰撞的物体分2大块...工作的原理为:发生碰撞的物体中必须要有“发起碰撞”的物体。否则,碰撞不响应。比如:墙用BoxCollider ,所以墙与墙之间无反应。比如:一个带有Rigidbod...
  • Unity3d开发基础篇之射线碰撞检测介绍射线的创建和显示 介绍        在游戏开发过程中,很多地方要用到射线碰撞检测。比如:射击游戏中子弹是否击中敌人,在RPG游戏中是否捡到装备,无人驾驶...
  • Unity3D碰撞检测

    2015-03-27 17:14:24
    在目前掌握的情况分析,在Unity中参与碰撞的物体分2大块:1....工作的原理为:发生碰撞的物体中必须要有“发起碰撞”的物体。否则,碰撞不响应。 比如:墙用BoxCollider ,所以墙与墙之间无反应
  • 再我看来,首先 至少得有两个物体,物体与物体之间才能产生碰撞,对吧,其次,物体身上得有碰撞器,不然 都没有一个标志的东西,那不是随随便便的物体就可以发生碰撞了,那怎么能行,对吧。。那么,可能有的读者看到...
  • 当进入碰撞 by fm [Collision:描述碰撞] [Collision.contacts 接触点列表;] */ function OnCollisionEnter(collision : Collision){ if(!this.hingeJoint){ var hingeJ : HingeJoint =new HingeJoint...
  • 本文地址为: http://blog.csdn.net/qinyuanpei/article/details/23093665 大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei。 今天我们来一起来...
  • Unity教程之-Unity3d碰撞器与触发器的区别详解前提:要用collider发生碰撞的话必须是使用力来移动物体。如果只是单纯的位置移动(transform.position)使用这种方法是不行的。必须有了物理的力Rigidbody或者...
  • Unity3d 碰撞与Layers

    2015-01-04 12:49:20
    Unity3d的碰撞 两个物体一定要加上BoxCollider和...在Unity3d中可以配置Layers之间是否可以发生碰撞。 在打开的界面中可以进行层次之间是否可以发生碰撞的设置。 只有交叉点是打勾的,才能发生碰撞
  • Unity3d碰撞检测

    2016-07-20 14:50:20
    Unity3d碰撞器 一.碰撞发生的必要条件: 1.产生碰撞效果需要具备两个因素 a.发起碰撞的物体 b.接收碰撞的物体 2发起碰撞的物体 a.Rigidbody b.CharacterController 3.接受碰撞的物体 a.所有的Collider ...
  • Unity3D 碰撞与休眠

    2019-08-21 21:00:39
    刚体的碰撞分为三种:进入碰撞、碰撞中和结束碰撞。 下面是关于碰撞的三个系统方法: OnCollisionEnter():刚体与刚体刚开始接触时,立即调用此方法。 ...示例:如果有刚体与这个物体发生碰撞...
  • Unity3D内置物理引擎,可以模拟物理效果。典型的一个物理效果就是碰撞。本文将会针对最简单的案例讲述Unity3D碰撞规律。
  • 要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动。...物体发生碰撞的必要条件: 两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody
  • 很多时候,当我们的主角与其他GameObject发生碰撞时, 我们需要做一些特殊的事情,比如:子弹击中敌人,敌人就得执行一系列的动作。这时,我们就需要检测到碰撞现象,即碰撞检测。这一篇,我来具体谈谈自己所了解的...
  • Unity3D-碰撞测试

    2014-06-05 09:17:06
    碰撞测试这个再游戏的开发中是很有必要的,当地人d在Unity中的
1 2 3 4 5 ... 20
收藏数 3,324
精华内容 1,329