Unity3D 仅在 x 和 z 轴上旋转时如何防止 "Tilt"?

Unity3D How to Prevent "Tilt" when rotating on x and z axis only?

(这是3d的。附上屏幕截图以供参考。)

我在这里或其他地方阅读了很多关于与我类似的问题的文章,但没有任何解决办法。我的手枪指向前方,我只在 x 和 z 轴(上、下、左、右)上旋转,但我的手枪总是向左或向右倾斜。我尝试了这样的解决方案 (Problems limiting object rotation with Mathf.Clamp())(用 x 代替 y)但我的枪最终冻结或处于奇怪的位置。我想我在这里遗漏了一个基本概念。

我还应该提到,向左、向右、向上向下旋转它们自己确实可以正常工作,但是当将它们组合在一起时,事情就会出错。例如:左旋转 > 然后向上旋转 > 然后左旋转然后我最终在标题位置

你可以在图片中看到我在左下角的控件只允许用户向上、向下和向右移动枪——但不知何故枪最终倾斜了,在这个屏幕截图中向右--- 我想防止向右或向左倾斜。

public void Update()
         {
             if (mButtonHeld) {
                 switch(mCurBtnName){
                     case "ButtonUp":
                     mPistol.transform.Rotate (PISTOL_INCREMENT, 0, 0); 

                     break;
                     case "ButtonDown":
                        mPistol.transform.Rotate (-PISTOL_INCREMENT, 0, 0); 

                     break;
                     case "ButtonLeft":
                         mPistol.transform.Rotate(0,0,-PISTOL_INCREMENT_LR);    

                     break;
                     case "ButtonRight":
                         mPistol.transform.Rotate(0,0,PISTOL_INCREMENT_LR);
                     break;
                 }
                         //How can I lock y axis here??
             } 
         }

将旋转应用于不同的轴是不可交换的;顺序很重要,这可能是导致您出现问题的原因。一个简单的解决方法是做类似的事情:

public void Start()
{
    (...)
    m_VectorPistolInitState = mPistol.transform.rotation;
}

public void Update()
{
    static float azimuth = 0;
    static float elevation = 0;
    if (mButtonHeld) {
        switch(mCurBtnName){
            case "ButtonUp":
                elevation += PISTOL_INCREMENT;
            break;
            case "ButtonDown":
                elevation -= PISTOL_INCREMENT;
            break;
            case "ButtonLeft":
                azimuth -= PISTOL_INCREMENT_LR;
            break;
            case "ButtonRight":
                azimuth += PISTOL_INCREMENT_LR;
            break;
        }

        mPistol.transform.rotation = m_VectorPistolInitState;
        mPistol.transform.Rotate(elevation,0,azimuth);
    } 
}