如何获得Unity的帧率独立触摸位置?

时间:2015-10-02 13:45:05

标签: c# android ios input unity3d

我要在Unity制作一个移动绘画游戏,但我遇到了一个严重的问题:Unity中的Input类是依赖于帧的。因此,我不能经常获得触摸的位置,以使我的应用程序顺利绘制;因此,我得到的东西就像背景上的点,而不是彼此之间的连接。

我尝试连接在Unity中检测到的点,当然,我的结果只是与线相关的点。我在Unity Editor中尝试使用大约180-200 fps,而在30-50 fps的手机上,它看起来更糟糕。我希望我必须在android studio或Xcode中以某种方式获得触摸位置,然后才在Unity编辑器中的C#代码中使用它们。

我是否正确使用Unity工具中的extern,或者还有另一种更简单的方法可以直接在Unity中使用它?如果没有,我是对的,有人可以给我一些链接指南/教程如何做到并将它与Unity集成?我从来没有在Unity之外工作过,没有经验可以集成一些外部工具。

注意:我尝试过没有任何运气的FixedUpdate - 我试图获取位置变量的频率并不重要,而是关于它们更新的频率;我也在OnGUI方法中尝试了Event.current.mousePosition(在统一编辑器中),但它也没有给我带来任何区别。

更新:正如我已经说过的,我需要比输入类给我更频繁地获得位置。它的更新速度不够快!这是我得到的,没有连接点。图像显示mousePosition检测频率为180-200 fps。在手机上它甚至更慢! enter image description here

更新:这是我的简化代码。

void Draw() //this method is invoked every frame
     {
         //some calculations of x and y based on Input variables
         currentMousePosition = new Vector2( x, y); //current mouse position on sprite
         if(currentMousePosition != previousMousePosition)
             {
                 while(currentMousePosition != previousMousePosition)
                 {
                 mySprite.texture.SetPixels((int)previousMousePosition.x, (int)previousMousePosition.y, 3,3, myColorArray);
                                 if (currentFrameMousePos.x > previousFrameMousePos.x)
                                     previousFrameMousePos.x++;
                                 if (currentFrameMousePos.x < previousFrameMousePos.x)
                                     previousFrameMousePos.x--;
                                 if (currentFrameMousePos.y > previousFrameMousePos.y)
                                     previousFrameMousePos.y++;
                                 if (currentFrameMousePos.y < previousFrameMousePos.y)
                                     previousFrameMousePos.y--;
                   }
             } else mySprite.texture.SetPixels((int)currentMousePosition.x, (int)currentMousePosition.y, 3,3, myColorArray);
             previousMousePosition = currentMousePosition;
     }
     //mySprite.texture.Apply() is invoked independently in another place to improve performance

1 个答案:

答案 0 :(得分:3)

问题是,不可能排队发生在帧中间的触摸位置,所以&#34;快速&#34;滑动手指,您将错过图像上的某些纹素。你应该看看这一行公式Bresenham's line algorithm。这是超快的,所有整数数学。在Update()函数内部调用此方法。

    Vector2 oldPoint;
    public void UpdateDrawPoint(Vector2 newPoint){
        BresenhamLine(newPoint, oldPoint);
        oldPoint = newPoint;
    }