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即可,避免不必要的性能损耗。
- Unity的Texture2D默认以左下角为(0,0)原点,如果你的UI坐标是以左上角为原点,需要将Y轴反转:
- 事件执行顺序异常
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
相关产品推荐
相关产品推荐

