在关于Unity中的刚体和碰撞器的相关用法(一)的基础上

有一个plane平面,一个ball球体,都挂了碰撞器,ball挂了刚体Rigidbody,写了一个脚本ball挂载在球体上,球体从空中落下装机plane

碰撞检测

一、当两个物体发生碰撞时,也就是两个节点的碰撞器相互碰撞的时候,就会去调用节点上所关联的所有脚本对象的固定的函数

  1: OnCollisionEnter: 开始碰撞;
  2: OnCollisionExit: 碰撞离开;
  3: OnCollisionStay 碰撞持续;

ball脚本里面的内容:

using UnityEngine;
using System.Collections; public class ball : MonoBehaviour {
Rigidbody body;
// Use this for initialization
void Start () {
this.body = this.GetComponent<Rigidbody>();
} // 碰撞开始
void OnCollisionEnter(Collision c) {
Debug.Log("OnCollisionEnter " + c.gameObject.name);//打印出的名字是plane,不是ball,指的是撞到的对方是谁,参数是Collision类型的
} // 碰撞持续
void OnCollisionStay(Collision c) {
Debug.Log("OnCollisionStay " + c.gameObject.name);
}
// 碰撞结束
void OnCollisionExit(Collision c) {
Debug.Log("OnCollisionExit " + c.gameObject.name);
} // Update is called once per frame
void Update () { }
}

二、触发器的碰撞类型

  在Collider组件里面勾选is trigger就是开启触发器模式,这时候这个挂载Collider的节点的形状就变成透明的了,不会阻碍其他节点穿过它,但是依然在接触的时候调用触发函数。

  触发器的碰撞检测是不一样的,两个物体之间没有任何物理碰撞效果,但是只要有接触,就会调用触发器函数。

  我们给ball和plane之间创建一个trigger空节点,添加一个Box Collider的碰撞器,勾选is trigger,再写一个脚本trigger挂载在trigger下面,球的材质弹性设置为Maxinum类型

  这样每次ball穿过trigger节点掉到Plane上,再弹起来又穿过trigger都会去调用相关的触发器函数。

  1: OnTriggerEnter: 开始碰撞到触发器;
  2: OnTriggerExit: 与触发器结束碰撞;
  3: OnTriggerStay; 与触发器碰撞持续;

trigger脚本里面的内容:

using UnityEngine;
using System.Collections; public class trigger : MonoBehaviour { // Use this for initialization
void Start () { } // 开始和触发器碰撞
void OnTriggerEnter(Collider c) {
Debug.Log("OnTriggerEnter " + c.gameObject.name);//打印出的是ball的名字,不是plane,指的是撞到的对方是谁,参数是Collider类型的
} // 结束和触发器碰撞
void OnTriggerExit(Collider c) {
Debug.Log("OnTriggerExit " + c.gameObject.name);
} // 持续和触发器碰撞
void OnTriggerStay(Collider c) {
Debug.Log("OnTriggerStay " + c.gameObject.name);
} // Update is called once per frame
void Update () { }
}

三、配置物理管理器的碰撞关系

Edit-->Project Settings-->Physics

面板里面的参数都可以在代码中通过一个Physics类型的对象来调用,Physics这个类型非常重要,就是通过它可以在代码中设置Edit-->Project Settings-->Physics面板里面的内容:

1: Physics.gravity: 物理世界重力加速度;
2: bounceThreshold: 是否反弹的阈值
3: sleepThreshold: 低于这个能量,物体休眠
4: queriesHitTriggers: 射线碰撞检测是否检测trigger;
5: solverIterationCount / solverVelocityIterationCount;
6: defaultContactOffset 默认接触的偏差;
5: IgnoreCollision(Collider collider1, Collider collider2, bool ignore)配置忽略两个指定的碰撞器碰撞;
6: IgnoreLayerCollision(int layer1, int layer2, bool ignore) 配置两个层的物体是否碰撞;参数里面的Int类型的变量指的就是在右上角Add layer的时候,每个层前面对应的数值

创建一个game_root节点,下面挂载一个game_scene脚本

game_scene脚本的内容如下:

using UnityEngine;
using System.Collections; public class game_scene : MonoBehaviour {
public Collider ball;
public Collider trigger;
// Use this for initialization
void Start () {
Debug.Log(Physics.gravity);
Debug.Log(Physics.bounceThreshold); // Physics.IgnoreLayerCollision(8, 9);
Physics.IgnoreCollision(this.ball, this.trigger);//ball和trigger不发生碰撞检测,什么都不发生
} // Update is called once per frame
void Update () { }
}

