Unity 5中如何让拾取物随机生成且不嵌入墙体?
解决拾取物生成嵌入墙体的问题
问题
我在指定区域内生成拾取物时,总会出现部分拾取物嵌入墙体的情况,该怎么解决这个问题?
我当前用来生成拾取物的代码是这样的:
for (int x = 0; x < garbage.Length; x++) { if (x < 5) { garbage[x].transform.position = new Vector3(Random.Range(-33.0f, 30.0f), 2.35f, Random.Range(30.0f, -35.0f)); } }
已验证的解决方案
我已经通过Physics.OverlapSphere解决了这个问题,这里也分享下具体的实现思路,方便遇到同样问题的开发者参考:
核心逻辑就是在生成拾取物前先检查目标位置是否有障碍物:
- 先根据拾取物的大小设置一个合适的检测半径(比如0.5f,别太小也别太大)
- 生成随机位置后,用
Physics.OverlapSphere检测该位置周围是否存在墙体这类带碰撞体的物体 - 如果检测到障碍物,就重新生成随机位置,直到找到一个没有障碍物的合法位置
给大家一个具体的代码示例参考:
// 根据你的拾取物尺寸调整这个半径 float spawnCheckRadius = 0.5f; for (int x = 0; x < garbage.Length; x++) { if (x < 5) { Vector3 validSpawnPos; bool isPositionValid = false; // 循环直到找到合法的生成位置 while (!isPositionValid) { // 生成初始随机位置 validSpawnPos = new Vector3( Random.Range(-33.0f, 30.0f), 2.35f, Random.Range(30.0f, -35.0f) ); // 检测该位置周围的碰撞体 Collider[] nearbyColliders = Physics.OverlapSphere(validSpawnPos, spawnCheckRadius); // 判断是否合法:没有碰撞体,或者只有拾取物自身的碰撞体(如果你的拾取物带碰撞的话) isPositionValid = nearbyColliders.Length == 0 || nearbyColliders.All(col => col.gameObject.CompareTag("Pickup")); } // 设置拾取物位置 garbage[x].transform.position = validSpawnPos; } }
这个方法能有效避免拾取物穿墙的问题,亲测好用!
内容的提问来源于stack exchange,提问作者Ruben
相关产品推荐
相关产品推荐

