Godot 4中如何通过代码创建可复用纹理?
在Godot中通过代码生成可复用的方块纹理
核心思路:用Image和ImageTexture动态生成纹理
Godot里可以直接用代码创建Image对象,绘制内容后转成ImageTexture,就能像普通纹理一样复用,完全不用依赖外部资源文件。
1. 生成单色方块纹理的基础代码
可以写一个工具函数,传入尺寸和颜色,直接返回生成好的纹理:
func generate_block_texture(block_size: int, color: Color) -> ImageTexture: # 创建指定尺寸的RGBA格式图像 var image = Image.create(block_size, block_size, false, Image.FORMAT_RGBA8) # 填充整体颜色 image.fill(color) # 可选:添加深色边框模拟经典方块样式 var border_color = color.darkened(0.3) image.draw_rect(Rect2(0, 0, block_size, 1), border_color) image.draw_rect(Rect2(0, block_size-1, block_size, 1), border_color) image.draw_rect(Rect2(0, 0, 1, block_size), border_color) image.draw_rect(Rect2(block_size-1, 0, 1, block_size), border_color) # 将图像转为可复用的纹理 var texture = ImageTexture.create_from_image(image) return texture
2. 缓存纹理避免重复生成
把生成好的纹理按颜色缓存,减少重复计算:
var texture_cache = {} func get_block_texture(block_size: int, color: Color) -> ImageTexture: # 用颜色的HTML字符串作为缓存键 var color_key = color.to_html() if texture_cache.has(color_key): return texture_cache[color_key] var new_texture = generate_block_texture(block_size, color) texture_cache[color_key] = new_texture return new_texture
3. 在节点中使用生成的纹理
可以直接给Sprite2D赋值,或者在CanvasItem的_draw()方法中绘制:
# 给Sprite2D赋值纹理 var block_sprite = Sprite2D.new() block_sprite.texture = get_block_texture(32, Color(1, 0, 0)) add_child(block_sprite) # 在_draw()中绘制纹理 func _draw(): var green_block = get_block_texture(32, Color(0, 1, 0)) draw_texture(green_block, Vector2(100, 100))
4. 进阶:生成带复杂样式的纹理
如果需要渐变、图案等效果,可利用Image的其他绘制方法扩展:
# 生成垂直渐变的方块 func generate_gradient_block(block_size: int, start_color: Color, end_color: Color) -> ImageTexture: var image = Image.create(block_size, block_size, false, Image.FORMAT_RGBA8) # 逐行绘制渐变 for y in range(block_size): var t = y / float(block_size) var current_color = start_color.linear_interpolate(end_color, t) image.draw_rect(Rect2(0, y, block_size, 1), current_color) # 加黑色边框 image.draw_rect(Rect2(0, 0, block_size, 1), Color(0,0,0)) image.draw_rect(Rect2(0, block_size-1, block_size, 1), Color(0,0,0)) var texture = ImageTexture.create_from_image(image) return texture
注意事项
- 尽量做好纹理缓存,避免频繁创建
Image和ImageTexture影响性能 - 3D项目中可直接使用
ImageTexture作为Texture2D资源,逻辑一致 - 可将工具函数放在全局脚本或自动加载单例中,方便全项目调用
内容的提问来源于stack exchange,提问作者Lucas Leriche
相关产品推荐
相关产品推荐

