unity3d 在Unity C#和NGUI中创建拾色器有更好的方法吗?

ghg1uchk  于 2023-01-21  发布在  C#
关注(0)|答案(1)|浏览(158)

我在Unity中创建了一个艺术程序/游戏,但是我需要为在其中构建东西的艺术家创建一个颜色选择器。我使用NGUI UI系统,并且我已经创建了一个基本的sprite,上面有一组颜色,沿着一个自定义颜色输入。
然而,要准确地选择其中一种颜色并不容易,我现在是这样做的:

IEnumerator CaptureTempArea()
{
    yield return new WaitForEndOfFrame();

    tex = new Texture2D(Screen.width, Screen.height);
    tex.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
    tex.Apply();

    Vector2 pos = UICamera.lastEventPosition;

    int x = (int)pos.x;

    int y = (int)pos.y;

    Color color = tex.GetPixel(x, y);

    Debug.Log(ColorToHex(color));

    Debug.Log(tex.GetRawTextureData().Length / 1000);

    Destroy(tex);
    tex = null;
}

然而,必须有一个更好的方法来捕获-只是-特定的区域。这确实准确地得到颜色,但是,它也产生了一个图像-即使是临时的-这是任何地方从2到8 MB的大小之前,它被清除的缓冲区。给定特定的UI系统,有没有一个更好的方法来创建一个颜色拾取器,或一个将使用更少的内存?

yhived7q

yhived7q1#

总的来说,我会优化一些东西,比如避免分配/阅读while纹理只是为了获得一个像素,并在整个会话中保持一个活跃的1x 1纹理...如果你的设备支持它,你也可以使用computebuffer从着色器传递颜色值...这是你的代码应该看起来像(我还没有测试它,只是重写了你的代码)

Texture2D tex;

void Start() {
    tex = new Texture2D(1, 1);
    //get the color printed by calling:
    StartCoroutine(CaptureTempArea());
}

IEnumerator CaptureTempArea() {
    yield return new WaitForEndOfFrame();
    Vector2 pos = UICamera.lastEventPosition;
    tex.ReadPixels(new Rect(pos.x, pos.y, 1, 1), 0, 0);
    tex.Apply();
    Color color = tex.GetPixel(0, 0);
    Debug.Log(ColorToHex(color));
}

void OnDestroy() {
    Destroy(tex);
}

相关问题