Unity 2D中角色朝向左侧时手臂无法正常跟随光标旋转问题
问题根因分析
- 旋转赋值逻辑冲突:先对
transform.rotation赋值世界坐标旋转,后续又修改localRotation,部分操作被覆盖 - 角色朝向判断不可靠:直接判断
myPlayer.transform.eulerAngles.y == 0存在浮点数精度误差,容易出现判断失效的情况 - 朝向左侧时的翻转逻辑错误:硬编码的
rotationZ - 50属于无意义的偏移,且角度范围判断没有适配角色朝向变化后的前后方定义 - 角度判断逻辑只适配了角色朝右的场景:当角色朝左时,“前方”对应的角度范围已经变为±90度以外的区域,原判断条件刚好把身后区域判定为不需要翻转的范围
修复方案
直接根据角色当前朝向适配旋转计算逻辑,移除冗余的重复赋值操作,修复后的代码如下:
using UnityEngine; public class pivot : MonoBehaviour { public GameObject myPlayer; private void FixedUpdate() { // 计算鼠标和手臂支点的世界坐标差 Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); Vector3 difference = mouseWorldPos - transform.position; difference.Normalize(); // 计算原始旋转角度 float rotationZ = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg; // 判断角色当前朝向:y轴旋转接近0为朝右,接近180为朝左 // 如果你是通过修改scale.x实现角色翻转,这里改为 bool isFacingRight = myPlayer.transform.scale.x > 0f 即可 bool isFacingRight = myPlayer.transform.eulerAngles.y < 90f; if (isFacingRight) { // 朝右时的翻转逻辑:光标在身后时翻转手臂 if (rotationZ < -90 || rotationZ > 90) { transform.localRotation = Quaternion.Euler(180, 0, -rotationZ); } else { transform.localRotation = Quaternion.Euler(0, 0, rotationZ); } } else { // 朝左时的翻转逻辑:角度范围判断取反 if (rotationZ > -90 && rotationZ < 90) { transform.localRotation = Quaternion.Euler(180, 180, -rotationZ); } else { transform.localRotation = Quaternion.Euler(0, 180, rotationZ); } } } }
内容的提问来源于stack exchange,提问作者Nuno Coelho
相关产品推荐
相关产品推荐

