c# - 如何为 Unity 获取帧速率独立的触摸位置?

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

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

最佳答案

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

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

关于c# - 如何为 Unity 获取帧速率独立的触摸位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32908582/

相关文章:

c# - 如何合并两张图片?

c# - iTextSharp RegionTextRenderFilter 在宽度的情况下不起作用

android - 如何更改我的 Android 设备上的 MAC 地址?

android - Database.Logger.Level 枚举值在版本 11.0.0 中不可访问

ios - IOS 如何管理后台应用程序的内存?

ios - Flutter iOS 如何显示下载通知成功?

c# - 当 TimeZoneInfo.ConvertTimeToUtc 对于某些 DateTime 值时调用异常

c# - 无法加载文件或程序集 'System.Web.Optimization' 或其依赖项之一

android - 在android中访问gridview内的单元格

ios - 如何更改 UILabel 行中的垂直边距/间隙