在 Unity 中翻转枪时旋转枪
Rotating a gun while flipping it in Unity
我有一个 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);
}
但是,有一个小故障,您不能直接在玩家下方射击。 Here is the result。我设法使用以下代码部分修复了故障行为:(内部更新功能)
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);
}
这次减少了一些故障,武器精灵在屏幕底部翻转而没有转到玩家的另一边。然而,如果光标位于播放器的 closer/on 顶部,故障效果仍然会发生,并且还会导致奇怪的旋转行为。
This was the result。
我正在尝试找到一个消除故障行为的解决方案,您可以直接在玩家下方射击,并且武器不会在玩家底部旋转,如第二个 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 是使用玩家的位置而不是武器的位置计算的。但是,如果光标在玩家身上,枪支将从玩家位置指向外侧,而不是从枪支位置指向光标。这是代码:
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;
}
我有一个 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);
}
但是,有一个小故障,您不能直接在玩家下方射击。 Here is the result。我设法使用以下代码部分修复了故障行为:(内部更新功能)
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);
}
这次减少了一些故障,武器精灵在屏幕底部翻转而没有转到玩家的另一边。然而,如果光标位于播放器的 closer/on 顶部,故障效果仍然会发生,并且还会导致奇怪的旋转行为。 This was the result。
我正在尝试找到一个消除故障行为的解决方案,您可以直接在玩家下方射击,并且武器不会在玩家底部旋转,如第二个 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 是使用玩家的位置而不是武器的位置计算的。但是,如果光标在玩家身上,枪支将从玩家位置指向外侧,而不是从枪支位置指向光标。这是代码:
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;
}