我有一个c#脚本,可以旋转枪指向光标。当光标在玩家上方或下方时,我需要将枪翻转到玩家的另一侧。 我用以下脚本解决了这个问题:(在更新功能内(
Vector2 weaponDistance = Camera.main.ScreenToWorldPoint(Input.mousePosition) - weapon.transform.position;
float weaponRotation = Mathf.Atan2 (weaponDistance.y, weaponDistance.x) * Mathf.Rad2Deg;
if (weaponRotation < 90f && weaponRotation > -90f)
{
Debug.Log("Facing Right");
weapon.transform.localPosition = leftWeaponPosition;
weapon.transform.localRotation = Quaternion.Euler (0f, 0f, weaponRotation);
}
else
{
Debug.Log("Facing Left");
weapon.transform.localPosition = rightWeaponPosition;
weapon.transform.localRotation = Quaternion.Euler (180f, 0f, -weaponRotation);
}
但是,有一个故障,您无法直接在播放器下方射击。这是结果。我设法使用以下代码部分修复了故障行为:(内部更新功能(
Vector2 weaponDistance = Camera.main.ScreenToWorldPoint(Input.mousePosition) - weapon.transform.position;
float weaponRotation = Mathf.Atan2 (weaponDistance.y, weaponDistance.x) * Mathf.Rad2Deg;
if (weaponRotation < 90f && weaponRotation > -90f)
{
if (weaponRotation < 65f && weaponRotation > -65f)
{
Debug.Log("Facing Right");
weapon.transform.localPosition = leftWeaponPosition;
}
weapon.transform.localRotation = Quaternion.Euler (0f, 0f, weaponRotation);
}
else
{
if ((weaponRotation > 115f && weaponRotation < 155f) || (weaponRotation > -155f && weaponRotation < -115f))
{
Debug.Log("Facing Left");
weapon.transform.localPosition = rightWeaponPosition;
}
weapon.transform.localRotation = Quaternion.Euler (180f, 0f, -weaponRotation);
}
这次减少了一些故障,武器精灵在屏幕底部翻转,没有进入玩家的另一侧。但是,如果光标靠近/位于播放器顶部,则仍然会发生毛刺效果,并且还会导致奇怪的旋转行为。 这就是结果。
我正在尝试找到一种解决方案,消除故障行为,您可以直接在玩家下方射击,并且武器不会在播放器底部旋转,如第二个 gif 示例所示。谢谢!
尝试缩小约束,您可以决定鼠标位置的一侧。将屏幕切成两半,然后调整角度。
我有两种方法可以解决这个问题。首先只是改变 weaponDistance 变量,这样就不是找到光标和武器之间的差异,而是找到光标和玩家之间的差异。所以它基本上是替换:
Vector2 weaponDistance = Camera.main.ScreenToWorldPoint(Input.mousePosition) - weapon.transform.position;
跟
Vector2 weaponDistance = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
这样可以阻止故障,您也可以直接在播放器上方射击。然而,仍然有一些奇怪的行为,即枪在移动到玩家的另一侧之前翻转。另一个是当光标在玩家身上时,枪指向外面。我通过重写代码的逻辑修复了第一个问题。在下面的代码中,枪始终朝光标旋转。它检查光标与玩家的距离,如果光标离武器足够近,它会在不切换侧面的情况下旋转武器。这可以防止故障。但是,如果光标靠近玩家,则枪旋转而不翻转。这意味着在某些情况下,枪会在玩家的精灵上旋转。
weaponDistance = Camera.main.ScreenToWorldPoint(Input.mousePosition) - weapon.transform.position;
weaponRotation = Mathf.Atan2(weaponDistance.y, weaponDistance.x) * Mathf.Rad2Deg;
if (isFacingRight)
{
if (weaponRotation < 115f && weaponRotation > -115f)
{
weapon.transform.localPosition = rightWeaponPosition;
weapon.transform.localRotation = Quaternion.Euler(0f, 0f, weaponRotation);
}
else
{
if (Vector2.Distance(transform.localPosition, Camera.main.ScreenToWorldPoint(Input.mousePosition)) < 0.8f)
weapon.transform.localRotation = Quaternion.Euler(0f, 0f, weaponRotation);
else
isFacingRight = false;
}
}
else
{
if ((weaponRotation > 65f && weaponRotation < 180f) || (weaponRotation > -180f && weaponRotation < -65f))
{
weapon.transform.localPosition = leftWeaponPosition;
weapon.transform.localRotation = Quaternion.Euler(180f, 0f, -weaponRotation);
}
else
{
if (Vector2.Distance(transform.localPosition, Camera.main.ScreenToWorldPoint(Input.mousePosition)) < 0.8f)
weapon.transform.localRotation = Quaternion.Euler(0f, 0f, weaponRotation);
else
isFacingRight = true;
}
}
下一个选项使用相同的逻辑,但利用原始修复,其中 武器距离 是使用玩家的位置而不是武器的位置计算的。但是,如果光标在玩家身上,枪将从玩家的位置向外指向,而不是从枪的位置指向光标。这是代码:
weaponDistance = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
weaponRotation = Mathf.Atan2(weaponDistance.y, weaponDistance.x) * Mathf.Rad2Deg;
if (isFacingRight)
{
if (weaponRotation < 115f && weaponRotation > -115f)
{
weapon.transform.localPosition = rightWeaponPosition;
weapon.transform.localRotation = Quaternion.Euler(0f, 0f, weaponRotation);
}
else
isFacingRight = false;
}
else
{
if ((weaponRotation > 65f && weaponRotation < 180f) || (weaponRotation > -180f && weaponRotation < -65f))
{
weapon.transform.localPosition = leftWeaponPosition;
weapon.transform.localRotation = Quaternion.Euler(180f, 0f, -weaponRotation);
}
else
isFacingRight = true;
}