当前位置: 首页 > ds >正文

Unity物理响应函数与触发器

一、物理响应函数(碰撞检测)

用于处理刚体间的物理碰撞,要求双方均有 Collider,且至少一方有 Rigidbody。双方 Collider 均不能勾选 Is Trigger

  1. OnCollisionEnter(Collision collision)

    • 触发时机:碰撞发生的第一帧(接触瞬间)
    • 典型场景:球撞击地面时播放音效
    void OnCollisionEnter(Collision collision) {if (collision.gameObject.tag == "Ground") {PlaySound("impact");}
    }
    

  2. OnCollisionStay(Collision collision)

    • 触发时机:碰撞持续期间每帧调用(除首尾帧)
    • 典型场景:物体在斜坡上滑动时持续施加摩擦力
    void OnCollisionStay(Collision collision) {ApplyFriction(collision.contacts[0].normal);
    }
    

  3. OnCollisionExit(Collision collision)

    • 触发时机:碰撞结束的分离瞬间
    • 典型场景:玩家离开平台时取消特殊状态
    void OnCollisionExit(Collision collision) {if (collision.gameObject.name == "MovingPlatform") {player.ResetState();}
    }
    


二、触发器响应函数

用于检测物体进入特定区域,要求:

  • 至少一方 Collider 勾选 Is Trigger
  • 至少一方有 Rigidbody(可为 Kinematic)
  1. OnTriggerEnter(Collider other)

    • 触发时机:另一物体进入触发器区域的第一帧
    • 典型场景:玩家拾取道具
    void OnTriggerEnter(Collider other) {if (other.CompareTag("Coin")) {Destroy(other.gameObject); // 销毁金币AddCoins(1);}
    }
    

  2. OnTriggerStay(Collider other)

    • 触发时机:物体停留在触发器内每帧调用
    • 典型场景:持续区域伤害(如毒圈)
    void OnTriggerStay(Collider other) {if (other.CompareTag("Player")) {other.GetComponent<Player>().TakeDamage(1); // 每帧扣血}
    }
    

  3. OnTriggerExit(Collider other)

    • 触发时机:物体离开触发器区域的第一帧
    • 典型场景:离开安全区警告
    void OnTriggerExit(Collider other) {if (other.CompareTag("Player")) {ShowWarning("离开安全区域!");}
    }
    


三、触发条件对比分析
条件碰撞响应 (OnCollision*)触发器响应 (OnTrigger*)
Collider 要求双方均非 Trigger至少一方为 Trigger
Rigidbody 要求至少一方有 Rigidbody至少一方有 Rigidbody
物理效果产生物理力(反弹/摩擦)无物理效果(直接穿透)
性能消耗较高(需计算物理反馈)较低(仅检测重叠)
典型应用场景物理交互(弹跳、推箱子)逻辑检测(收集品、陷阱)

四、关键注意事项
  1. 刚体运动类型影响

    • Kinematic Rigidbody:可触发碰撞/触发器事件,但不受物理力影响
    • Dynamic Rigidbody:参与完整物理模拟
  2. 静态碰撞体限制

    • 无 Rigidbody 的静态 Collider 可参与碰撞,但无法触发 OnTriggerEnter 等事件
  3. 执行顺序
    所有物理响应均在 FixedUpdate() 后执行,与渲染帧无关

  4. 优化建议

    • 避免在 Stay 函数中执行复杂计算
    • 使用 Layer 过滤不必要的碰撞检测:
    void OnCollisionEnter(Collision collision) {if (collision.gameObject.layer != LayerMask.NameToLayer("Enemy")) return; // 跳过非敌人层
    }
    

通过合理选择碰撞/触发器响应,可高效实现物理交互与游戏逻辑检测。

http://www.xdnf.cn/news/15951.html

相关文章:

  • C++类和对象(一)基础内容讲解
  • 2025暑假训练树状数组
  • 自动化立体仓库堆垛机控制系统上报堆垛机状态 FC5
  • MySQL 写入性能优化全攻略(附 GitHub 面试题项目链接)
  • 最终分配算法【论文材料】
  • laravel RedisException: Connection refused优雅草PMS项目管理系统报错解决-以及Redis 详细指南-优雅草卓伊凡
  • WSL的功能及用途
  • JavaScript空值安全深度指南
  • 单调队列深度解析(下)
  • 前端开发技巧:浏览器模拟弱网络环境
  • 【Linux】重生之从零开始学习运维之Nginx
  • 高可用架构设计与实践综述
  • XSS总结
  • 【RK3576】【Android14】固件烧录
  • 零基础学后端-PHP语言(第一期-PHP环境配置)
  • SQL核心语法与实战应用指南
  • MacOS:如何利用终端来操作用户
  • kafka--基础知识点--6.1--LEO、HW、LW
  • 2025 Data Whale x PyTorch 安装学习笔记(Windows 版)
  • react+antd+表格拖拽排序以及上移、下移、移到顶部、移到底部
  • react17更新哪些新特性
  • ARINC818协议综述
  • 48Days-Day03 | 删除公共字符,两个链表的第一个公共结点,mari和shiny
  • uniapp相关地图 API调用
  • servicemesh 学习
  • 实战分享:Web3 前端开发Defi项目
  • [硬件电路-39]:激光光路的光信号处理、模拟电路的电信号处理、数字电路的电信号处理、软件的信号处理,有哪些共通的操作、运算、变换?
  • 06-人机共生:Prompt之外的思考
  • 【RK3576】【Android14】USB开发调试
  • k8s 基本架构