我要在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
最佳答案
问题是,无法将发生在帧中间的触摸位置排队,因此通过“快速”滑动手指,您会错过图像上的某些纹素。你应该看看这条线公式 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/