xrjamfeb2025/scenes/pickable_demo/objects/grab_cube.gd

64 lines
2 KiB
GDScript

@tool
extends XRToolsPickable
## Alternate material when button pressed
@export var alternate_material : Material
# Original material
var _original_material : Material
# Current controller holding this object
var _current_controller : XRController3D
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
# Call the super
super()
# Get the original material
_original_material = $MeshInstance3D.get_active_material(0)
# Listen for when this object is picked up or dropped
picked_up.connect(_on_picked_up)
dropped.connect(_on_dropped)
# Called when this object is picked up
func _on_picked_up(_pickable) -> void:
# Listen for button events on the associated controller
_current_controller = get_picked_up_by_controller()
if _current_controller:
_current_controller.button_pressed.connect(_on_controller_button_pressed)
_current_controller.button_released.connect(_on_controller_button_released)
# Called when this object is dropped
func _on_dropped(_pickable) -> void:
# Unsubscribe to controller button events when dropped
if _current_controller:
_current_controller.button_pressed.disconnect(_on_controller_button_pressed)
_current_controller.button_released.disconnect(_on_controller_button_released)
_current_controller = null
# Restore original material when dropped
$MeshInstance3D.set_surface_override_material(0, _original_material)
# Called when a controller button is pressed
func _on_controller_button_pressed(button : String):
# Handle controller button presses
if button == "ax_button":
# Set alternate material when button pressed
if alternate_material:
$MeshInstance3D.set_surface_override_material(0, alternate_material)
# Called when a controller button is released
func _on_controller_button_released(button : String):
# Handle controller button releases
if button == "ax_button":
# Restore original material when button released
$MeshInstance3D.set_surface_override_material(0, _original_material)