Vamo a ver si entendi:
Paso 1
Obtenemos el angulo actual de la mira en radianes por medio del arcotangente o bien atan
Paso 2
Seguimos a crear una variable encargada de manejar la quaternion en la que instanciaremos al objeto con el metodo Quaternion.AngleAxis() El cual recibe como parametro la rotación que deseamos realizar y el eje en el cual se hara la rotación, en este caso Vector3.Forward(0,0,1) es decir en el eje Z.(Este eje dependera segun el vector hacia el cual se dirija la bala, en este caso Vector3.Right)
** Paso3 **
Por ultimo instanciamos el objeto en la posición actual del player y con la quaternion que hemos obtenido en el paso anterior.
Si alguien encuentra algun error en mi razonamiento del codigo, por favor haganmelo sabes :D
Hay un método mas fácil con "velocity"
Gracias por tu aporte :D
Para los que quieran saber mas sobre cosas como ese "Serialized Field",sus nombres son atributos y pueden saber mas sobre ellos aqui:
Siento que solo está dictando código pero no explica bien para que sirven ciertas funciones(métodos). Igual investigo de la API de Unity de modo que termino entendiéndolo más o menos, pero podría explicarlo mejor.
Para saber mas del código existen otros cursos
Comparto, no explica bien todo. Está diciendo el paso a paso pero hay cosas que las salta, como por ejemplo explicar porque agarra el prefab del bullet y no puede agarrarlo directamente desde arriba. Dice "esto es un error" pero no explica por que...
Para hacer un gameObject de manera rápida, utilizamos los prefabs y además tenemos que usar la función Instantiate, para que tome forma en el juego.
Gracias
Todo GameObject, que se mueva a una carpeta dentro del proyecto, será un Prefab.
Gracias
Genial
:0
Hola este es mi codigo, cuando inicio mi juego me dice que tengo que solucionar los bugs pero todo esta bien, ayudaa
ya lo arregle era un punto
Si cambias GetMouseButton por GetMouseButtonDown ya dispara una sola bala.
Aunque con el GetMouseButton ya puedes hacer una lluvia de balas en todas direcciones.
si coloco el transform del player en el metodo Instantiate los proyectiles solo salen en linea recta
tengo un problema con el sprite de knob, si pongo este sprite, este se pone debajo de todo, queda debajo del mapa
Ayuda cuando disparo las balas no se ven en la seccion de juego y en escena, pienso que puede ser en la posicion de Z pero no se exactamente que puede ser y tampoco se ve mi aim cuando corre el juego
Buenas, no me esta funcionando el código para disparar con la rotación de la mira sigue disparando hacia el frente tengo algo llamado offset simplemente es para controlar la separacion de la mira y el personaje no es eso ya lo probé sin eso y el codigo literalmente es igual ayuda porfavor
Creo que tienes un error arriba del primer if ya que el no tiene el codigo aimoffset
using System.Collections;using System.Collections.Generic;using UnityEngine;publicclassPlayer:MonoBehaviour{ float h, v;[SerializeField] float speed =3;Vector3 moveDirection;//Direccion a la que esta volteando el jugadorVector2 facingDirection;//Referencia al prefabs de la bala[SerializeField]Transform bulletPrefab;/*Creamos una referencia que se vera reflejada en unity en
* la seccion de player ya que este el .cs
Solo agregas el objeto "Aim" a la parte "aim" de la seccion player*/[SerializeField]Transform aim;//Referencia a la camara pa la seccion de mvimiento del puntero[SerializeField]Camera camara;// Start is called before the first frame updatevoidStart(){}// Update is called once per framevoidUpdate(){//Movimiento del jugador //Extrae la informacion horizontal del teclado las letras a y d ó las flechas //La in formacion se guarda en h h =Input.GetAxis("Horizontal");//Funciona con w y s y flechas de arriba y abajo v =Input.GetAxis("Vertical");//Reasignamos la posicion de h al vector moveDirection moveDirection.x= h; moveDirection.y= v;/*Usamos el transform para pasar el movimiento al Player
Position para que se cambie de la posicion actual
moveDirection porque es el que tiene los cambios
El + es para que se sume la posicion y no regrese el player a 0, 0.*/ transform.position+= moveDirection *Time.deltaTime* speed;//Movimiento de la mira/*modificamos la posicion de aim
La nueva posicion sera en relacion al puntero del maouse en la camara
ScreenToWorldPoint traduce un punto de espacio en la pantalla
y lo convierte a un punto de espacio en el mundo
L estas diciendo que a la mira toma la posicion del mouse traducida de espacio de panta
a espacio de mundo
*///aim.position = camara.ScreenToViewportPoint(Input.mousePosition); //transform.position hace referencia a la posicion del jugador facingDirection = camara.ScreenToWorldPoint(Input.mousePosition)- transform.position;/*Capturamos el movimiento a la mira
Aunque es un vector 2 lo estamos casteando para que sea un vector 3
para que asi no importa cuanto se mueva siempre sera a la misma distancia
minima y maxima*/ aim.position= transform.position+(Vector3)facingDirection.normalized;//Cuando demos click izquierdo del mouse creamos la balaif(Input.GetMouseButton(0)){/*Sacamos el angulo entre la mira y el player en rad,
se multiplica para tenerlo en grados*/ float angle =Mathf.Atan2(facingDirection.y, facingDirection.x)*Mathf.Rad2Deg;Quaternion targetRotation =Quaternion.AngleAxis(angle,Vector3.forward);//targetRotation con esto pasamos una rotacionInstantiate(bulletPrefab, transform.position, targetRotation);}}}
Cuando arrastro el script Bullet a la carpeta no se transforma automatico a un prefab......como hago para convertirlo ?? ayuda por favor
Los scripts no se pueden convertir por sí solos en prefabs, tiene que ser un gameobject que esté en tu escena arrastrado desde la jerarquía.
Al arrastrarlo no se transforma automática 🥲
Sino entienden para que sirve una variable cualquier cosa les recomiendo que le pregunten a chat gpt y l es da la definición
se aorende mucho
Dispare mucho y se me crasheo :C
pudiste identificar qué sucedía? me paso lo mismo, volví a abrir unity y no me ha generado problema aún
Seguramente ya resolvieron el por qué, pero si no este es el problema. Al disparar se generan balas, y pues no se borran, así que como dispararon demasiado, generaron demasiadas balas y por ende el programa se crasheó. Eso se solucionará cuando aprendan a configurar que se eliminen las balas después de un cierto tiempo.
A mi me marca error en unity diciendo que vector3 es una referencia ambigua entre System.Numerics.Vector3 y UnityEngine.Vector3, no se cual sea el error en mi código o si sea unity.
¿Alguien tiene alguna idea? :)
using System.Numerics;using System.Reflection;using System.ComponentModel;using System.Threading;using System.Collections;using System.Collections.Generic;using UnityEngine;publicclassPlayer:MonoBehaviour{ float h; float v;Vector3 moveDirection;[SerializeField] float speed =3;[SerializeField]Transform aim;[SerializeField]Camera camera;Vector2 facingDirection;[SerializeField]Transform bulletPrefab;voidStart(){}// Update is called once per framevoidUpdate(){ h =Input.GetAxis("Horizontal"); v =Input.GetAxis("Vertical"); moveDirection.x= h; moveDirection.y= v; transform.position+= moveDirection *Time.deltaTime* speed;//Aim movement facingDirection = camera.ScreenToWorldPoint(Input.mousePosition)- transform.position; aim.position= transform.position+(Vector3)facingDirection.normalized;if(Input.GetMouseButton(0)){ float angle =Mathf.Atan2(facingDirection.y, facingDirection.x)*Mathf.Rad2Deg;Quaternion targetRotation =Quaternion.AngleAxis(angle,Vector3.forward);Instantiate(bulletPrefab, transform.position, targetRotation);}}}
Me costo muchisimo entender el ultimo condicional, asi que me pase un ratito para entender, se los paso por si alguno estuvo igual de perdido que yo
Nuevo sprite, reseteamos transform y creamos un script bullet
serializamos un campo con un float llamado speed y ponemos esto en update()
Input.GetMouseButton(), Toma como entrada el boton izquierdo del mouse si argumentamos 0 y el derecho si argumentamos 1.
Instantiate(), Crea un objeto que pasemos como parametro, ademas de especificar su posicion.
Quaternion sirven para representar rotaciones. identity hace que la rotacion sea 0.
Es decir, con este if hacemos que una bala se instancie en la posicion del jugador al apretar click izquierdo.
Momento de sacar la rotacion para que dispare en direccion correcta.
Para esto necesitamos sacar el angulo entre el jugador y la mira, el script queda asi
Mathf.Atan2() lo que hace es ubicar en un eje cartesiano las dos DIRECCIONES que le pasemos por parametro (x e y) y de ahí saca el angulo entre la trayectoria y el eje x.
Atan2 nos entrega este angulo en radianes (expresion matematica para angulos).
NOTA: Para que Antan2 funcione necesita que el sprite del prefab este mirando hacia la derecha.
Mathf.Rad2Deg convierte el numero radian a angulo de euler, que es el que usa el trnasform.
Quaternion.AngleAxis(float angulo, Vector3.direccion) crea una rotacion, por parametro pasamos el angulo como float (el que hicimos recien) y un vector3 indicando la direccion.