【问题标题】:Camera rotation not roatating correct on mobile相机旋转无法在移动设备上正确旋转
【发布时间】:2022-08-15 07:48:43
【问题描述】:

我正在制作 FPS 并且我希望玩家旋转相机,我的代码适用于 PC,但如果我正在旋转相机并且我还触摸了开火按钮(或用我的另一根手指在其他任何地方),则可以在移动设备上使用相机向右旋转(这里是我的开火按钮),我不知道我是否可以做点什么,或者我需要取消 android 和 IOS 的发布,只为 PC 发布我的游戏

我的部分代码:

if (CanProcessInput())
        {

            // Check if this look input is coming from the mouse
            bool isGamepad = Input.GetAxis(stickInputName) != 0f;
            float i = isGamepad ? Input.GetAxis(stickInputName) : Input.GetAxisRaw(mouseInputName);

            // handle inverting vertical input
            if (InvertYAxis)
                i *= -1f;

            // apply sensitivity multiplier
            i *= LookSensitivity;

            if (isGamepad)
            {
                // since mouse input is already deltaTime-dependant, only scale input with frame time if it\'s coming from sticks
                i *= Time.deltaTime;
            }
            else
            {
                // reduce mouse input amount to be equivalent to stick movement
                i *= 0.01f;
#if UNITY_WEBGL
                    // Mouse tends to be even more sensitive in WebGL due to mouse acceleration, so reduce it even more
                    i *= WebglLookSensitivityMultiplier;
#endif
            }

            return i;
        }

    标签: android unity3d


    【解决方案1】:

    分割触摸输入,以便您忽略在触发按钮区域中生成的值。您可以通过检查Touch. position value 来做到这一点:

    描述

    屏幕空间像素坐标中的触摸位置。

    Position 返回触摸触点在拖动时的当前位置。如果您需要触摸的原始位置,请参阅Touch.rawPosition

    文档也暗示了您可能感兴趣的内容 - 原始触摸位置。您的问题主体询问水平运动,但您的代码引用了 y 值。位置坐标以(宽度,高度)给出,所以我只是想事先说明一下,我将使用 x 值来回答您关于水平运动的问题。

    因此,如果您知道屏幕的左下角是 (0,0),并且您可以使用Screen.width 来获取以像素为单位的宽度,那么您可以计算屏幕右侧 20% 的位置作为开火按钮的保留位置.小于该值的任何值都是可接受的旋转输入,但 80% 的宽度像素将是最大允许输入:

    private int maxAllowablePixel;
    void Start()
    {
        maxAllowablePixel = 0.8f * Screen.width;
    }
    

    如果原始触摸小于该值,则仅将触摸处理为旋转:

    if(touch.rawPosition.x < maxAllowablePixel)
    {
        DoRotation(touch.position);
    }
    

    再次在这里,您允许用户将手指放在屏幕中间,将其拖动到启动按钮上,并且仍然旋转那么多,但是源自启动按钮“禁区”的任何触摸都将被忽略进行轮换的目的。

    此外,当您进行旋转时,请在手指现在的位置 (Touch.position) 而不是开始的位置 (Touch.rawPosition) 进行。

    【讨论】:

      【解决方案2】:

      我总是解决这样的问题的方法是不直接使用触摸位置,而是在 Canvas 中使用实现IDragHandler 的脚本有一个“TouchReceiver”对象。所以这个类可能看起来像这样:

      [RequireComponent(typeof(Image))]
      public class TouchReceiver : MonoBehaviour, IDragHandler
      {
          public void OnDrag(PointerEventData data)
          {
              Vector2 delta = data.delta;
      
              // do something with delta, like rotating the camera.
          }
      }
      

      然后像这样设置你的画布:

      确保将“TouchReceiver”在后面开火按钮,这样OnDrag 事件在按下开火按钮时不会发生,因为开火按钮会阻止“TouchReceiver”对象本身。 “TouchReceiver”对象需要有一个Image 组件,否则它将无法接收任何触摸。当然,图像应该是完全透明的。

      使用此设置很容易移动点火按钮而无需更改任何其他内容。在适应不同的屏幕分辨率时,这也可能会派上用场。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-20
        • 1970-01-01
        相关资源
        最近更新 更多