zoukankan      html  css  js  c++  java
  • 关于Unity中的刚体和碰撞器的相关用法(二)

    在关于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 () {
        
        }
    }
  • 相关阅读:
    程序员年后离职跳槽指南
    程序员年后离职跳槽指南
    程序员为什么会有职业瓶颈?
    程序员为什么会有职业瓶颈?
    年过35岁的程序员都去哪了?一张图道尽老程序员们的花样出路
    年过35岁的程序员都去哪了?一张图道尽老程序员们的花样出路
    对于Ping的过程,你真的了解吗?
    对于Ping的过程,你真的了解吗?
    shell解析命令行的过程以及eval命令
    shell的命令替换和命令组合
  • 原文地址:https://www.cnblogs.com/HangZhe/p/7209817.html
Copyright © 2011-2022 走看看