使用C#将动画帧转为Texture遇类型错误的技术问询
解决Godot中SpriteFrames帧复制的类型转换问题
问题核心是Duplicate()方法返回的是Resource基类,而你需要的是AtlasTexture类型,必须显式转换才能访问Atlas属性。另外原代码还有一处逻辑疏漏:最后给局部变量_referenceFrames赋值不会改变Sprite实际使用的Frames资源,得直接替换Sprite.Frames。
修改后的完整代码:
public void UpdateTexture(Texture _texture) { SpriteFrames referenceFrames = Sprite.Frames; SpriteFrames updatedFrames = new SpriteFrames(); foreach (string anim in referenceFrames.GetAnimationNames()) { if (anim == "default") continue; updatedFrames.AddAnimation(anim); updatedFrames.SetAnimationSpeed(anim, referenceFrames.GetAnimationSpeed(anim)); updatedFrames.SetAnimationLoop(anim, referenceFrames.GetAnimationLoop(anim)); for (int i = 0; i < referenceFrames.GetFrameCount(anim); i++) { // 显式转换原帧为AtlasTexture,同时做空值检查 AtlasTexture originalFrame = referenceFrames.GetFrame(anim, i) as AtlasTexture; if (originalFrame == null) continue; // 复制后再次转换类型,替换纹理 AtlasTexture updatedFrame = originalFrame.Duplicate() as AtlasTexture; updatedFrame.Atlas = _texture; updatedFrames.AddFrame(anim, updatedFrame); } } // 直接替换Sprite的Frames资源,确保修改生效 Sprite.Frames = updatedFrames; }
关键修改点:
- 用
as关键字完成类型转换:把GetFrame()返回的Texture和Duplicate()返回的Resource都转成AtlasTexture,同时加空值检查避免空引用报错。 - 替换原局部变量赋值逻辑为
Sprite.Frames = updatedFrames,这样才能让Sprite实际使用新生成的Frames资源。 - 用
continue简化跳过"default"动画的逻辑,代码更清爽。
如果你的SpriteFrames里存在非AtlasTexture类型的帧(比如普通Texture2D),可以扩展类型处理逻辑:
Texture originalFrame = referenceFrames.GetFrame(anim, i); Texture updatedFrame; if (originalFrame is AtlasTexture atlasFrame) { updatedFrame = atlasFrame.Duplicate() as AtlasTexture; (updatedFrame as AtlasTexture).Atlas = _texture; } else { // 按需处理普通纹理的情况 updatedFrame = _texture; } updatedFrames.AddFrame(anim, updatedFrame);
内容的提问来源于stack exchange,提问作者xtinkerbell136x
相关产品推荐
相关产品推荐

