如何调整Vector3位置,使玩家传送后远离碰撞起始点
解决玩家传送回碰撞起始位置导致重复碰撞的问题
当前实现逻辑
- 玩家进入outbound碰撞体时,记录当前位置:
public void outboundEnter() { lastOutsidePosition = player.transform.position; }
- 若玩家数秒内未离开碰撞体,执行传送操作:
public void teleportOut() { player.transform.position = lastOutsidePosition; }
遇到的问题
lastOutsidePosition是碰撞触发的起始位置,传送后玩家会立刻再次触发碰撞。尝试用lastOutsidePosition.normalized * 1.3调整位置,但未达到预期效果。
可行解决方案
方案1:基于碰撞体中心的反向偏移
通过计算玩家与碰撞体中心的方向,往远离碰撞体的方向偏移一段距离,确保传送位置在碰撞体外:
public Collider outboundCollider; // 拖拽赋值你的outbound碰撞体 public float safeOffsetDistance = 1.5f; // 可根据实际场景调整偏移距离 public void outboundEnter() { // 计算玩家到碰撞体中心的方向向量(归一化后保证方向一致) Vector3 awayFromColliderDir = (player.transform.position - outboundCollider.bounds.center).normalized; // 记录偏移后的安全位置 lastOutsidePosition = player.transform.position + awayFromColliderDir * safeOffsetDistance; }
方案2:针对规则碰撞体的边界偏移
如果outbound是BoxCollider这类规则形状的碰撞体,可以根据玩家在碰撞体边界的位置,直接向外部偏移:
public BoxCollider outboundBoxCollider; public float edgeOffset = 1.0f; public void outboundEnter() { Bounds colliderBounds = outboundBoxCollider.bounds; Vector3 playerPos = player.transform.position; Vector3 safePos = playerPos; // 根据玩家相对于碰撞体边界的位置,向外偏移 if (playerPos.x < colliderBounds.min.x) safePos.x -= edgeOffset; else if (playerPos.x > colliderBounds.max.x) safePos.x += edgeOffset; if (playerPos.z < colliderBounds.min.z) safePos.z -= edgeOffset; else if (playerPos.z > colliderBounds.max.z) safePos.z += edgeOffset; // 3D场景下补充Y轴处理 if (playerPos.y < colliderBounds.min.y) safePos.y -= edgeOffset; else if (playerPos.y > colliderBounds.max.y) safePos.y += edgeOffset; lastOutsidePosition = safePos; }
方案3:修正你的归一化尝试
之前的lastOutsidePosition.normalized * 1.3无效,是因为直接对位置向量归一化会丢失原位置的空间信息。正确的做法是基于碰撞方向做偏移,比如利用碰撞体的法线方向:
public Collider outboundCollider; public float offset = 1.2f; public void outboundEnter() { // 以碰撞体的向上方向为基础,结合远离中心的方向做偏移 Vector3 safeOffset = outboundCollider.transform.up * 0.3f + (player.transform.position - outboundCollider.bounds.center).normalized * offset; lastOutsidePosition = player.transform.position + safeOffset; }
内容的提问来源于stack exchange,提问作者anderlaini
相关产品推荐
相关产品推荐

