Unity3D运行时如何为SpriteRenderer设置程序生成的Sprite
运行时修改SpriteRenderer的Sprite属性不生效解决方案
核心错误定位
你代码中Sprite.Create的第三个参数pivot(锚点) 传入值错误:Unity要求该参数为[0,1]区间的归一化相对坐标,你传入的是贴图像素绝对中心点,远大于1的数值会导致Sprite锚点偏移到贴图外几百个单位,最终生成的Sprite直接超出相机视野,看起来就像赋值未生效。
而Image组件会自动适配Sprite的锚点做UI布局,所以赋值给Image可以正常显示,这也验证了你生成的Sprite本身没有问题。
修复步骤
1. 修正Sprite.Create参数
显式传入正确的归一化锚点,以及匹配你项目设置的像素每单位(PPU,默认项目为100),同时增加空校验和Renderer刷新逻辑,修改后的setTexture方法如下:
public void setTexture(Texture2D texture) { // 参数说明: // 1. 纹理对象 // 2. 贴图使用区域 // 3. 归一化锚点,(0.5,0.5)为中心点 // 4. 像素每单位,和你项目Sprite默认导入设置的PPU保持一致 sp = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f), 100f); SpriteRenderer sr = background.GetComponent<SpriteRenderer>(); if (sr != null) { sr.sprite = sp; // 强制刷新Renderer,避免缓存问题 sr.enabled = false; sr.enabled = true; // 运行时可赋值后选中background对象,在Scene视图确认Sprite位置 Debug.Log($"Sprite更新完成,尺寸:{sp.rect.size},锚点:{sp.pivot}"); } }
2. 替换过时的WWW加载逻辑(可选,高版本Unity建议修改)
你使用的WWW类已经在Unity 2018+版本中被弃用,存在纹理加载异常的风险,替换为UnityWebRequestTexture加载更稳定,需要先引入命名空间:
using UnityEngine.Networking;
修改后的LoadTexture协程代码:
IEnumerator LoadTexture(string url) { using (UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(url)) { yield return uwr.SendWebRequest(); if (uwr.result != UnityWebRequest.Result.Success) { Debug.LogError("图片加载失败:" + uwr.error); } else { Texture2D texture = DownloadHandlerTexture.GetContent(uwr); Debug.Log("Loaded image size: " + texture.width + "x" + texture.height); setTexture(texture); } } }
3. 其他校验项
如果修改后仍不生效,检查以下配置:
- 确认Inspector面板中
background字段已经拖入正确的对象,不存在空引用 - 确认
background对象上SpriteRenderer组件的Color属性alpha值不为0,Sorting Layer、Order in Layer配置正确,没有被其他对象遮挡 - 运行时选中
background对象,查看Scene视图中Sprite是否存在,确认其位置在相机视野范围内
内容的提问来源于stack exchange,提问作者sesmajster
相关产品推荐
相关产品推荐

