using System.Collections.Generic; using System.Linq; using Godot; using Godot.Collections; namespace Evolution.scripts; public partial class ShootController : Node { [Export] private Node3D blaster; [Export] private GpuParticles3D shootParticle; [Export] private Camera3D camera; public override void _Ready() => GD.Print($"{blaster}: {shootParticle}"); public override void _Input(InputEvent @event) { switch (@event) { case InputEventMouseButton eventMouseButton: shootParticle.Emitting = eventMouseButton.Pressed; break; case InputEventMouseMotion eventMouseMotion: Vector2 mousePosition = eventMouseMotion.Position; Vector3 raycastFrom = camera.ProjectRayOrigin(mousePosition); Vector3 raycastTo = camera.ProjectRayNormal(mousePosition); PhysicsDirectSpaceState3D spaceState = camera.GetWorld3D().DirectSpaceState; PhysicsRayQueryParameters3D query = PhysicsRayQueryParameters3D.Create(raycastFrom, raycastTo); Dictionary raycastResults = spaceState.IntersectRay(query); foreach (KeyValuePair raycastResult in raycastResults) { if (raycastResult.Key.AsString() == "position") { GD.Print($"raycastResult.Position = {raycastResult.Value}"); blaster.LookAt(raycastResults.FirstOrDefault().Value.AsVector3()); } } break; } } }