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

请求修改Unity敌人视野检测脚本:实现玩家进入视野即触发检测

解决Unity敌人AI视野检测:玩家任意部位进入即触发检测

原脚本仅通过玩家Transform中心点判断是否在视野范围内,要实现玩家任何部位进入视野即被检测,我们可以结合玩家的碰撞体(如CapsuleCollider2D),提取其包围盒的关键顶点,逐一判断这些顶点是否满足视野条件,只要有一个顶点符合要求,就判定检测到玩家。

修改后的完整代码

// 假设target是玩家GameObject,需确保玩家带有Collider2D组件
private bool IsPlayerInVision()
{
    if (target == null)
    {
        return false;
    }

    // 获取玩家的Collider2D组件(根据实际类型替换,比如CapsuleCollider2D)
    Collider2D playerCollider = target.GetComponent<Collider2D>();
    if (playerCollider == null)
    {
        // 如果玩家没有碰撞体, fallback到原逻辑(检测中心点)
        return CheckPointInVision(target.transform.position);
    }

    // 获取玩家碰撞体的世界空间边界点
    Bounds bounds = playerCollider.bounds;
    Vector2[] checkPoints = new Vector2[]
    {
        bounds.min, // 左下
        new Vector2(bounds.min.x, bounds.max.y), // 左上
        bounds.max, // 右上
        new Vector2(bounds.max.x, bounds.min.y), // 右下
        bounds.center // 中心(保留原检测逻辑作为补充)
    };

    // 遍历所有边界点,只要有一个点在视野内且无遮挡就返回true
    foreach (Vector2 point in checkPoints)
    {
        if (CheckPointInVision(point) && !IsObstructed(point))
        {
            return true;
        }
    }

    return false;
}

// 封装原有的单个点视野检测逻辑
private bool CheckPointInVision(Vector2 point)
{
    // 检查距离是否在视野范围内
    float distance = Vector2.Distance(transform.position, point);
    if (distance > visionRange)
    {
        return false;
    }

    // 检查角度是否在视野角度内
    Vector2 toPoint = point - (Vector2)transform.position;
    Vector2 visionDirection = GetVisionDirection();
    float angle = Vector2.Angle(visionDirection, toPoint);
    
    return angle <= visionAngle / 2;
}

// 障碍物检测逻辑(补全原TODO部分)
private bool IsObstructed(Vector2 targetPoint)
{
    Vector2 direction = targetPoint - (Vector2)transform.position;
    float distance = direction.magnitude;

    // 发射射线检测是否有障碍物(可根据需求调整LayerMask)
    RaycastHit2D hit = Physics2D.Raycast(transform.position, direction.normalized, distance, LayerMask.GetMask("Obstacle"));
    
    // 如果射线击中了非玩家的对象,说明有遮挡
    return hit.collider != null && hit.collider.gameObject != target;
}

关键修改说明

  • 多顶点检测:提取玩家碰撞体的边界顶点(左下、左上、右上、右下、中心),覆盖玩家整个身体区域,只要任意顶点符合视野条件即触发检测。
  • 逻辑封装:将单点检测逻辑封装为CheckPointInVision方法,提升代码复用性。
  • 障碍物检测补全:通过Physics2D.Raycast实现遮挡检测,避免敌人穿墙检测到玩家。
  • 兼容性处理:若玩家无碰撞体,自动 fallback到原中心点检测逻辑,避免运行报错。

内容的提问来源于stack exchange,提问作者Samuel Gustavo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:55:57