关于Unity中的刚体和碰撞器的相关用法(二)的更多相关文章

  1. 关于Unity中的刚体和碰撞器的相关用法(一)

    1.创建一个3D工程 2.构造项目文件目录 3.保存场景为game_scene到文件夹scenes中 4.创建一个Plane平面类型的GameObject节点和一个Sphere球体类型的GameObj ...

  2. 关于Unity中的Mesh Collider碰撞器

    原来我的场景中有一个平面Plane带Mesh Collider碰撞器组件,一个主角Hero带有一个Box Collider碰撞器和有重力的Rigidbody刚体组件,主角可以放在平面上. 在导入场景后 ...

  3. Unity中的定时器与延时器

    JavaScript中的定时器与延时器,分别是 setInterval.setTimeout,对应的清理函数是:clearInterval.clearTimeout. 而在Unity中,则分别是:In ...

  4. 关于Unity中使用刚体制作简单跑酷案例

    一.步骤 1.创建一个Canvas 2.对Canvas进行初始化,记得把Game视图的分辨率调成和Canvas里面设置的一样的分辨率960X640 3.创建一个Image的UI节点作为Canvas的子 ...

  5. 【转】Unity中的协同程序-使用Promise进行封装(二)

    原文:http://gad.qq.com/program/translateview/7170970 译者:王磊(未来的未来)    审校:崔国军(飞扬971)   在上一篇文章中,我们的注意力主要是 ...

  6. Java中unicode增补字符(辅助平面)相关用法简介

    转载自 http://blog.csdn.net/gjb724332682/article/details/51324036 前言 Java从1.5版本开始,加入了unicode辅助平面的支持.相关的 ...

  7. 碰撞器与触发器[Unity]

    请看原帖,移步:Unity3d碰撞检测中碰撞器与触发器的区别 要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动.碰撞体是物理组件的一类,它要与刚体一起添加 ...

  8. [Unity2D]Box Collider 2D盒子碰撞器

    盒子碰撞器(BoxCollider2D)是Unity2D中常用的碰撞器,所有为碰撞器,顾名思义,就是用于检测物体之间的碰撞情况的,Unity2D里面除了BoxCollider2D碰撞器之外还集成Box ...

  9. Unity3D笔记 英保通十 射线碰撞器检测

    射线碰撞检测可以用来检测方向和距离: 通过Physics.RayCast光线投射来实现:常用于射击利用发射的射线来判断.还有对战中刀剑交战中.. 一.要涉及到RayCast和RayCastHit 1. ...

随机推荐

  1. C和指针第13章第4题

    题目:编写一个函数,它用于对一个任何类型的数组进行排序. 算法核心代码sort函数实现 /** 功能说明:sort函数可以对不同类型的数据进行排序 参数: 1.一个指向需要排序的数组的第一个值的指针. ...

  2. Adding support for distinct operation for table API on DataStream

    https://github.com/apache/flink/pull/6521/files/66c3bd5d52a5e4af1f83406035b95774e8b6f636#diff-680b30 ...

  3. how to build jdk 9 source code

    http://hg.openjdk.java.net/build-infra/jdk9/raw-file/tip/README-builds.html#vs2013 http://royvanrijn ...

  4. cocoside 编译错误可能问题

    版本不对..查看/usr/xxx/.profile中console等的全局变量 安装了不和谐的版本..记得删除application/cosos 重新安装. 或者干掉cocostudio

  5. 用户手势检测-GestureDetector使用详解

    一.概述 当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等. 一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的o ...

  6. Python 操作redis有序集合(sorted set)

    #coding:utf8 import redis r =redis.Redis(host=") 1.Zadd Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中.如果某个成员 ...

  7. 【Windows】windows核心编程整理(下)

    windows核心编程整理(上) windows核心编程整理(下) 线程的堆栈 每当创建一个线程时,系统就会为线程的堆栈(每个线程有他自己的堆栈)保留一个堆栈空间区域,并将一些物理存储器提交给这个以保 ...

  8. kindeditor自定义插件插入视频代码

    kindeditor自定义插件插入视频代码 1.添加插件js 目录:/kindeditor/plugins/diy_video/diy_video.js KindEditor.plugin('diy_ ...

  9. ubuntu14.04 +nginx+php5-fpm

    一,安装Nginx apt-get install nginx 1,配置nginx nginx所有的配置在 /etc/nginx/nginx.conf中 nginx.conf配置里面包括了 inclu ...

  10. js 时间格式化和时间戳

    formatMessageTime: function (time) { var week = { "0": "星期日", "1": &qu ...