Проблемы с поддержанием относительного положения одного объекта относительно другого движущегося объекта.C#

Место общения программистов C#
Ответить
Anonymous
 Проблемы с поддержанием относительного положения одного объекта относительно другого движущегося объекта.

Сообщение Anonymous »

У меня проблема с перемещением платформ и с тем, чтобы игрок следовал за ними. Я хочу, чтобы игрок (в данном случае linkedRbs) в основном «прилипал» к объекту и сохранял свое относительное положение на объекте при его движении - в некотором смысле это работает, проблема возникает при установке положения RigidBody, относительное положение инвертируется (для справки приведена диаграмма ниже). Если игрок находится относительно передней части объекта, при следующем обновлении физики он переместится сначала назад, затем вперед, и наоборот. Я действительно не могу найти способ исправить это и удерживать его в том же относительном положении без движения назад вперед - какая-нибудь помощь? Кажется, это простая ошибка, которую я со своей стороны замалчивал, но пытался исправить ее часами.
пример диаграммы
Я перемещаю свои твердые тела с помощью движущейся платформы следующим образом:

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

List linkedRbs = new List();
List linkedRbsRelativePos = new List();

private void FixedUpdate()
{
for (int i = 0; i < linkedRbs.Count; i++) // "linkedRbs" are the rbs touching the moving object
{
if (GetRelativePos(linkedRbs[i]) != linkedRbsRelativePos[i]) // RB is not in the same place as it was the last physics update
{
Vector3 lastRBPos = linkedRbsRelativePos[i];
linkedRbsRelativePos[i] = GetRelativePos(linkedRbs[i]);

Vector3 worldRelativePos = transform.position - linkedRbsRelativePos[i];
Vector3 newPos = lastRBPos + worldRelativePos;

//Debug.Log($"Dir={worldRelativePos},lastPos={lastRBPos},newerPos={newer}");

linkedRbs[i].MovePosition(new Vector3(newPos.x, linkedRbs[i].position.y, newPos.z));
}
}
}

private Vector3 GetRelativePos(Rigidbody rb)
{
Vector3 playerRelative = rb.transform.InverseTransformPoint(transform.position);
return playerRelative;
}

private void OnCollisionEnter(Collision collision)
{
Collider collider = collision.collider;
if(collider.TryGetComponent
(out PlayerColliderReference pcr))
{
Rigidbody _rb = pcr.GetComponentInParent();

linkedRbs.Add(_rb);
linkedRbsRelativePos.Add(GetRelativePos(_rb));
}
}

private void OnCollisionExit(Collision collision)
{
Collider collider = collision.collider;
if (collider.TryGetComponent(out PlayerColliderReference pcr))
{
Rigidbody _rb = pcr.GetComponentInParent();

for (int i = 0; i < linkedRbs.Count; i++)
{
if (linkedRbs[i] == _rb)
{
linkedRbs.Remove(linkedRbs[i]);
linkedRbsRelativePos.Remove(linkedRbsRelativePos[i]);
}
}
}
}
Простое инвертирование значенийrelativePos, очевидно, отправляет меня куда-то далеко, инвертирование значенийrelativePos в относительном пространстве также не решает проблему, поскольку относительное положение по-прежнему инвертируется при каждом обновлении физики, только при другом в обход.


Подробнее здесь: https://stackoverflow.com/questions/790 ... her-moving
Ответить

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

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

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

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

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