Hola, a ver ...
Cita de: yhuj date=1529508382 Hay que tener en cuenta que la UI image puede tener diferentes ángulos, y por eso el vector horizontal AC es respecto a la UI image y no respecto al escenario 2D (ejemplo foto 1 y 2)
eso podés especificarlo con un típico transform.right "versión UI", no se si podés hacerlo con un rectTransform directamente, creo que con transform directamente debería funcionar igual ya que interesa el versor (una dirección). Pero ojo con las coordenas, (más abajo)
Cita de: yhuj date=1529508382if (Input.GetMouseButton(0) && Physics.Raycast(ray, out hit) == true) { if (hit.collider.name == "Image") { coordRatonPulsado = Input.mousePosition; pulsado = 1; } }
No se si es así pero tené en cuenta que que "coordratónpulsado" se está actualizando cuadro a cuadro mientras estén cliqueando, funciona como un "getKey" y
seguramente busques un "getKeydown", usá "GetMouseButton
Down" ... o quizás no sea así, pero como vi el GetMouseButtonUp abajo me pareció que se te pasó así que lo menciono.
Me parece que todo pasa por una cuestión de sistemas de coordenadas, no estoy seguro pero puede llegar a ser. Tenés que tener en cuenta que el vector resultante de Input.mousePosition será por ej (750,480) es decir un vector2 respecto a la pantalla,
que no es lo mismo que usar la info de la colisión del ray , el "hitInfo.point" (hitInfo un raycasthit). Digo esto porque estás queriendo usar el "vector horizontal AC respecto a la UI Image" como especificás, y eso hacerlo directamente como un Vector2 (es decir en el mundo pixels) la verdad no se como hacerlo, o ahora no se me ocurre, por eso te propongo pasar todo a espacio 3D.
podés usar el transform.right del objeto UI con el ray.point y sacar tus calculos. Un ejemplo
Vector3 AC = hitInfo.point - referencia;
Vector3 AB = transformUI.right;
float angleABAC = Vector3.SignedAngle(AC,AB); //o alrevés
Cita de: yhuj date=1529508382Pero no da el resultado deseado. Como se ve en la tercera imagen, cuando estoy en la izquierda marca 0º y a medida que voy trazando un semicírculo hacia arriba llego a 90º y después a 180º. El problema está en que cuando empiezo a descender el ratón, me marca los valores que están en rojo, y no los que están en negro que son los que quiero. Así pues, ¿cómo puedo hacer que me vaya de 0º hasta 360º, en vez de 0º a 180º y de 180º a 0º?
Simplemente no funciona porque el resultado viene de un sistema "sin memoria", Unity no sabe que vos estás girando en sentido horario ponele, simplemente ve este punto y aquel punto y saca un ángulo. Una cosa que aprendés de tener estos problemas clásicos es que vos mismo tenés que llevar cuenta de todo, sirve para este casoy para muchos otros casos más (ej una freeCam ) que necesite de gr que se yo, vos determinás como "se mueve la cosa".
Una cosa que podés hacer para esto es ir calculando
el delta del angulo, y en base a esto ir modificando un valor general (muuuuy común hacer esto), para esto necesitas tener el vector AB anterior, cosa de calcular el delta del ABnuevo vs el ABviejo, tener ángulos absolutos no te sirve tanto, podrías llegar a algún lugar con esto, pero tenés que ir teniendo en cuenta el cuadrante y, seee , se vuelve más tedioso al pedo.
Ej1: angulo ABAC es de 180° , entra el cuadro, te moviste 1 grado en sentido antihorario (resultado sería 181° ) , el delta calculado da 1 grado, entonces subas a los 180° ese grado del delta.
Ej2: angulo ABAC es de 180° , entra el cuadro, te moviste 1 grado en sentido horario (resultado sería 179° ) , el delta calculado da -1 grado, entonces subas a los 180° ese grado negativo del delta.
Saludos