Jump to content

Recommended Posts

Tengo una duda, no de programación sino de lógica. Necesito hacer una cámara que se acerque al jugador cuando choca con un objeto, para evitar que atraviese el objeto y no se vea dentro de este. Yo lo haría lanzando raycast en todas las direcciones y detectando la proximidad mover la cámara, pero os pregunto para ver si tenéis mejores ideas. Por cierot, no se si lo dije es para un third person controller.

Edited by pioj
uso de tags y <> para pegar código.

Share this post


Link to post
Share on other sites

Yo tengo el mismo problema, temporalmente he puesto un colisionado en la cámara hay que ajustarlo muy bien, si el personaje se mueve demasiado deprisa no le da tiempo a detectar las paredes. Por ahora solo es efectivo al 95%, en algunas ocasiones si la pared no es suficiente gruesa puede fallar. El colisionador solo lo activo cuando la cámara esta en tercera persona. También se puede variar la longitud  del colisionador según la distancia de la cámara.

Edited by Miguel_Angel

Share this post


Link to post
Share on other sites

Pensé en hacer eso, pero lo vi chapuzas y preferí esperar alguna respuesta. Si consigues hacerlo efectivo al 100% me gustaría saber la solución. Gracias por tu respuesta!

Share this post


Link to post
Share on other sites

Yo hice que se acercara al personaje por medio de animaciones, pero sucede casi igual a lo de Miguel, si el personaje va demasiado rápido traspasa la pared y luego ejecuta la animación. 

Viendo el trailer de The legend of Zelda: Breath of the wild noté que en el juego se volvía trasparente el objeto traspasado, es otra forma de hacerlo también. 

Share this post


Link to post
Share on other sites
hace 12 minutos, DavidV said:

Yo hice que se acercara al personaje por medio de animaciones, pero sucede casi igual a lo de Miguel, si el personaje va demasiado rápido traspasa la pared y luego ejecuta la animación. 

Viendo el trailer de The legend of Zelda: Breath of the wild noté que en el juego se volvía trasparente el objeto traspasado, es otra forma de hacerlo también. 

Es una buena opción, pero para eso tendríamos que poner el shader de todos los objetos en vez de opaco transparente. El problema de esto es que si es un juego realista, no queda bien. Si es un juego animado puede quedar interesante.

Share this post


Link to post
Share on other sites

Solo he podido estar 15 días con Unity ya que han salido las oposiciones a las cuales me tengo que presentar en septiembre y no lo he vuelto ha tocar aunque sigo entrando por aquí y leyendo el foro. Como tu indicas en el primer post, yo lo hice lanzando linecast y haciendo semitransparente al personaje. Nunca la cámara me ha quedado detrás de ningún muro y creo que es una buena opción. Te voy a dejar mi ejemplo por si lo quieres probar aunque se que en un juego real es muy mejorable.

figura1.jpg

figura2.png

 

using UnityEngine;
using System.Collections;

public class Camara : MonoBehaviour {
    private GameObject Personaje;
    private GameObject Player;
    private GameObject Posicion1;
    private GameObject Posicion2;
    private GameObject Posicion3;
    private GameObject Posicion4;    
    private RaycastHit Hit;

    void Start () {
        Personaje = GameObject.Find("EthanHead");
        Player = GameObject.Find("EthanBody");        
        Posicion1 = GameObject.Find("Posicion1");
        Posicion2 = GameObject.Find("Posicion2");
        Posicion3 = GameObject.Find("Posicion3");
        Posicion4 = GameObject.Find("Posicion4");        
    }

