Unity 3D:3D物体像2D物体指向鼠标?已实现但不解代码原理
3D玩家朝向鼠标方向的代码原理解析
这段代码通过射线检测+方向向量计算,实现了3D玩家在水平面上跟随鼠标转向的效果,配合Rigidbody的旋转约束,完美模拟2D玩家的转向逻辑,下面拆解每一步的作用:
射线检测获取鼠标对应的3D世界点
Ray ray = cam.ScreenPointToRay(Input.mousePosition);:将鼠标的2D屏幕坐标转换成3D空间中的射线,这条射线从相机位置出发,穿过鼠标在屏幕上的点延伸到3D世界中。Physics.Raycast(ray, out RaycastHit hit):发射射线检测碰撞,当射线碰到带碰撞体的物体(比如地面)时,hit.point会存储鼠标在3D世界中对应的精确坐标,代码将这个坐标赋值给mousePos。
计算玩家到鼠标点的方向向量
rotation = new Vector3(mousePos.x-transform.position.x, mousePos.y-transform.position.y,mousePos.z-transform.position.z);:用鼠标点的坐标减去玩家当前坐标,得到的向量就是玩家指向鼠标点的方向,这个向量包含了X、Y、Z三个轴的方向信息。
剔除垂直方向的旋转影响
rotation.y = 0;:把方向向量的Y轴分量清零,只保留X-Z平面(水平面)上的方向。这一步确保玩家不会出现抬头或低头的旋转,完全贴合2D玩家仅在平面转向的需求。
设置玩家朝向
transform.forward = rotation;:Unity中transform.forward代表物体自身的前方向(默认对应世界坐标系的Z轴正方向),将处理后的水平方向向量赋值给它,就能让玩家的正面直接朝向鼠标点的水平方向,完成转向。
另外你给Rigidbody设置的X轴和Z轴旋转约束是必要的:虽然代码已经剔除了Y轴方向的影响,但约束旋转轴能彻底避免极端场景下(比如鼠标点和玩家位置完全重合)可能出现的微小旋转异常,确保玩家始终保持直立状态,只绕Y轴旋转。
内容的提问来源于stack exchange,提问作者WeirdIndianDude
相关产品推荐
相关产品推荐

