Tengo otra duda amigos, ya tengo movimientos del personaje y un escenario mas o menos montado, pero me gustaría que la cámara siguiera a mi personaje.
Lo he conseguido con un script a la cámara el cual se fija en las posiciones del caballero y le va siguiendo,
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CamaraSigue: MonoBehaviour {
public Transform objetivo;
public float suavizado = 5f;
Vector3 desfase;
// Use this for initialization
void Start () {
desfase = transform.position - objetivo.position;
}
// Update is called once per frame
void FixedUpdate (){
Vector3 posicionObjetivo = objetivo.position + desfase;
transform.position = Vector3.Lerp (transform.position, posicionObjetivo, suavizado * Time.deltaTime);
}
}
[/quote]
Vale,Pero me gustaría dado que mi fondo es una luna con un efecto parallax con nubes y una muralla en fin, que me gustaría que la cámara siguiera al personaje solo en el eje X e Y pero que cuando el personaje salte, la cámara no saltara con el.
Que parte del codigo tendria que retocar para que hiciera eso? gracias adelantadas.
Cita de: sami188 date=1511475917Vale,Pero me gustaría dado que mi fondo es una luna con un efecto parallax con nubes y una muralla en fin, que me gustaría que la cámara siguiera al personaje solo en el eje X e Y pero que cuando el personaje salte, la cámara no saltara con el.
La función que cumple un Vector3.Lerp es la de interpolar el vector A (tu posicion - cámara) vs el vector B (pos objetivo - player), es decir que solo con Vector3.lerp no podés lograr lo que querés (con solo dos objetos camara y player), acá tenés dos caminos que se me ocurren (en los dos ejemplos de abajo la camara sigue a su objetivo
en X e Y, no en Z)
1 - hacer el Lerp y luego modificar el componente en X,Y o Z, el que te interese bloquear.
float zpos;
void Start()
{
//cacheas el Z para no pedirlo constantemente, total no cambia
zpos = transform.position.z;
}
......
transform.position = Vector3.Lerp(transform.position , target.position , t);
transform.position = new Vector3(transform.position.x , transform.position.y , zpos);
2 - en vez de hacer un Vector3.Lerp haces un Mathf.Lerp para los componentes de interés
float zpos;
void Start()
{
//cacheas el Z para no pedirlo constantemente, total no cambia
zpos = transform.position.z;
}
......
transform.position = new Vector3(
Mathf.lerp(transform.position.x , target.position.x , t) ,
Mathf.lerp(transform.position.y , target.position.y , t),
zpos
);
Otra cosa, en ese código que tenés no debe ir un
FixedUpdate, estás modificando un transform directamente, es más estás siguiendo un objeto con una cámara del cual no tenés seguridad en que orden se ejecuta (aunque lo podés configurar en Execution Order en las opciones), es decir que la cámara debe actualziarse a lo último, cosa de que todos los objetos, (en sí el objeto de interés), se hayan actualizado, por lo que usá mejor un
LateUpdate. Por supuesto si el objeto de interés se mueve en lateUpdate estamos en la misma que antes, ahí sería necesario usar el executionOrder.
Vale, voy avanzando gracias, tengo otra duda, por ejemplo para enemigos o en este caso.
Me gustaria meter una caja, que cuando colisiones con el collider de la espada de mi Player, reproduzca una animacion que tiene echa y desaparezca despues.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class caja : MonoBehaviour {
void OnTriggerEnter2D(Collider2D col) {
if (col.CompareTag ("Sword")) {
gameObject.GetComponent<Animation>().Play("caja");
Destroy (gameObject);
}
}
}
[/quote]
Tengo este codigo que hice yo casero con mis conocimientos nulos de programar jaja, vale pero cuando busca en el game object la componente animation y la animacion caja sale el error de que no la encuentra. no se si esta es la forma correcta de hacerlo...
os adjunto un par de fotos del animation y del error en cuestión.
Gracias adelantadas.
(//%3CfileStore.core_Attachment%3E/monthly_2017_12/caja.JPG.ef1592b6030167448ba83afba728df20.JPG)
(//%3CfileStore.core_Attachment%3E/monthly_2017_12/5a27d6c79e54c_errorcaja.JPG.7b185d2542c9841df5d164e66fb88576.JPG)
Has probado a quitar el Destroy() para comprobar si se te ejecuta la animacion y no te tira el error? Si es asi, deberias hacer el destroy cuando la animación terminase en vez de inmediatamente. Aunque creo que no será esto.
Podrías probar tambien con un Animator en vez de Animation, a ver que ocurre.
En el Animator de esa caja, deberias hacer un clip que tenga una animacion en la que la caja no se mueva ni haga nada (reposo). Crear otro clip de animacion (en este caso ya lo tienes hecho) que seria la animacion "caja".
Haces una transicion desde el clip de reposo hasta el clip que tiene la animacion "caja" cuando la espada entre en el collider. Y cuando termine la animacion terminase, destruyes el gameObject.
No se si esto puede ayudarte. Un saludo
¿Porqyue haces un Play de la animación a pelo? Yo definria los estados del animator y cuando el enemigo muriese cambiaría el estado para que realizase la animación y que unos segundos despues se destruya (con o sin un efecto) y entonces desaparezca, visualmente no tiene nada que ver como van muriendo los bichos y se quedan tiesos un ratos hasta que desaparecen para no acumularse, aparte de que en el Animator tienes todos los estados del personaje y todas las animaciones organizadas y bajo que circunstancias pueden reproducirse, además de mezclarlas o controlar sus comportamientos y fusiones, pero bueno, esto ya son gustos de cada uno.
En principio veo un problema, el Play hace que la animación comience a reproducirse, con lo que si este código está en el bucle, mientras que la espada colisiones con el bicho comenzará a reproducirse en cada pasada, no parece tu caso, porque al estar en un OnTriggerEnter, solo debería saltar una vez, pero como ya me conozco yo las escalas y las físicas, pues yo lo pondría porque a veces Unity te putea con estas cosasdeberías reproducirla tal que asi, :
if (!animation.isPlaying) {
animation.Play();
}
como dice @ftejada prueba a quitar el destroy, aunque eso lo que haría es que no te daría tiempo a ver la animación, deberías destruir el objeto pasado un tiempo. De todas formas, insisto en que deberías usar el Animator en vez de Animation, que ya está en desuso