You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 2D种花游戏:如何获取鼠标指向Sprite对应位置的颜色?

获取Unity 2D Sprite鼠标指向位置颜色的实用方案

嘿,这个需求我之前做类似的放置类2D游戏时刚好碰到过,给你梳理几个实用的实现思路,一步步来就能搞定:

方法一:通过SpriteRenderer+Texture2D直接读取像素

这是最直接的方案,核心是把屏幕鼠标坐标转换成Sprite纹理的对应坐标,再读取颜色值:

  1. 前置准备:先去你的草地Sprite的Texture设置里,勾选Read/Write Enabled(在Inspector的Texture Importer面板里找),记得点Apply保存——不然Unity不让你读取纹理像素哦。

  2. 核心代码示例:

using UnityEngine;

public class FlowerPlacementChecker : MonoBehaviour
{
    public SpriteRenderer groundSpriteRenderer; // 把你的草地Sprite拖到这个字段里

    void Update()
    {
        if (Input.GetMouseButtonDown(0)) // 检测鼠标左键点击
        {
            // 第一步:屏幕坐标转世界坐标
            Vector2 worldMousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            // 第二步:世界坐标转Sprite的本地坐标(以Sprite左下角为原点)
            Vector2 localSpritePos = groundSpriteRenderer.transform.InverseTransformPoint(worldMousePos);
            
            // 第三步:转换成纹理的UV坐标(范围0-1)
            Vector2 uvPos = new Vector2(
                localSpritePos.x / groundSpriteRenderer.sprite.bounds.size.x + 0.5f,
                localSpritePos.y / groundSpriteRenderer.sprite.bounds.size.y + 0.5f
            );

            // 先判断是否点击到Sprite外面了
            if (uvPos.x < 0 || uvPos.x > 1 || uvPos.y < 0 || uvPos.y > 1)
            {
                Debug.Log("点击到草地外面啦");
                return;
            }

            // 第四步:UV坐标转纹理像素坐标
            Texture2D groundTexture = groundSpriteRenderer.sprite.texture;
            int pixelX = Mathf.FloorToInt(uvPos.x * groundTexture.width);
            int pixelY = Mathf.FloorToInt(uvPos.y * groundTexture.height);

            // 获取目标像素颜色
            Color targetColor = groundTexture.GetPixel(pixelX, pixelY);

            // 判断是否为绿色区域(别用绝对颜色相等,用通道阈值更靠谱)
            if (targetColor.g > 0.6f && targetColor.r < 0.4f && targetColor.b < 0.4f)
            {
                Debug.Log("这里是草地,可以放花!");
                // 在这里写你的花朵生成逻辑
            }
            else
            {
                Debug.Log("这里不是草地,不能放花哦");
            }
        }
    }
}
  1. 小提醒:
  • 如果你用的是正交相机(2D游戏标配),ScreenToWorldPoint的时候不用纠结Z值,直接用Input.mousePosition就行,正交相机的Z不影响坐标转换。
  • 绝对不要用targetColor == Color.green来判断,纹理压缩、抗锯齿都会让颜色有细微偏差,用RGB通道的阈值判断才稳。

方法二:结合2D射线检测优化精准度

如果你的草地Sprite已经加了贴合形状的PolygonCollider2D,可以先通过射线检测过滤掉点击到其他物体的情况,再读取颜色:

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        Vector2 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        RaycastHit2D hit = Physics2D.Raycast(mouseWorldPos, Vector2.zero);
        
        // 先判断是否点击到目标草地
        if (hit.collider != null && hit.collider.GetComponent<SpriteRenderer>() == groundSpriteRenderer)
        {
            // 这里直接复用方法一里的坐标转换和颜色读取逻辑就行
        }
    }
}

优化小技巧

  • 如果你的草地纹理很大,频繁调用GetPixel会有小开销,可以提前用Texture2D.GetPixels()把整个纹理的像素数组读出来缓存,之后直接查询数组,能提升性能。
  • 要是需要实时预览(比如鼠标悬停时显示能否放置),把Input.GetMouseButtonDown改成在Update里实时检测就行。

内容的提问来源于stack exchange,提问作者Lari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:15:49