Virtual Joystick Godot
A simple virtual joystick for touchscreens, for both 2D and 3D games, with useful options.
Install / Use
npx skills add MarcoFazioRandom/Virtual-Joystick-GodotInstalls into whichever agent you are using.
README
Godot Virtual Joystick
<img src="addons/virtual_joystick/previews/CoverPreview.svg" width="100%">A simple yet powerful virtual joystick for touchscreens in Godot, packed with useful options to enhance your game's mobile experience.
🎮 Features
- Easy to integrate
- Customizable appearance
- Multiple joystick modes
- Input action support
- Visibility options
📸 Preview
<p align="center"> <img src="addons/virtual_joystick/previews/ShowcasePreview.png" width="85%"> </p>🚀 Quick Start
- Add the joystick to your scene
- Configure the options
- Use the following script to get started:
extends Sprite2D
@export var speed : float = 100
@export var joystick_left : VirtualJoystick
@export var joystick_right : VirtualJoystick
var move_vector := Vector2.ZERO
func _process(delta: float) -> void:
# Movement using Input functions:
move_vector = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
position += move_vector * speed * delta
# Rotation:
if joystick_right and joystick_right.is_pressed:
rotation = joystick_right.output.angle()
⚙️ Options
| Option | Description | |--------|-------------| | Joystick Mode | Fixed, Dynamic, or Following | | Dead Zone Size | Minimum distance for output | | Clamp Zone Size | Maximum distance for output | | Visibility Mode | Always, Touchscreen Only, or When Touched | | Use Input Actions | Trigger input actions defined in Project Settings |
🛠 Setup Tips
- Create a
CanvasLayernode named "UI" for all UI elements - Add the Joystick scene as a child of the UI node
- Enable "Editable Children" to customize joystick appearance
- Refer to the example scene in the "Test" folder
📘 FAQ
Multitouch Issues?
Ensure these settings in Project -> Project Settings -> General -> Input Devices:
- "Emulate Touch from Mouse" : ON
- "Emulate Mouse from Touch" : OFF
If other buttons don't work with this configuration, use TouchScreenButton instead of TextureButton.
Input.get_vector() Not Working?
⚠️ Fixed in Godot 4.2.1
For earlier versions, use this workaround:
input_vector := Vector2.ZERO
input_vector.x = Input.get_axis("ui_left", "ui_right")
input_vector.y = Input.get_axis("ui_up", "ui_down")
Freeze/crash on Android editor
As mentioned in the Docs, the Android editor is still unstable.
🤝 Contributing
Contributions are welcome! Feel free to submit issues or pull requests on the GitHub repository.
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
Made with ❤️ for the Godot community
Related Skills
node-connect
385.5kDiagnose OpenClaw Android, iOS, or macOS node pairing, QR/setup code, route, auth, and connection failures.
blender-python-addon
40.5kBlender Python add-on rules for operators, panels, properties, registration, testing, and API-safe scripting
flutter-development-guidelines-cursorrules-prompt-file
40.5kCursor rules for Flutter development with MVVM architecture, Riverpod state management, Material widgets, and Dart style guidelines.
commit-push-pr
140.7kCommit, push, and open a PR
