unity3d 如何知道精灵的着色是否完成?

new9mtju  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(125)

我试图使颜色游戏中有三个对象的边界,三维立方体,和指针(管),在这里我画了一个三维立方体的指针通过改变其纹理,并把一个精灵的立方体,所以我想检测的条件,而我几乎完成了精灵边界内的着色我怎么能做到这一点在统一?
就像这张照片

我想知道如何检测边界精灵中几乎完全的着色。

ar5n3qh5

ar5n3qh51#

要检测子画面边界内的着色是否基本完成,您可以结合使用Unity内置的碰撞检测和图像处理技术。

  • 首先在精灵边框上创建一个精灵遮罩来遮罩立方体图像。这将允许你只对边框内的区域应用效果。
  • 然后使用Texture 2D类的GetPixels方法对边框内每个像素的颜色进行采样。将这些值存储在数组中。
  • 计算数组中所有像素的平均颜色。
  • 将平均颜色与预定义的阈值颜色进行比较,以确定着色是否完成。如果平均颜色与阈值颜色足够接近,则可以认为着色已完成。

当玩家正在绘制立方体时,循环重复步骤2-4,以不断检查着色是否完成。
着色完成后,您可以触发事件或在游戏中执行一些其他动作。

using UnityEngine;

public class ColorDetection : MonoBehaviour
{
    public SpriteRenderer spriteRenderer;
    public Texture2D maskTexture;
    public Color thresholdColor;

    private void Update()
    {
        Color averageColor = GetAverageColor();

        if (IsColorSimilar(averageColor, thresholdColor))
        {
            Debug.Log("Coloring is complete");
        }
    }

    private Color GetAverageColor()
    {
        Texture2D texture = spriteRenderer.sprite.texture;
        Rect spriteRect = spriteRenderer.sprite.rect;

        Color[] maskPixels = maskTexture.GetPixels();
        Color[] spritePixels = texture.GetPixels((int)spriteRect.x, (int)spriteRect.y, (int)spriteRect.width, (int)spriteRect.height);

        int count = 0;
        Color sum = Color.clear;

        for (int i = 0; i < maskPixels.Length; i++)
        {
            if (maskPixels[i].a > 0)
            {
                count++;
                sum += spritePixels[i];
            }
        }

        return sum / count;
    }

    private bool IsColorSimilar(Color a, Color b)
    {
        float delta = 0.05f;
        return Mathf.Abs(a.r - b.r) < delta && Mathf.Abs(a.g - b.g) < delta && Mathf.Abs(a.b - b.b) < delta;
    }
}

相关问题