【问题标题】:How do I get frame-rate independent touch position for Unity?如何为 Unity 获得与帧速率无关的触摸位置?
【发布时间】:2015-10-02 13:45:04
【问题描述】:

我要在 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(in unity editor),但它也没有给我任何区别。

Upd:正如我已经说过的,我需要比 Input 类给我的位置更频繁地获得位置。更新不够快!这是我在没有连接点的情况下得到的。该图显示了 180-200 fps 的 mousePosition 检测频率。在手机上它甚至更慢!

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

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

【问题讨论】:

  • 看看这个:theappguruz.com/blog/…。这是它的视频:youtube.com/watch?v=eGetQbsifnA
  • 据我所知,如果我以这种方式使用线条渲染器会损害手机性能,此外,如何将所有这些线条保存为一张图片?
  • 能贴出你的相关代码吗?
  • @user3071284 我添加了代码。
  • 你应该用线连接点,不要指望只能用点在屏幕上绘制,没有程序这样做

标签: c# android ios input unity3d


【解决方案1】:

问题是,无法将发生在帧中间的触摸位置排队,因此通过“快速”滑动手指,您会错过图像上的某些纹素。你应该看看这条线公式Bresenham's line algorithm。这是超级快的,而且都是整数数学。在 Update() 函数中调用此方法。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    相关资源
    最近更新 更多