35 lines
1.3 KiB
C#
35 lines
1.3 KiB
C#
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<Variant,Variant> raycastResult in raycastResults) {
|
|
if (raycastResult.Key.AsString() == "position") {
|
|
GD.Print($"raycastResult.Position = {raycastResult.Value}");
|
|
blaster.LookAt(raycastResults.FirstOrDefault().Value.AsVector3());
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
} |