Я создаю 2D сверху вниз игру. Я бы хотел, чтобы игрок вышел на платформу и заставил ее двигаться под ними, чтобы преодолеть препятствия.
Для этого я создал платформу, которая перемещается назад и вперед между позициями. Если игрок сталкивается с платформой, его transform.parent
устанавливается на платформы transform
.
Это работает, и игрок движется с платформой. Проблема состоит в том, что, как только платформа проходит мимо того места, где она была BoxCollider2D
, она вызывает `OnTriggerExit2D. Это называется, даже если игрок все еще сталкивается с платформой. Разница лишь в том, что теперь это ребенок.
[RequireComponent(typeof(Rigidbody2D))]
public class MovingPlatform : MonoBehaviour
{
public List<Vector2> positions;
public float speed = 1;
public bool forward = true;
public float stopTime = 1;
private Vector2 nextPosition;
private Rigidbody2D rigidbody;
private int currentPosition = 0;
private float waitTime = 0;
private GameObject collidingObject;
// Start is called before the first frame update
void Start()
{
nextPosition = positions[0];
rigidbody = GetComponent<Rigidbody2D>();
}
/**
* Code to move the platform back and forth between positions
*/
void Update()
{
if (waitTime <= 0)
{
if (Vector3.Distance(transform.position, nextPosition) > 0)
{
float step = speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, nextPosition, step);
}
else
{
if (forward)
{
if (currentPosition < positions.Count - 1)
{
currentPosition++;
nextPosition = positions[currentPosition];
}
else
{
waitTime = stopTime;
forward = false;
}
}
else
{
if (currentPosition > 0)
{
currentPosition--;
nextPosition = positions[currentPosition];
}
else
{
waitTime = stopTime;
forward = true;
}
}
}
}
else
{
waitTime -= Time.deltaTime;
}
}
private void OnTriggerEnter2D(Collider2D other)
{
if (other.tag.Equals("Player"))
{
Debug.Log("Connecting");
collidingObject = other.gameObject;
collidingObject.transform.parent = transform;
}
}
private void OnTriggerExit2D(Collider2D other)
{
if (other.tag.Equals("Player") && collidingObject != null)
{
Debug.Log("Disconnecting");
collidingObject.transform.parent = null;
collidingObject = null;
}
}
}
Кажется, что он обнаруживает столкновение с тем местом, где раньше была платформа, и не обновляет новую позицию твердого тела.
Что может быть причиной этого?
Обновление
Я пытался использовать это в Player
компоненте.
private void OnTriggerStay2D(Collider2D other)
{
if (other.tag.Equals("Moving Platform"))
{
Debug.Log("Connecting");
transform.parent = other.transform;
}
else
{
Debug.Log("Disconnecting");
transform.parent = null;
}
}
Он успешно добавляет движущуюся платформу, поскольку она является дочерней, но он все равно заканчивает тем, что устанавливает родителя в ноль, когда он все еще сталкивается.