Traigo otra pregunta de arrastrar con el mouse (estoy usando Unity con C #), pero con un detalle particular menos común: la existencia de obstáculos en el medio del camino a través del cual ocurre el arrastre (espacio 3D, no 2D) .
Dejame explicar. Supongamos que tengo un plano sobre el cual quiero arrastrar un cubo llamado "obj". Eso es fácil. Aquí está mi implementación simple para eso:
void Update () {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit, 1000000))
obj.transform.position = new Vector3(hit.point.x,0.25F,hit.point.z);
}
Funciona. Sin embargo, supongamos que también tengo algunos otros cubos sobre el avión, que son los obstáculos. Obviamente, cuando el jugador mueve "obj" sobre el avión, tal movimiento debe ser bloqueado por los obstáculos. Y luego, mientras choca con los obstáculos, "obj" solo debe moverse a los lados de ese obstáculo. Si se mueve el mouse y "obj" deja de chocar con obstáculos, el movimiento de arrastre libre se reanuda nuevamente.
Para dificultar el desafío, estoy tratando de lograrlo sin el uso de componentes RigidBody en los obstáculos (el objeto arrastrado puede tenerlo). ¿Alguna idea sobre cuál es la forma más eficiente de lograr eso? ¡Muchas gracias!
EDITAR: Los comentaristas me han llamado la atención sobre que debo mencionar que los objetos pueden rotar cuando se rompen.
EDITAR 2: Considerando la dificultad de la formulación original, cambié la pregunta permitiendo el uso de componentes Rigidbody en los objetos arrastrados. La solución simplemente no puede usar componentes de Rigidbody en los obstáculos.
Respuestas:
Es difícil detectar la colisión sin ningún cuerpo rígido involucrado, pero dado que está usando cubos, puede usar Bounds . Intersects . En cada actualización, verifique si los límites del objeto arrastrado se cruzan con los límites de cualquier obstáculo. Si es así, entonces puedes probar esto:
Nunca dejas de arrastrar el bloque; simplemente le parece al usuario que el bloque ha dejado de arrastrarse mientras se cruza con un obstáculo.
fuente
Sin haberlo hecho yo mismo, esto es lo que probaría:
Me parece que si desea que su objeto se arrastre a lo largo de un plano inclinado de un obstáculo, simplemente debe hacer que su transformación continúe siguiendo la posición del último golpe de rayos.
fuente