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

Unity调用SetPixel方法无法为指定像素上色问题求助

Unity SetPixel方法无法着色问题排查方案
  • 缺少纹理改动提交步骤
    SetPixel仅会修改CPU内存中的纹理像素数据,必须调用texture.Apply()方法才能将改动同步到GPU,渲染才会生效。这是最常见的触发原因,在SetPixel执行完成后追加该调用即可。
  • 纹理未开启读写权限
    选中你用到的纹理资源,在Inspector面板的导入设置中勾选「Read/Write Enabled」选项,否则脚本无权修改纹理像素数据。同时建议将纹理压缩格式设置为RGBA32无压缩,避免压缩格式导致的读写异常。
  • 坐标映射错误
    你当前获取的是UI控件的本地坐标,和Texture2D的像素坐标系并不匹配:
    • Unity的Texture2D默认以左下角为(0,0)原点,如果你的UI坐标是以左上角为原点,需要将Y轴反转:y = texture.height - 点击Y坐标
    • 如果你用到的Sprite是从大图中裁剪出来的,sprite.texture拿到的是完整大图,需要加上Sprite在大图中的偏移textureRendererSprite.textureRect.position才能对应到正确的像素位置
    • 额外优化:你当前的坐标转换代码int.Parse(mouseCoordinates.posInt.x.ToString())完全冗余,直接强转(int)mouseCoordinates.posInt.x即可,避免不必要的性能损耗。
  • 事件执行顺序异常
    OnPointerClick的执行顺序晚于Update中的鼠标点击判断,可能出现点击时你用到的posInt还是上一次的旧值,甚至首次点击未赋值的情况。建议直接把像素修改逻辑放到OnPointerClick方法内,避免顺序冲突。

修正后核心代码示例

// 铅笔工具脚本修正后
[SerializeField] private Sprite textureRendererSprite;
private Texture2D texture;
private MouseCoordinates mouseCoordinates;

void Start()
{
    mouseCoordinates = GetComponent<MouseCoordinates>();
    texture = textureRendererSprite.texture;
}

// 建议将逻辑迁移至MouseCoordinates的OnPointerClick中调用,此处仅为示例
void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        int x = (int)mouseCoordinates.posInt.x;
        int y = (int)mouseCoordinates.posInt.y;
        // 坐标越界校验,避免报错
        if(x >= 0 && x < texture.width && y >=0 && y < texture.height)
        {
            texture.SetPixel(x, y, Color.black);
            // 新增:提交改动到GPU
            texture.Apply();
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:48:01