Objetos secundarios y su ubicación original
Soy nuevo en Unity, así que después de tomar solo algunos cursos en línea regulares para Unity2D, quería jugar agregando diferentes funciones, la primera de las cuales decidí hacer fue algo como en Portal, donde un proyectil genera dos portales conectados. puedes teletransportarte entre. Sin embargo, me he encontrado con un problema. Cuando estoy teletransportando a mi personaje, a veces, generalmente cuando me estoy teletransportando demasiado rápido pero puede suceder en cualquier momento, el niño se opone al objeto del juego Player tiende a cambiar, y no entiendo por qué. **Me gustaría:
Algo que vale la pena señalar es que el cambio de compensación también es diferente, tengo un objeto secundario llamado Pies que detecta el suelo para saltar, que parece permanecer en la ubicación del portal anterior cuando se rompe por primera vez. Sin embargo, otro objeto secundario llamado Pistola, que es de donde se generan los proyectiles, parece que solo se mueve un poco hacia abajo, lo que significa que hay una inconsistencia en la forma en que se compensan cuando se rompen. Puede ser porque los Pies tienen un colisionador, pero no estoy seguro, no sé lo suficiente, y solo sentí que valía la pena mencionarlo.
[SerializeField] GameObject otherPortal; Portal otherPortalComponent; BoxCollider2D boxCollider2D; bool firstEntered = true; // Start is called before the first frame update void Start() { boxCollider2D = GetComponent<BoxCollider2D>(); otherPortalComponent = otherPortal.GetComponent<Portal>(); } private void OnTriggerEnter2D(Collider2D collision) { if (boxCollider2D.IsTouchingLayers(LayerMask.GetMask("Player")) && firstEntered) { Teleport(collision.gameObject); otherPortalComponent.SetFirstEnteredFalse(); } } private void Teleport(GameObject obj) { obj.transform.position = otherPortal.transform.GetChild(0).transform.position; } public void SetFirstEnteredFalse() { this.firstEntered = false; } private void OnTriggerExit2D(Collider2D collision) { this.firstEntered = true; }Para simplificar la pregunta, la posición de los objetos secundarios en relación con los padres cambia cuando cambio instantáneamente la posición de los padres a veces, ¿por qué sucede esto y cómo soluciono el problema sin simplemente usar transform.position en un método de actualización para agregar constantemente el niño a los padres, si es posible.
Vería la declaración if de su método OnTriggerEnter2D para encontrar una solución.
private void OnTriggerEnter2D(Collider2D collision) { if (boxCollider2D.IsTouchingLayers(LayerMask.GetMask("Player")) && firstEntered) { Teleport(collision.gameObject); otherPortalComponent.SetFirstEnteredFalse(); } } Debido a que está utilizando On Trigger Enter, este método solo se llamará con los pies, ya que el colisionador principal de su jugador no es un Trigger. Esto significa que su variable de collision a la que llama su método Teleport es en realidad el objeto de sus pies, no el objeto del cuerpo de su jugador. Por lo tanto, está cambiando la compensación de sus pies con respecto a su jugador en su método de Teletransporte.
Intentaría cambiar su método de colisión a OnCollisionEnter2D (Collision2D) que recogería el colisionador base de su jugador cuando ingresa y no el colisionador de pies.
void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.GetComponent<Player>() && firstEntered) { Teleport(collision.gameObject); otherPortalComponent.SetFirstEnteredFalse(); } } Dado que la secuencia de comandos del reproductor se encuentra en el mismo objeto que el colisionador del reproductor base, puede realizar una simple llamada a GetComponent<Player>() para comprobar si es el objeto del reproductor. Aunque aún podría usar la Capa para verificar si lo desea.