在 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;
    }