public override void _PhysicsProcess(double delta)
{
}
PhysicsProcess 재정의된 함수 공간에는 물리 처리들을 정의하면 된다. 기본적으로 스크립트를 생성했으면 중력 가속도만큼 Velocity에 속도를 가하는 코드가 내장된다. 사용자가 키보드로 입력해서 움직이는 것은 아니기 때문에, 키보드 입력 부분은 제거해준다. 중력 가속도 부분만 추가해주겠다.
public override void _PhysicsProcess(double delta){
Vector2 velocity = Velocity;
velocity += GetGravity() * (float)delta;
Velocity = velocity;
MoveAndSlide();
}
[Export]
NavigationAgent2D agent2D;
agent2D 객체 내부에 변수가 있는데, TargetPosition 이라는 멤버 변수가 존재한다. 이 공간에 목적지 글로벌 좌표를 넣어주면 에이전트가 자동으로 연산해서 해당 지점까지의 최단 거리를 계산하고 다음으로 이동하면 되는 직선 지점을 찾아준다. 그것이 agent2D 안에 있는 GetNextPathPosition()이라는 함수이다.
즉 TargetPosition 에 마우스 글로벌 좌표를 넣고, 다음 발견된 최단 거리를 바로 가져오면 된다.
마우스 커서를 글로벌 좌표로 알아내기 위해서 GetGlobalMousePosition()함수를 쓰면 된다.
agent2D.TargetPosition = GetGlobalMousePosition();
Vector2 ps = agent2D.GetNextPathPosition();
즉 ps 라는 벡터2는 해당 마우스 글로벌 좌표까지 가기 위해 발견된 첫 번째 경로의 목적지 전역 좌표이다. 이 좌표로 우선 이동하면, Agent가 알아서 다음 좌표를 반환해준다.
테스트로, 이 객체의 GlobalPosition 을 ps 좌표로 변경해본다.
Vector2 velocity = Velocity;
velocity += GetGravity() * (float)delta;
Velocity = velocity;
agent2D.TargetPosition = GetGlobalMousePosition();
Vector2 ps = agent2D.GetNextPathPosition();
this.GlobalPosition = ps;
MoveAndSlide();
Vector2 velocity = new Vector2();
gravityAccel += GetGravity() * (float)delta;
velocity = gravityAccel;
if (IsOnFloor())
{
gravityAccel.Y = 0;
}
한편, agent2D 에는 이제 다음 좌표 정보를 가져오고, 현재 플레이어 캐릭터 바디 2D 가 다음 경로를 향하는 방향 벡터를 알아내고, 해당 방향 벡터를 단위화한 뒤 일정 크기만큼 이동하도록 코드를 작성한다.
agent2D.TargetPosition = GetGlobalMousePosition();
Vector2 ps = agent2D.GetNextPathPosition();
Vector2 vc = this.GlobalPosition.DirectionTo(ps).Normalized() * 100;
velocity.X += vc.X;
velocity.Y += vc.Y;
즉 해당 다음 목적지를 향하는 다음 노드 좌표로 바로 이동하는 것이 아니라, 목적지 좌표를 향하기 위한 노드의 방향을 알아내고, 해당 방향으로 속도 벡터를 만들어, velocity 에 더해서 반영하면 되는 것이다.
Vector2 velocity = new Vector2();
gravityAccel += GetGravity() * (float)delta;
velocity = gravityAccel;
if (IsOnFloor())
{
gravityAccel.Y = 0;
}
agent2D.TargetPosition = GetGlobalMousePosition();
Vector2 ps = agent2D.GetNextPathPosition();
Vector2 vc = this.GlobalPosition.DirectionTo(ps).Normalized() * 100;
velocity.X += vc.X;
velocity.Y += vc.Y;
GD.Print(velocity);
Velocity = velocity;
MoveAndSlide();
이러면 이제 마우스 방향대로 캐릭터가 움직이는 것을 볼 수 있다. 마우스 커서가 하늘을 향하면 점프를 방방 뛰는 것을 볼 수 있다.