Unity3D 使用带刚体组件的预制体配合脚本自动生成一面墙时上层墙体被弹飞
异常效果如下图所示:
预制体是一个正方体(Cube),其参数设置如下图所示:
控制墙面生成的C#脚本如下所示:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Wall : MonoBehaviour { public Transform brick; // Use this for initialization void Start() { for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { Instantiate(brick, new Vector3(x, y, 0), Quaternion.identity); } } } // Update is called once per frame void Update() { } }
经过仔细观察,我们发现最底层的那一排砖块没有飞起来,只有上面几排的砖块像是发生的猛烈碰撞被撞飞的现象,认真审查使用预制体控制墙体生成的脚本后,发现刚体结构的砖块在生成到指定坐标位置时,会与已生成的物体出现重叠进而发生碰撞导致弹飞(在3D世界里是会非常严谨地模拟真实世界的),如下图所示:
主要原因是在生成砖块时,脚本里没有考虑到预制体和墙面生成控制脚本所挂载的物体自身的坐标,导致脚本坐标计算不准确,引发强硬碰撞。考虑好这些方面,重新调整脚本所强硬碰撞就不会发生了,便还是会有轻微的碰撞导致坐标有轻微偏移:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Wall : MonoBehaviour { public Transform brick; // Use this for initialization void Start() { for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { //将预制体brick的Y坐标也考虑进去,避免强硬碰撞发生 Instantiate(brick, new Vector3(x, y + brick.position.y, 0), Quaternion.identity); } } } // Update is called once per frame void Update() { } }
对于还会发生轻微碰撞的问题,可以将预制体的刚体(Rigidbody)的Position全部冻结来解决(Rotation也冻结的话可以防止转动):
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现