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也冻结的话可以防止转动):