buenas tengo un problema.
Al instanciar un zombie que hice desde blender, este coge una rotación en el eje x la cual no es la predeterminada (0). He
que podría estar ocurriendo??
Os dejo el script del zombie por si el error esta ahí.
public class Enemigo : MonoBehaviour {
private float vida = 100f;
public float velocidadMovimiento;
GameObject Player;
void Awake(){
Player = GameObject.FindWithTag ("Player");
}
void Update(){
this.transform.LookAt (this.Player.transform.position);
this.transform.Translate (Vector3.forward * this.velocidadMovimiento * Time.deltaTime);
if (vida <= 0f) {
Muerte ();
}
}
void Muerte(){
Destroy (gameObject);
}
public void Vida (float amount) {
vida -= amount;
if (vida <= 0f) {
Muerte ();
}
}
public void sonido()
{
}
}
y por aquí el del instanciador
public class InstanciadorZombie : MonoBehaviour {
public GameObject instanciadorZombies;
public GameObject Zombie;
private int numZombiesMax = 5;
int numZombiesMin = 0;
public float TiempoEntreZombie;
private float TiempoUltimoZombie;
void Update(){
Instanciador ();
}
public void Instanciador(){
if (numZombiesMin < numZombiesMax && Time.time - TiempoUltimoZombie >= TiempoEntreZombie) {
Instantiate (this.Zombie, this.instanciadorZombies.transform.position, this.instanciadorZombies.transform.rotation);
numZombiesMin++;
TiempoUltimoZombie = Time.time;
if (numZombiesMin == numZombiesMax) {
Invoke ("MasZombies", 20f);
}
}
}
public void MasZombies(){
numZombiesMax = numZombiesMax + 5;
}
}
Gracias
Ya probaste de ponerlo manualmente en la escena y que esté bien orientado ? ... por bien orientado me refiero a que el objeto padre (generalmente uno vacío) sea congruente con el hijo (generalmente el modelo o jerarquías del modelo). 1 ) Si esto está bien la estás cagando en el código, además revisá que "instanciador zombi" tenga la rotación que deseas,.2) Si esto está mal es un problema de importanción del modelo (probablemente, de blender siempre tuve uno o dos problemitas con los modelos).
esta todo correcto en la escena. tiene la rotación de 0
pero sigue sin funcionar
Instantiate(zombi, transform.position, new Quaternion());
//new Quaternion te crea una rotacion "standard", oses, en eulers seria (0,0,0)
//tambien puedes rotarlos a mano:
GameObject nuevoZombie = (GameObject)Instantiate(zombie, pos, rot));
nuevoZombie.transform.eulerAngles = new Vector3(0,0,0);
//.....o rotacion random en el eje Y...
nuevoZombie.transform.eulerAngles = new Vector3(0,Random.Range(0f,360f),0);
ya se cual es el problema.
El fallo esta en cuando le digo al objeto que tiene que mirar al player, este no se porque pero coge una rotación y cuanto mas cerca esta el player del objeto mas rota en x.
he probado a darle la rotación, a congelar las rotaciones con el rigidbody y no se que hacer...
Cita de: S0LXZ date=1538575026ya se cual es el problema.
El fallo esta en cuando le digo al objeto que tiene que mirar al player, este no se porque pero coge una rotación y cuanto mas cerca esta el player del objeto mas rota en x.
he probado a darle la rotación, a congelar las rotaciones con el rigidbody y no se que hacer...
dale que mire al player, seguro usas LookAt, luego en la línea que sigue anula o impone el valor que quieras en un eje de rotación.
pepe.transform.LookAt(player);
pepe.transform.rotation = new Vector3( 0 , pepe.transform.rotation.y , pepe.transform.rotation.z /* o cero si da */ );
no puedo poner un vector 3 en rotación.
Cita de: S0LXZ date=1538590671no puedo poner un vector 3 en rotación.
XD sí, se me escapó, bueno me entendés ... ;) Ponelo en
eulerAngles y listo, o usa las herramientas de quaternion para hacer la traducción de uno a otro.
si XD no importa ya lo hice pero ahora no siguen al player
lo que creo que esta pasando es que al anular la rotación del zombie ya deja de mirar al player ¿¿como podría solo congelar el angulo de rotación x??
me podeis ayudar, no encuentro nada en internet
Cita de: S0LXZ date=1538670400¿¿como podría solo congelar el angulo de rotación x??
te lo puse arriba, estoy imponiendo eulerAngle.x = 0
pero lo que eso hace es dejar de mirar al player
no tengo ni idea de que hacer... me podeis ayudar es que no paro de darle vueltas y os lo agradeceria
Cita de: lightbug date=1538758412te lo puse arriba, estoy imponiendo eulerAngle.x = 0
vale, al ponerlo funciona, pone que rota pero no es asi, es decir, en el apartado de transform (en el inspector) los numeros del eje Y cambian en función el player se mueve y el eje x ya no supone un problema, pero aunque en el inspector funcione, el zombie no rota de manera visible y no persigue al player
Cita de: S0LXZ date=1538903413vale, al ponerlo funciona, pone que rota pero no es asi, es decir, en el apartado de transform (en el inspector) los numeros del eje Y cambian en función el player se mueve y el eje x ya no supone un problema, pero aunque en el inspector funcione, el zombie no rota de manera visible y no persigue al player
Rota pero no rota? Podrias subir una imagen con la jerarquía q usas, cualquier cosa q sume, porq el procedimiento es muy simple, si no te anda debe ser por algo más
creo que podria ser un problema de gerarquias... estas rotando el objeto equivocado.... o tambien podria ser la orientacion del objeto... cuando el zombie esta de pie en el escenario su angulo X es cero? como dice @lightbug unas imagenes ayudarian a ver de donde puede venir el problema...
las gerarquias... el inspector del zombi...
parece que si rota pero rota muy poco
este es el inspector del zombie, mirad como no esta mirando al player pero cada vez que se aleja rota un poco mas pero muy poco
nose...
todo parece bien... prueba a poner algo asi:
oldRot = transform.rotation;
transform.LookAt(player.transform.position);
transform.rotation = Quaternion.Lerp(oldRot, transform.rotation, 0.1f);
...igual en vez de usar la posicion del player usa un new vector3 con la "Y" del enemigo...
new Vector3(player.transform.position.x, transform.position.y, player.transform.plsition.z);
asi dara igual que esten a diferente altura...
y ese oldRot como lo incluyo??
no puedo poner el oldRot en ninguna parte y lo otro no va
No parece ser problema de código, parece más problema de pivote en la malla. Prueba a usar un cubo como enemigo, con una textura que permita determinar la cara delantera.
O sino sube el proyecto para que lo descarguemos y probar.
Cita de: S0LXZ date=1538934224y ese oldRot como lo incluyo??
seria asi:
Quaternion oldRot = transform.rotation;
Vector3 playerPosXZ = new vector3(player.position.x, transform.position.y, player.posotion.z);
transform.LookAt(playerPosXZ);
transform.rotation = Quaternion.Lerp(oldRot, transform.rotation, 0.1f);
Cita de: debug date=1538982092Cita de: Igor date=1538987758
seria asi:
Quaternion oldRot = transform.rotation;
Vector3 playerPosXZ = new vector3(player.position.x, transform.position.y, player.posotion.z);
transform.LookAt(playerPosXZ);
transform.rotation = Quaternion.Lerp(oldRot, transform.rotation, 0.1f);
No parece ser problema de código, parece más problema de pivote en la malla. Prueba a usar un cubo como enemigo, con una textura que permita determinar la cara delantera.
O sino sube el proyecto para que lo descarguemos y probar.
muchísimas gracias eso es lo que me funciona, os agradezco a todos el haberme ayudado
una pregunta mas, es que es mi primer proyecto completo y me esta ocurriendo un problema con los sonidos.
El sonido se reproduce cuando muevo el player pero solo una vez, es decir que cuando mantengo la tecla de caminar no suena, pero si la aprieto y la suelto si que se reproduce
if (Input.GetAxisRaw("Vertical") != 0)
{
this.transform.GetComponent<AudioSource>().Play();
this.transform.Translate (-Vector3.forward * this.velocidadMovimiento * Input.GetAxisRaw ("Vertical") * Time.deltaTime); // Hacia delante
}
if (Input.GetAxisRaw("Horizontal") != 0)
{
this.transform.GetComponent<AudioSource>().Play();
this.transform.Translate (-Vector3.right * this.velocidadMovimientoHorizontal * Input.GetAxisRaw("Horizontal") * Time.deltaTime); // Hacia los lados
}
Cita de: S0LXZ date=1539022921El sonido se reproduce cuando muevo el player pero solo una vez, es decir que cuando mantengo la tecla de caminar no suena, pero si la aprieto y la suelto si que se reproduce
No creo que no se reproduzca, me parece que se está re-reproduciendo > 60 veces por segundos y claro no te das cuenta de esto por oido (si usaras PlayOnce o algo así se dispararían muchas reproducciones a la vez, con Play no ocurre). Podés hacer que si no se está reproduciendo se reproduzca (dejalo NO en loop). Fijate en la parte de audio "isPlaying" del manual.
he probado con lo de isPlaying pero no funciona, podría ser porque el clip duramas de 1 seg??
//primero declaras en la class:
private float soundTimer = 0f;
//y donde haces sonar el sonido pones:
soundTimer += Time.deltatime;
if (soundTimer > 0.5f) {//pon el tiempo que quieras
soundTimer = 0;
sonido.Play();
//...o como se llame te audioSource...
}
esto es para que suene cada 0.5 segundos (supongo que seran "pisadas")
muchas gracias