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
相关产品推荐
相关产品推荐

