Unity2D动态激光对撞:添加与光束等长的触发BoxCollider2D
激光触碰触发死亡实现方案
前置配置
- 给挂载当前激光脚本的GameObject添加
BoxCollider2D组件,勾选组件面板上的Is Trigger选项,开启触发模式 - 确保玩家对象身上挂载了
Collider2D(任意2D碰撞体均可)和Rigidbody2D组件(Unity2D触发检测的必要条件)
完整实现代码
{ private LineRenderer lineRenderer; private BoxCollider2D laserCollider; public Transform LaserHit; // 可根据LineRenderer的实际宽度调整,和激光显示宽度保持一致即可 public float laserWidth = 0.1f; // 无碰撞时的最大激光长度,避免Raycast无命中时报错 public float maxLaserLength = 10f; void Start() { lineRenderer = GetComponent<LineRenderer>(); laserCollider = GetComponent<BoxCollider2D>(); lineRenderer.useWorldSpace = true; // 初始化碰撞体宽度 laserCollider.size = new Vector2(laserWidth, 0); } void Update() { RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.up); Vector2 endPoint; // 判断Raycast是否命中物体 if (hit.collider != null) { endPoint = hit.point; } else { endPoint = (Vector2)transform.position + (Vector2)transform.up * maxLaserLength; } LaserHit.position = endPoint; lineRenderer.SetPosition(0, transform.position); lineRenderer.SetPosition(1, endPoint); // 同步更新碰撞体参数 float laserLength = Vector2.Distance(transform.position, endPoint); // 设置碰撞体尺寸,y轴为激光长度,x轴为预设的激光宽度 laserCollider.size = new Vector2(laserWidth, laserLength); // 碰撞体位置设为激光的中点,保证覆盖整段激光 laserCollider.offset = new Vector2(0, laserLength / 2); } // 触发检测逻辑 private void OnTriggerEnter2D(Collider2D other) { // 自行修改为你实际的玩家对象标签 if (other.CompareTag("Player")) { // 替换为你已经开发完成的玩家死亡方法即可 other.GetComponent<你的玩家脚本类名>().PlayerDeath(); } } }
注意事项
- 代码里的
laserWidth数值要和你LineRenderer组件上设置的Start Width、End Width数值保持一致,避免碰撞范围和激光显示宽度不匹配 - 记得把玩家对象的标签设置为
Player,或者把代码里的标签判断修改为你自己用的玩家标识 - 如果你的激光发射角度会动态变化,该逻辑也会自动适配,不需要额外修改代码
内容的提问来源于stack exchange,提问作者tok23
相关产品推荐
相关产品推荐