	void Update () {
        transform.LookAt(Personaje.transform);

        if (!Physics.Linecast(Personaje.transform.position, Posicion1.transform.position) && !Physics.Linecast(Personaje.transform.position, Posicion2.transform.position) && !Physics.Linecast(Personaje.transform.position, Posicion3.transform.position))
        {            
            transform.position = Vector3.Lerp(transform.position, Posicion1.transform.position, 0.02f);
            //Player.GetComponentInChildren<SkinnedMeshRenderer>().enabled = true;
            Player.GetComponentInChildren<SkinnedMeshRenderer>().material.color = new Color(0.5f, 0.5f, 0.5f, 1);
            Debug.DrawLine(Personaje.transform.position, Posicion1.transform.position);
            Debug.DrawLine(Personaje.transform.position, Posicion2.transform.position);
            Debug.DrawLine(Personaje.transform.position, Posicion3.transform.position);
        }
        //else if (Physics.Linecast(Personaje.transform.position, Posicion1.transform.position, out Hit) || Physics.Linecast(Personaje.transform.position, Posicion2.transform.position, out Hit) || Physics.Linecast(Personaje.transform.position, Posicion3.transform.position, out Hit))
        //{            
        //    transform.position = Vector3.Lerp(transform.position, Posicion4.transform.position, 0.02f);
        //    Debug.DrawLine(Personaje.transform.position, Posicion4.transform.position);            
        //}

        else if (Physics.Linecast(Personaje.transform.position, Posicion1.transform.position, out Hit))
        {
            transform.position = Vector3.Lerp(transform.position, Posicion4.transform.position, 0.02f);            
            Debug.DrawLine(Personaje.transform.position, Posicion4.transform.position);
            //Player.GetComponentInChildren<SkinnedMeshRenderer>().material.color = Color.yellow;
            if (transform.position.y < 2.9)
            {
                Player.GetComponentInChildren<SkinnedMeshRenderer>().material.color = new Color(0.5f, 0.5f, 0.5f, 0.3f);
            }
            else
            {
                Player.GetComponentInChildren<SkinnedMeshRenderer>().material.color = new Color(0.5f, 0.5f, 0.5f, 1);
            }
            
        }
        else if (Physics.Linecast(Personaje.transform.position, Posicion2.transform.position, out Hit))
        {
            transform.position = Vector3.Lerp(transform.position, Posicion4.transform.position, 0.02f);            
            Debug.DrawLine(Personaje.transform.position, Posicion4.transform.position);
            //Player.GetComponentInChildren<SkinnedMeshRenderer>().material.color = new Color(0.5f, 0.5f, 0.5f, 0.3f);
            if (transform.position.y < 2.9)
            {
                Player.GetComponentInChildren<SkinnedMeshRenderer>().material.color = new Color(0.5f, 0.5f, 0.5f, 0.3f);
            }
            else
            {
                Player.GetComponentInChildren<SkinnedMeshRenderer>().material.color = new Color(0.5f, 0.5f, 0.5f, 1);
            }
        }
        else if (Physics.Linecast(Personaje.transform.position, Posicion3.transform.position, out Hit))
        {
            transform.position = Vector3.Lerp(transform.position, Posicion4.transform.position, 0.02f);            
            Debug.DrawLine(Personaje.transform.position, Posicion4.transform.position);
            //Player.GetComponentInChildren<SkinnedMeshRenderer>().enabled = false;
            //Player.GetComponentInChildren<SkinnedMeshRenderer>().material.color = new Color(0.5f, 0.5f, 0.5f, 0.3f);
            if (transform.position.y < 2.9)
            {
                Player.GetComponentInChildren<SkinnedMeshRenderer>().material.color = new Color(0.5f, 0.5f, 0.5f, 0.3f);
            }
            else
            {
                Player.GetComponentInChildren<SkinnedMeshRenderer>().material.color = new Color(0.5f, 0.5f, 0.5f, 1);
            }
        }

	}
}

Está hecho a lo bruto pero creo que se entiende bastante bien la idea.

 

Share this post


Link to post
Share on other sites

@J_L Pues sí, se entiende bastante, y el resultado parece estar bien. De todas maneras el juego el cual estoy programando no es realista. Si quieres ver algunas imágenes te puedes pasar por el twitter.

https://twitter.com/ZooRareStudio

Edited by leocub58

Share this post


Link to post
Share on other sites

Bonito juego, la estética me recuerda spellforce, solo le tienes que poner mucha gente paseando por las calles. Tiene un montón de detalles grafios.

Share this post


Link to post
Share on other sites
hace 37 minutos, Miguel_Angel said:

Bonito juego, la estética me recuerda spellforce, solo le tienes que poner mucha gente paseando por las calles. Tiene un montón de detalles grafios.

Sí, en eso estamos. Ahora me estoy encargando de las IAs del mundo (enemigos, aldeanos, guerreros, mercaderes...)

Share this post


Link to post
Share on other sites

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...