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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:10:01