Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Duda con la camara

Iniciado por Scripter80, Agosto 03, 2017, 11:05:22 PM

Tema anterior - Siguiente tema
Agosto 03, 2017, 11:05:22 PM Ultima modificación: Agosto 06, 2017, 10:38:28 PM por pioj
Estoy trabajando en un prototipo de juego 2D plataforma, pero cuando aplico el script de muerte del gameObject "Player", me da error el script de cameraFollow.
 
A continuacion, les dejo los dos Scripts, y bueno ojalá me puedan ayudar con algun consejo.
 
 
 

Script Segumiento de Camara
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class cameraFollow2DPlatformer : MonoBehaviour {
    public Transform target; //lo que la camara estara siguiendo
    public float smoothing; //efecto dampening
    Vector3 offset;
    float lowY;
    // Use this for initialization
    void Start () {
        offset = transform.position - target.position;
        lowY = transform.position.y;
    }
    
    void FixedUpdate () {
        Vector3 targetCamPos = target.position + offset; // donde sera ubicada la camara
        transform.position = Vector3.Lerp (transform.position, targetCamPos, smoothing*Time.deltaTime);
        if (transform.position.y < lowY)
            transform.position = new Vector3 (transform.position.x, lowY, transform.position.z);
    }
}
 
Script Salud del Jugador
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class playerHealth : MonoBehaviour {
    public float fullHealth;
    public GameObject deathFX;
    float currentHealth;
    PlayerController controlMovement;
    // Use this for initialization
    void Start () {
        currentHealth = fullHealth;
        controlMovement = GetComponent<PlayerController> ();
    }
    // Update is called once per frame
    void Update () {
        
    }
    public void addDamage (float damage){
        if (damage <= ) return;
        currentHealth -= damage;
        if (currentHealth<=) {
            makeDead();
        }
    }
    public void makeDead (){
        Instantiate (deathFX, transform.position, transform.rotation);
        Destroy(gameObject);
    }
}

 
 

@Scripter80, a ver si nos acostumbramos a decir el error que te muestra la consola y no solo copiar los scripts ... tan mal esta el que solo muestra los scripts sin el error, como el que muestra solo el error sin los scripts; mostrando toda la informacion es mas facil (comodo) para el que quiera ayudar. Eso es una recomendacion para cualquiera, no solo para ti.
 
Dicho eso, el error que te debe saltar es porque tienes una variable en el script de la camara que se llama target (quiero entender que se trata del objeto jugador) ... pero cuando el jugador muere destruyes ese objeto, por lo que en el momento que eso sucede y la camara intenta consultar dicho objeto no lo encontrara y habra un error.
 
Para solucionarlo, es tan facil como antes de consultar la variable target del script cameraFollow2DPlatformer compruebes de que existe el objeto.

Seguro es lo que dice Arthure.
 
Para agregar, por que usar FixedUpdate? cuando vos modificas transforms(position, rotation, scale) siempre usa Update, esas cosas se actualizan cuadro a cuadro, solo las fisicas llevan otro step aparte con el fixedUpdate. Ademas estas usando un deltaTime(Update) y no un fixedDeltaTime(fixedUpdate).
 
Generalmente cuando seguis algo se suele utilizar un LateUpdate (o podes usar un Update cambiando el ExecutionOrder y ponerlo ultimo, pero ya existe el "Late") ya que vos lo pensas como que todo en la escena hizo lo suyo, solo resta que la camara siga al target antes de mostrar en pantalla, que lo enfoque o haga lo que tenga que hacer. Imaginate que se ejecuta el script de la camara antes que el player, enfoca al player, luego el player cambiar de pos, entonces la camara siempre esta un paso por detras lo cual no queda muy feo, pero queda incomodo.

Antes que nada, gracias por las sugerencias, la verdad a veces se me van esos detalles tan simples, igualmente aqui les dejo el texto del error y cito:
 
"MissingReferenceException: The object of type ´Transform´ has been destro*** but you are still trying to access it. Your script should check if it s null or you should not destroy the object."
 
Como soy muy inexperto en programacion, igualmente me doy cuenta que me esta dando estas dos opciones, pero aun me pierdo un poco.
 
Pudiera ser que, por ejemplo:
 
Si el objeto al que estoy siguiendo es destruido, entonces ¿podre dejar la camara en la ultima posicion donde fue destruido ese objeto?
 
Pregunto, porque de ser asi, no se si podre entonces hacer que cuando el "player" reaparezca en la escena, la camara vuelva a seguirlo.
 
 
 
Seria esto posible y factible?

Cita de: Scripter80 date=1501864328 
   
   
      "MissingReferenceException: The object of type ´Transform´ has been destro*** but you are still trying to access it. Your script should check if it s null or you should not destroy the object."
   
   
       
   


en algun momento se destruye el objeto al q apunta la camara (variable target)
 
tendrias q poner una condicion para q si se hace null no ejecute ese pedazo de codigo

Podrias hacer el condicional que te dicen y listo, chau error, o podrias como hago yo tener un target(un simple Vector3).
 
Por Ejemplo: Tengo un platformer 2D, mi personaje sale muy rapido hacia la derecha, la camara lo va siguiendo con un Lerp muy bonito pero todavia no llega a "casi estabilizarse" (el jugador estaria mas a la derecha de la pantalla), de pronto el jugador muere (el virtual del juego, no el de carne y hueso) entonces la camara se detiene de golpe, deja de suavizar y llegar a donde supuestamente murio el jugador porque te tira null (si tuvieras el error) o simplemente sale del condicional y no hace lo suyo (aunque habria formas de salvarlo), queda horrible y casi ningun juego tienen esto. En cambio si pones que la camara siga a un target, y ese target siempre sigue al jugador nunca vas a tener ningun problema porque independizas instancia player vs target de camara. Esto lo podes aplicar y extender de maneras muy utiles como por ejemplo de golpe la camara decide mirar a otro target, fijate un recurso que subi hace un tiempito que funciona algo asi (mira el gif):

 
Saludos

Cita de: lightbug date=1501880561de pronto el jugador muere (el virtual del juego, no el de carne y hueso)
   


Jejeje, y encima luego...
 
Cita de: lightbug date=1501880561(aunque habria formas de salvarlo)
   


Jejejejejeje
 
Lo de poner un objeto que siga al player y luego poner que la camara siga a ese objeto me parece un buen recurso, encima podrias mover ese objeto donde quisieras para poder montar escenas con camara tipo cinematografica, o para conversaciones porejemplo, sin tener que hacer mucho papeleo, buena idea lightbug (hay que poner una arroba delante del nombre para que salga como citado?)

Cita de: Igor date=1501883425hay que poner una arroba delante del nombre para que salga como citado?)
   


En el resto de los foros o redes sociales del mundo conocido por el hombre si, pero no se porque aca no es asi, quizas pioj me pueda iluminar al respecto. Los pasos que yo sigo son:
 
Arroba , espacio , borras un lugar, escribis

Ok, @lightbug aprendido, escribo desde el telefono porque no tengo internet en mi casa y le cuesta un poco cargar pero si que sale, si

Etiquetas: