Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 15,00€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales
Sign in to follow this  
ecko

Problema con Sombras y Raycast

Recommended Posts

Buenas a tod@s, tengo un par de dudas que no consigo dar con la tecla y bueno agradecería una ayudita :) una de ellas y mas simple es por que me pone sombras en un skinnedmeshrender, este skinnedmeshrender se ilumina con una luz externa (light directional) y tiene las propiedades  castshadows y light probes desactivadas pero sin embargo siguen saliendo sombras.

Por otro lado estoy tratando de realizar un movimiento mediante un minimapa el cual es una imagen de tipo Render Texture (imagen proyectada por una cámara) y esta imagen la asocio a una rawimage de la ui pero resulta que al hacer click sobre esta imagen el raycast no detecta la ui y en la propia ui tengo activada la opción Raycasttarget pero nada se ve que el rayo atraviesa la ui y me detecta lo de atrás, el código es el siguiente:         

   if (Input.GetKey(KeyCode.Mouse1)){             

                    var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                    if (Physics.Raycast(ray, hit,100)){
                        Debug.Log(hit.transform.gameObject.name + hit.transform.gameObject.layer); 
                        if (hit.collider.gameObject.layer == 16){ // este layer se lo he asignado a la rawimagen del minimapa (sólo tiene este layer la imagen esta)
                            ray = camaraMapa.ViewportPointToRay(new Vector3(hit.textureCoord));
                            if (Physics.Raycast(ray, hit)){                          
                               vPosicion=hit.point;                                   
                            }
                        }
                        else{
                            vPosicion=hit.point;    
                        }

         }

 

Share this post


Link to post
Share on other sites
49 minutes ago, ecko said:

Buenas a tod@s, tengo un par de dudas que no consigo dar con la tecla y bueno agradecería una ayudita :) una de ellas y mas simple es por que me pone sombras en un skinnedmeshrender, este skinnedmeshrender se ilumina con una luz externa (light directional) y tiene las propiedades  castshadows y light probes desactivadas pero sin embargo siguen saliendo sombras.

Fijate que el castShadows lo tenés que desactivar en el objeto que tenga el meshRenderer (o skinned), por supuesto lo estás haciendo, ¿será que lo estás haciendo en algun objeto quizás pequeño de mayor jerarquía (un padre o abuelo o bisabuelo ...) que lo tiene (que confunde) pero en el resto de la jerarquía (hijos nietos bisnietos) no lo estás haciendo?

 

58 minutes ago, ecko said:

var ray = Camera.main.ScreenPointToRay(Input.mousePosition);

Ya que estás haciendo un ray desde la cámara, supongo que tendrás tu canvas asignado a Camera Space, de lo contrario si estuviera en overlay nunca vas a intersectar a la rawImage (ya que en realidad no está donde vos la vés). Creo que podés usar otra forma para referirte a la UI sea Camera o Overlay usando los "PointerEventData" o directamente en vez de usar un raycast podés usar un Evento OnClick u OnPointerDown por ej

https://docs.unity3d.com/ScriptReference/UI.Selectable.OnPointerDown.html

Esto ya sabe que estás en la UI.

Si no querés hacer nada de esto, una de las cosas que a mi me gusta hacer es usar Camera Space (creo que así se llama ja) con otra camara alejada y manejarme con dicha mara, en tu caso no sería tu Camera.main o puede que sí, lo mejor es arrastrar la camara que querés usar y listo, quizás con un public Camera ya que podés tener muchas camaras y cual es la main, lo sabés pero puede ser algo confuso.

Otra cosa, no te conviene usar Camera.main, es como un Find de camara, es malisimo para el frame a frame, más vale cacheá la cámara antes:

Camera m_camera = null;

void Start()
{
	m_camera = Camera.main;
}

saludos

Share this post


Link to post
Share on other sites

Camera.main tiene bastante buen rendimiento... yo hasta me permito usarlo en runtime, en update, con cosas como:

Camera.main.transform.position = Vector3.Lerp(transform.position, Camera.main.transform.position, 0.1f);

:)

Share this post


Link to post
Share on other sites
10 minutes ago, Igor said:

Camera.main tiene bastante buen rendimiento... yo hasta me permito usarlo en runtime, en update, con cosas como:


Camera.main.transform.position = Vector3.Lerp(transform.position, Camera.main.transform.position, 0.1f);

:)

No va a hacer la diferencia, pero mirá de la doc de Camera.main:

"The primary Camera in the scene. Returns null if there is no such camera in the scene. This property uses FindGameObjectsWithTag internally and doesn't cache the result. It is advised to cache the return value of Camera.main if it is used multiple times per frame. "

 

Share this post


Link to post
Share on other sites

Buenas de nuevo, quería primero agradecer estos consejos y tomarte tu tiempo :), viendo lo que comentastes opté por cambiar el código tal que así:

var camaraMapa : GameObject;

var vGra : GraphicRaycaster;

 var m_EventSystem : EventSystem;

function Start(){

 var cameraMapa=GameObject.Find("CamaraMapa");

vGra=GameObject.Find("CanvasGeneral").GetComponent(GraphicRaycaster);

 var m_EventSystem =  GameObject.Find("EventSystem").GetComponent(EventSystem);

}

function Update(){

   if(Input.GetKey(KeyCode.Mouse1)){

                    var lista : List.< RaycastResult > = new List.<RaycastResult>();
                    var m_PointerEventData = new PointerEventData(m_EventSystem);
                    m_PointerEventData.position = Input.mousePosition;
                    vGra.Raycast(m_PointerEventData,lista);
                    var vPicadoEnMapa=false;
                    for (var result : RaycastResult in lista) {
                    {
                        if(result.gameObject.name=="mapa"){
                            vPicadoEnMapa=true;
                            var ray2 =camaraMapa.GetComponent(Camera).ViewportPointToRay(result.worldPosition); //Aquí creo que esta el problema ya que no puedo usar hit.textureCoord como vi en algunos códigos
                            if (Physics.Raycast(ray2, hit)){                                
                                vPosicion=hit.point;    
                            }                            
                        }
                    }

                    if(!vPicado){

                       vPosicion=hit.point;    

                   }

   }

}

Con este código soy capaz de detectar cuando pico sobre el mapa pero luego intento pasar el raycast sobre este mapa que es un rawimagen con una imagen de tipo renderTexture la cual esta siendo reproducida por otra cámara (camaraMapa) para obtener la posición sobre la segunda cámara pero se ve que devuelve siempre una misma posición pique donde pique en el mapa

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...