using Godot; public class GoldBar : KinematicBody { private Vector3 targetPosition; private bool hasTarget; public Vector3 velocity; // Called when the node enters the scene tree for the first time. public override void _Ready() { targetPosition = GlobalTransform.origin; } public void SetTarget(Vector3 target) { targetPosition = target; hasTarget = true; } public void UnsetTarget() { hasTarget = false; } // Called every frame. 'delta' is the elapsed time since the previous frame. public override void _PhysicsProcess(float delta) { if (hasTarget) { if (targetPosition.IsEqualApprox(GlobalTransform.origin)) { targetPosition = GlobalTransform.origin; velocity = Vector3.Zero; } Vector3 targetDirection = (targetPosition - GlobalTransform.origin).Normalized(); velocity = targetDirection * (velocity.Length() + 10 * delta); Transform = new Transform(Transform.basis.Rotated(Vector3.Up, delta * 2.0f), Transform.origin); } else { velocity.y = velocity.y - 9.81f * delta; } velocity = MoveAndSlide(velocity, Vector3.Up); if (IsOnFloor() || Mathf.Abs(Transform.origin.y) < 0.01) { // apply damping when on ground velocity = velocity - velocity.Normalized() * 0.9f * delta; } if (velocity.LengthSquared() < 0.01) { velocity = Vector3.Zero; } } }