You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 03:12:32