Unity生存射击教程:PlayerController中鼠标与玩家位置差代码疑问
嘿,我当初啃这个教程的时候也对这个写法犯过嘀咕!咱们来拆解下为什么教程里要计算floorPoint - transform.position,而不是直接用floorPoint:
核心需求是「相对方向」而非「绝对位置」
咱们要实现的是让玩家看向鼠标相对于自己的方向,而不是鼠标点在世界里的绝对位置。举个例子:如果玩家站在场景的(10, 0, 10),鼠标点在(15, 0, 15),差值得到的是(5, 0, 5),这是从玩家指向鼠标的方向;如果玩家走到(20, 0, 20),鼠标还是点在(15, 0, 15),差值就变成(-5, 0, -5),玩家会自然转向身后的鼠标点。要是直接用floorPoint的世界坐标来计算转向,本质上其实也是在算相对方向,但你得额外处理坐标转换,不如直接用差值来得直观。过滤Y轴干扰,保证水平转向正确
玩家的transform.position是包含角色高度的(比如Y=1.5),而floorPoint是射线检测地面得到的点(Y=0)。计算差值后,我们通常会把Y轴设为0(比如new Vector3(direction.x, 0, direction.z)),这样就能确保角色只在水平面上转向,不会因为自身高度和地面的差导致抬头/低头的错误转向。如果你直接用floorPoint,要是不小心没过滤Y轴,角色可能会出现奇怪的倾斜转向。代码的复用性和扩展性
这个差值向量不仅能用来转向,后续如果要加「朝着鼠标方向移动」的逻辑,直接把这个向量归一化后就能当移动方向用。要是你只存floorPoint,每次需要方向的时候都得重新计算一遍差值,不如提前一步算好更高效。
至于你说只用floorPoint也能运行,大概率是测试场景里角色高度和地面高度差很小,或者你在代码里无意识地处理了XZ分量的方向计算,所以表面上没问题,但从规范和健壮性来说,计算相对位置的差值才是正确的写法哦!
内容的提问来源于stack exchange,提问作者Don_Huan

