Почему мой Godot Rigidbody3d не сохраняет замороженную позицию по сравнению с родителем?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему мой Godot Rigidbody3d не сохраняет замороженную позицию по сравнению с родителем?

Сообщение Anonymous »

Я собираю футбольный/футбольный матч в Godot 4.3 в качестве учебного упражнения, и я столкнулся с проблемой, пытаясь заморозить/прикрепить мяч одному из игроков. Вот что происходит: < /p>
  • игроки перемещаются на свою позицию < /li>
    Как только игроки находятся в позиции, один из них снимает начало и передает мяч другому игроку за ними < /li>
    Игрок - персонаж 3D с областью 3d вокруг ног. Мяч попадает в область, и идея заключается в том, что он «придерживается» игрока в точной позиции, он входит в область 3d. Перед игроком. Я имел наполовину ожидал, что физика не была полной, поэтому она сдвигалась, но таймер сна сбрасывает эту теорию - я думаю. src = "https://i.sstatic.net/v8w5myao.png"/>

    Gif, показывающий мяч "Shift", как только игрок движется. Пожалуйста, просмотрите на Imgur: https://imgur.com/drszstz
Введенный на корпус метод выглядит следующим образом:

Код: Выделить всё

public void OnFeetEntered(Node3D body)
{
if(CurrentState == PlayerState.KickingOff || CurrentState == PlayerState.MovingToPosition)
{
return;
}

if (body is Ball ball)
{
HasBall = true;
CurrentState = PlayerState.JustTakenBall;

ball.LinearVelocity = Vector3.Zero;
ball.AngularVelocity = Vector3.Zero;
ball.FreezeMode = RigidBody3D.FreezeModeEnum.Kinematic;
ball.Freeze = true;

ball.GlobalPosition = ball.GlobalPosition;
var localPosition = ToLocal(ball.GlobalPosition);

AddChild(ball);

ball.Position = localPosition;
}
}
< /code>
И именно так игрок должен двигаться (целевая позиция жестко кодируется в вектор3 (-10.0f, 0,252f, -8.0f) для целей тестирования): < /p>
private void MoveToTarget(Vector3 targetPosition)
{
Vector3 direction = GlobalPosition.DirectionTo(targetPosition);

float distance = GlobalPosition.DistanceTo(targetPosition);

if (distance > stopThreshold)
{
Velocity = direction * Speed;

MoveAndSlide();
}
else
{
Velocity = Vector3.Zero; // Stop movement

CurrentState = PlayerState.Idle;

Look();
}
}
< /code>
Так что я здесь делаю не так? Я просто хочу, чтобы этот мяч оставался в положении, который он входит в игрока, когда этот игрок движется вперед или вращается. Теперь, когда я запускаю игру и пытаюсь продвинуть игрока вперед, игра сбивается с ошибкой переполнения стека: < /p>
Exception of type 'System.StackOverflowException' was thrown.
больше нет информации, внутреннего исключения или чего -то очень полезного. У меня есть небольшая потеря!
edit 2
Вторая проблема, с которой я столкнулся, была простая рекурсия, я не ценил, что введенный метод будет вызван неоднократно. Это заставило родителя удалить и добавить в бесконечную петлю, вызывая исключение переполнения стека. Мой игрок теперь счастливо движется вперед с мячом в правильном положении!

Подробнее здесь: https://stackoverflow.com/questions/794 ... -to-parent
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»