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

Godot GDScript中set_texture调用无效问题求助

问题分析与解决

问题描述

制作Godot贪吃蛇复刻版时遇到纹理切换异常:调用sprite.set_texture(sprite.texture2)可正常切换纹理,但调用sprite.set_texture(sprite.texture)时无报错却无法切换。其中texture是Sprite节点的默认纹理,texture2是通过@export导入的Texture2D,已确认两个纹理均存在。

相关代码:

extends CharacterBody2D

@onready var sprite = $Sprite

const MOVESPEED = 200


func _ready():
    sprite.global_position = Vector2(get_viewport().size / 2)
    velocity = MOVESPEED * Vector2.RIGHT


func _process(_delta):
    var current_direction = Vector2(velocity.x, velocity.y).normalized()
    current_direction = get_movement_direction(current_direction)
    if current_direction != Vector2.ZERO:
        velocity = current_direction * MOVESPEED
    move_and_slide()


func get_movement_direction(current_direction):
    
    var x_movement = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
    var y_movement = Input.get_action_strength("move_down") - Input.get_action_strength("move_up")
    
    
    if x_movement != 0:
        if x_movement == 1:
            current_direction = Vector2.RIGHT
            sprite.set_texture(sprite.texture)
            sprite.flip_h = false
        else:
            current_direction = Vector2.LEFT
            sprite.set_texture(sprite.texture)
            sprite.flip_h = true
    elif y_movement != 0:
        if y_movement == 1:
            current_direction = Vector2.DOWN
            sprite.set_texture(sprite.texture2)
            sprite.flip_v = true
        else:
            current_direction = Vector2.UP
            sprite.set_texture(sprite.texture2)
            sprite.flip_v = false
    
    return current_direction

问题原因

sprite.texture是Sprite节点当前的纹理引用,并非固定指向默认纹理。当调用sprite.set_texture(sprite.texture2)切换纹理后,sprite.texture的值会更新为texture2。此时再调用sprite.set_texture(sprite.texture),相当于把当前纹理设置为自身,自然看不到变化。

解决方法

提前在_ready函数中保存默认纹理的引用,后续切换时使用这个保存的变量,而非直接读取sprite.texture:

修改后的代码:

extends CharacterBody2D

@onready var sprite = $Sprite
var default_texture: Texture2D # 保存默认纹理的变量

const MOVESPEED = 200


func _ready():
    default_texture = sprite.texture # 初始化时保存默认纹理
    sprite.global_position = Vector2(get_viewport().size / 2)
    velocity = MOVESPEED * Vector2.RIGHT


func _process(_delta):
    var current_direction = Vector2(velocity.x, velocity.y).normalized()
    current_direction = get_movement_direction(current_direction)
    if current_direction != Vector2.ZERO:
        velocity = current_direction * MOVESPEED
    move_and_slide()


func get_movement_direction(current_direction):
    
    var x_movement = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
    var y_movement = Input.get_action_strength("move_down") - Input.get_action_strength("move_up")
    
    
    if x_movement != 0:
        if x_movement == 1:
            current_direction = Vector2.RIGHT
            sprite.set_texture(default_texture) # 使用保存的默认纹理
            sprite.flip_h = false
        else:
            current_direction = Vector2.LEFT
            sprite.set_texture(default_texture) # 使用保存的默认纹理
            sprite.flip_h = true
    elif y_movement != 0:
        if y_movement == 1:
            current_direction = Vector2.DOWN
            sprite.set_texture(sprite.texture2)
            sprite.flip_v = true
        else:
            current_direction = Vector2.UP
            sprite.set_texture(sprite.texture2)
            sprite.flip_v = false
    
    return current_direction

额外排查点

  • 确认Sprite节点的默认纹理在编辑器中已正确设置,未被误覆盖
  • 可在_ready函数中打印default_texture.resource_path和sprite.texture2.resource_path,验证两者指向不同的资源文件

内容的提问来源于stack exchange,提问作者Gabriel Zuser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:52:43