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

Cinemachine相机下鼠标位置控制箭矢方向失效问题求助

问题分析与解决方案

你的问题核心是射击方向的计算逻辑错误:当前代码直接将射线命中的世界坐标点作为射击方向,而非从玩家位置指向该点的相对方向向量。当玩家远离原点时,这种直接使用世界坐标的方式会导致方向计算完全偏离预期。

修正后的代码

假设你有玩家的Transform引用(比如playerTransform),修改Update中的方向计算逻辑:

Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit raycastHit))
{
    // 计算从玩家位置到命中点的相对方向向量
    Vector3 shootDirection = raycastHit.point - playerTransform.position;
    // 移除Y轴分量,保持俯视角平面内的方向
    shootDirection.y = 0f;
    // 归一化方向向量,确保长度为1(避免距离影响箭矢速度)
    shootDirection.Normalize();
    
    arrowClass.SetUpArrowDirection(shootDirection);
}

额外排查点

  • 射线检测层过滤:确保Physics.Raycast只检测地面或目标层,避免误命中玩家自身、UI元素或场景中其他无关碰撞体。可以通过LayerMask参数限制检测范围,比如:
    LayerMask groundLayer = LayerMask.GetMask("Ground");
    if (Physics.Raycast(ray, out RaycastHit raycastHit, Mathf.Infinity, groundLayer))
    
  • 地面碰撞体检查:如果场景地面没有添加碰撞体,射线会无法命中,此时可以改用平面交点计算:
    Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
    Plane groundPlane = new Plane(Vector3.up, Vector3.zero); // Y=0平面
    if (groundPlane.Raycast(ray, out float enter))
    {
        Vector3 hitPoint = ray.GetPoint(enter);
        Vector3 shootDirection = hitPoint - playerTransform.position;
        shootDirection.y = 0f;
        shootDirection.Normalize();
        arrowClass.SetUpArrowDirection(shootDirection);
    }
    
  • Cinemachine相机设置:确认虚拟相机的跟随目标正确,且相机的投影模式(正交/透视)符合俯视角需求,避免ScreenPointToRay生成的射线方向错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:37:36