Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - PmL_Unity

#1
Scripting / Orbitar alrededor de objeto en 2d
Noviembre 02, 2019, 08:45:29 PM
Hola, quizas este video te puede ayudar si es que ya lo resolviste.
 
Girar alrededor u orbitar un objeto de juego en Unity 3D C #
 
 
 
Saludos.
#2
Scripting / [SOLUCIONADO]Fijar Cámara a Enemigos
Noviembre 02, 2019, 05:27:38 PM
Paso la solucion si alguien le interesa:
 
public class FijarCamra_Test_A : MonoBehaviour

{
 
    public float mouseSensitivity = 10f; 


    public float dstFromTarget = 2f;

    public Vector2 pitchMininMax = new Vector2(-40, 85);

    public float rotationSmoothTime = .12f;
 
    Vector3 rotationSmoothVelocity;

    Vector3 currentRotation;
 
    float yaw; // movimiento horizontal

    float pitch; // movimiento vertical

    public GameObject PLAYER;

    public Transform target;

    public Transform enemigo;

    public float speed;
 
    private void Awake()

    {


        PLAYER = GameObject.FindGameObjectWithTag("Player");

        target = PLAYER.transform;

    }
 


    void LateUpdate()

    {

        yaw += Input.GetAxis("GiroHorizontalCamara") * mouseSensitivity;

        yaw += Input.GetAxis("Mouse X") * mouseSensitivity;

        pitch -= Input.GetAxis("MovVerticalCamara") * mouseSensitivity;

        pitch -= Input.GetAxis("Mouse Y") * mouseSensitivity;

        pitch = Mathf.Clamp(pitch, pitchMininMax.x, pitchMininMax.y);
 
        currentRotation = Vector3.SmoothDamp(currentRotation, new Vector3(pitch, yaw), ref rotationSmoothVelocity, rotationSmoothTime);

        transform.eulerAngles = currentRotation;
 
        //LÍNEA NUEVA PARA FIJAR AL ENEMIGO       
 
       transform.LookAt(enemigo);

        transform.RotateAround(enemigo.position, Vector3.forward, speed * Time.deltaTime);
 
        //FIN LÍNEA NUEVA PARA FIJAR AL ENEMIGO       
 
        transform.position = target.position - transform.forward * dstFromTarget;
 
      

    }
 
 
 
 
 
Este script va a la cámara del Player y despues hago otro script para que active este script para fijar al enemigo y desactive el otro script / desactive este script  y active el otro para que vuelva a la cámara normal.
 
Quizás hay mejor y más eficientes manera de hacer esto pero es la que me resultó, gracias a todos por sus respuestas son unos genios todos :) 
#3
Scripting / [SOLUCIONADO]Fijar Cámara a Enemigos
Noviembre 02, 2019, 03:22:34 PM
Cita de: Ness date=1572478860Bueno  en mi  opinión, seria desactivar  la cámara del jugador o el scritp del Player cuando estuvieras cerca del enemigo en cuestión que quieres fijar,  luego emparentar esa cámara al enemigo, usar un Array almacenar el total de enemigos y una tag o algo para saber cual enemigo en especifico es el quieres fijar.
   
   
      luego de emparentarlo  la cámara al enemigo, le das distancia para que puedas ejecutar lo que gustes durante ese tiempo,  por ultimo le das salida, todo y des-emparentas la cámara y se le devuelves al jugador, vuelves a activar el scritp de la cámara del jugador.
   
   
      https://answers.unity.com/questions/715058/lock-target-and-orbit-it.html
   


 
 
Cita de: Antonio date=1572662890La cámara esa sencilla del  CamaraPlayer
   
   

public class CamaraPlayer : MonoBehaviour
{
   
    public float mouseSensitivity = 10f;
    public float dstFromTarget = 2f;
    public Vector2 pitchMininMax = new Vector2(-40, 85);
    public float rotationSmoothTime = .12f;
    Vector3 rotationSmoothVelocity;
    Vector3 currentRotation;
    float yaw;
    float pitch;
    public GameObject PLAYER;
   public Transform target;
    private void Awake()
    {
        PLAYER = GameObject.FindGameObjectWithTag("Player");
        target = PLAYER.transform;
    }
   
   
    void LateUpdate()
    {
        yaw += Input.GetAxis("GiroHorizontalCamara") * mouseSensitivity;
        yaw += Input.GetAxis("Mouse X") * mouseSensitivity;
        pitch -= Input.GetAxis("MovVerticalCamara") * mouseSensitivity;
        pitch -= Input.GetAxis("Mouse Y") * mouseSensitivity;
        pitch = Mathf.Clamp(pitch, pitchMininMax.x, pitchMininMax.y);
        currentRotation = Vector3.SmoothDamp(currentRotation, new Vector3(pitch, yaw), ref rotationSmoothVelocity, rotationSmoothTime);
        transform.eulerAngles = currentRotation;
 
        transform.position = target.position - transform.forward * dstFromTarget;
    }
   
}

   
       
   
   
      Está usando el valor yaw (que irá desde -infinito hacia +infinito aunque en la práctica, es de -360 a +360), es un ángulo que usas después para ponérselo a la Y en el transform.eulerAngles.
   
   
      En este código, ese ángulo se modifica moviendo el ratón, pero si tuvieras un enemigo, o un objetivo específico al que apuntar la cámara, lo que necesitas es hallar el ángulo para que apunte a ese punto.


      De modo que si tienes la X y Z de la posición del enemigo...
   
   
       
   
   
      
   
   
      En ese código que tienes después de hacer la rotación, simplemente mueve la cámara a la posición del jugador y da unos pasos hacia atrás, luego según veo yo no haría falta hacer más modificaciones para el asunto de la rotación.
   
   
      Para el pitch, la idea es igual, pero usando la distancia y la altura (Y) en lugar del X y Z. (Si haces algún enemigo volador pues puede que lo necesites, pero ten cuidado de aplicar también la línea del clamp o puede que la cámara empiece a dar vueltas raras y a ponerse bocabajo).
   
   
       
   
   
       
   
   
       
   
   
      Otra cosa sería cuando hallar el yaw mediante trigonometría y cuando mover el yaw mediante el ratón, se puede hacer dos cámaras, o también podrías poner alguna variable Transform para el "objetivo" de la cámara, si es igual a null, moverla con el ratón, si es distinto de null, hallar el yaw con la fórmula.
   


Muchas gracias por sus respuestas! 
#4
Scripting / [SOLUCIONADO]Fijar Cámara a Enemigos
Octubre 29, 2019, 02:58:24 PM
Cita de: Igor date=1572351841hola
   
   
      en ese script no se puede ver como el "player"  gira para dar la espalda a la camara... supongo que esa parte esta en el script del player...
   
   
      en el script tendria que hacer dos funciones, una para el control normal de la camara, y otra para cuando esta fijada...
   
   
      tampoco has dicho como quieres fijarla... que se fije mientras mantengas pulsado un boton? y cuando lo sueltes que se "libere" la camara?
   
   
      pues seria algo asi...
   
   

public class CamaraPlayer : MonoBehaviour
{
   
    public float mouseSensitivity = 10f;
    public float dstFromTarget = 2f;
    public Vector2 pitchMininMax = new Vector2(-40, 85);
    public float rotationSmoothTime = .12f;
    Vector3 rotationSmoothVelocity;
    Vector3 currentRotation;
    float yaw;
    float pitch;
    public GameObject PLAYER;
    public Transform target;
 
private Transform enemyTransform;//transform del enemy
public float enemyOffsetY = 3;
    private void Awake()
    {
        PLAYER = GameObject.FindGameObjectWithTag("Player");
        target = PLAYER.transform;
    }
   
   
    void LateUpdate()
    {
   //buscar el enemy mas cerca del centro de la pantalla
   if (Input.GetMouseButton(1)) {
      GetMoreCenteredEnemy();
   }
   //que se fije la camara mientras mantengas pulsado el boton derecho del raton
   if (Input.GetMouseButton(1)) {
      fixetToEnemy();
   } else {
      NormalCamera()
   }
}
 
void NormalCamera() {
        yaw += Input.GetAxis("GiroHorizontalCamara") * mouseSensitivity;
        yaw += Input.GetAxis("Mouse X") * mouseSensitivity;
        pitch -= Input.GetAxis("MovVerticalCamara") * mouseSensitivity;
        pitch -= Input.GetAxis("Mouse Y") * mouseSensitivity;
        pitch = Mathf.Clamp(pitch, pitchMininMax.x, pitchMininMax.y);
        currentRotation = Vector3.SmoothDamp(currentRotation, new Vector3(pitch, yaw), ref rotationSmoothVelocity, rotationSmoothTime);
        transform.eulerAngles = currentRotation;
 
        transform.position = target.position - transform.forward * dstFromTarget;
    }
 
 
void FixedToEnemy() {
   if (enemyTransform != null) {
             transform.position = target.position;
             Quaternion oldRot = transform.rotation;
             transform.LookAt(enemyTransform.position - (Vector3.up * enemyOffsetY));
             transform.rotation = Quaternion.Lerp(oldRot, trasnform.rotation, rotationSmoothTime)
             transform.position -= transform.forward * dstFromTarget;
   } else {
             NormalCamera();
        }
}
 
void GetMoreCenteredEnemy() {
   Vector2 screenCenter = new Vector2(Screen.width/2, Screen.height/2);
   GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");
   float centerDist = 100000;
       foreach (GameObject enemy in enemies) {
           Vector3 screenPos = cam.WorldToScreenPoint(enemy.transform.position);
            float dist = Vector2.Distance(screenCenter, new Vector2(screenPos.x, screenPos.y));
      if (dist < centerDist){
                centerDist=dist;
                 enemyTransform = enemy.transform;
      }
        }
}
 
}

   
       
   
   
      ???
   
   
      no se porque se han descuadrado todas las "llaves"...
   
   
       
   
   
      he pasado tu funcion "LateUpdate" a "NormalCamera"... y he añadido una que elige el enemy mas cercano al centro y otra que hace que la camara le mire... he añadido un valor de "offset" para que el enemy quede mas arriba del centro de la pantalla...
   
   
      creo que funcionara... pero no lo he probado... igual da algun error... 
   


Hola, Muchas gracias por tu respuesta, lo probare  Muchas gracias. Este script es para una camara en 3 persona típica de los juegos estilo the witcher 3, dark souls, darksiders, god of war etc..
 
La fijación que quiero lograr es la que tienen estos juegos nombrados a la hora de combatir, que fijas la cámara al enemigo para cuando te mueves no pierdes de vista al mismo.
#5
Scripting / [SOLUCIONADO]Fijar Cámara a Enemigos
Octubre 27, 2019, 03:01:59 PM
Cita de: iRobb date=1572163273Añadir una transform al enemigo en el punto de distancia que te interese. Tener una cámara disabled. Cuando llegue el momento, asigna la cámara a la transform y que pase a enabled. Realiza una rotation local de la transform o la cámara. Lo de que giren entorno al enemigo desde la posición del jugador no lo acabo de entender, ya que desde esta cámara secundaria lo que se verá es al enemigo en la rotación. Pero vamos, creo que te servirá de base.
   


Muchas gracias por tomarte el tiempo en responder, lo pondré en práctica. :)
 
Cita de: Igor date=1572165505creo que quieres algo como en zelda: ocarina of time...
   
   
       
   
   
      primero tienes que tener una lista o array de los enemigos 
   
   
      luego, cuando pulsas el boton de "fijar" enemigo, tienes que tener una funcion para ver cual es el mas cercano al centro de la pantalla (se hace con camera.worldToScreenPoint o algo asi) y entonces "cojes" ese transform como objetivo.
   
   
      luego, dependiendo como muevas la camara normalmente, pues lo que tienes que hacer es que mire hacia al enemigo... puede ser de varias maneras dependiendo como coloques la camara detras de tu personaje... la camara es libre? esta el protagonista siempre dando la espalda a la camara? el protagonista dispara o lanza flechas o algo hacia donde mira la camara? etc...
   
   
      si pones aqui el script o los scripts que controlan la camara podremos ayudarte mas facilmente
   


Mi script de la cámara es este: 
 

public class CamaraPlayer : MonoBehaviour
{
    
    public float mouseSensitivity = 10f; 
    public float dstFromTarget = 2f;
    public Vector2 pitchMininMax = new Vector2(-40, 85);
    public float rotationSmoothTime = .12f;
    Vector3 rotationSmoothVelocity;
    Vector3 currentRotation;
    float yaw;
    float pitch;
    public GameObject PLAYER;
   public Transform target;
    private void Awake()
    {
        PLAYER = GameObject.FindGameObjectWithTag("Player");
        target = PLAYER.transform;
    }
    
   
    void LateUpdate()
    {
        yaw += Input.GetAxis("GiroHorizontalCamara") * mouseSensitivity;
        yaw += Input.GetAxis("Mouse X") * mouseSensitivity;
        pitch -= Input.GetAxis("MovVerticalCamara") * mouseSensitivity;
        pitch -= Input.GetAxis("Mouse Y") * mouseSensitivity;
        pitch = Mathf.Clamp(pitch, pitchMininMax.x, pitchMininMax.y);
        currentRotation = Vector3.SmoothDamp(currentRotation, new Vector3(pitch, yaw), ref rotationSmoothVelocity, rotationSmoothTime);
        transform.eulerAngles = currentRotation;
 
        transform.position = target.position - transform.forward * dstFromTarget;
    }
    
}

 
 
 
La cámara es en 3ra persona al estilo GOD OF WAR (ps4), ASSASSINS CREED, DARK SOULS, DARKSIDERS, THE WITCHER 3 etc..  y si es libre y da a la espalda del player siempre.
 
Muchas gracias por tu respuesta y por tomarte un tiempo para responder.  :)
#6
Scripting / [SOLUCIONADO]Fijar Cámara a Enemigos
Octubre 27, 2019, 02:17:01 AM
Hola a todos,  lo que quiero hacer y no me sale porque no se me cae una idea de como empezar es de hacer que una cámara en tercera persona se fije al enemigo y que gire en torno al enemigo pero desde la posición de mi jugador, osea la tipica fijación de enemigo de todos los juegos de combate en tercera persona. 
 
Quiero lograr eso pero no se  por donde empezar, agradeceria si alguien me podria dar alguna orientación para poder conseguir algo parecido. 
 
Muchas gracias.
#7
Scripting / Pausas en combate por turnos
Julio 27, 2019, 08:39:06 PM
@iRobb  muchas gracias por tu respuesta.
#8
Scripting / Pausas en combate por turnos
Julio 27, 2019, 06:10:43 PM
Buenas a todos, estoy practicando en intentar hacer un sistema de combates por turnos tipo dragon quest XI  en donde  cuando el jugador al presionar algun boton de ataque el personaje se mueve hacia el enemigo y lo ataca(y hace todo lo que tiene que hacer, animaciones, partículas etc) y después regresa a su posición inicial, después pasa al turno del enemigo y tambien  cuando ataca y hace lo que tiene que hacer, avanza hacia el jugador y cuando termina regresa a su posición inicial, así hasta que alguno se quede sin vidas primero.
 
Tendría la lógica de hacer lo que estoy explicando más arriba pero mi problema es con las pausas  de combates a la hora de la programación, es decir que primero realize toda la acción del jugador y despues cuando termine que pase el turno del enemigo y que realize toda la acción que deba hacer y  solo cuando termine la acción del enemigo recién puede volver a atacar el jugador, ¿me explico?.
 
He realizado pruebas pero va todo muy rapido e instantaneo y no tiene esas pausas como en el sistema de combate de dragon quest por ejemplo.
 
Quisiera pedirles si alguien me podria dar alguna orientación o algun tutorial o web en donde pueda realizar lo que deseo en cuanto las pausas en los combates por turnos  a la hora de la programación.
#9
General (Antiguo) / [Ayuda] Camara
Noviembre 29, 2018, 09:50:46 PM
Muchas gracias por sus respuestas
#10
General (Antiguo) / [Ayuda] Camara
Noviembre 26, 2018, 03:50:19 PM
Tengo un problema con la renderización de objetos con la cámara de mi proyecto, el problemas es que la cámara no renderiza los objetos que están un poco lejos del personaje y cuando me voy acercando se van renderizando de apoco y  los objetos que están muy cerca de la cámara se van  perdiendo de a poco.
 
Quisiera saber si hay alguna solucion para que no pase esto u que pase pero de otras formas más elegante.
#11
General (Antiguo) / [RESUELTO]Ayuda Con Enemigo
Julio 25, 2018, 02:20:40 PM
Cita de: Igor date=1532476558

enemy
public GameObject[] items;
//tus posibles items
float life = 100;
 
void Update() {
   ...
 
   if (life < 1) {
      death();
   }
}
               
void death() {
   int objNum = (int)Random.Range (0, items.Length);
   Instantiate (items[objNum], transform.position, transform.rotation);
   Destroy(this.gameObject);
}

   

spawner
public float waveCountDown = 120f; //dos minutos
private float timer = 0f;
public int enemyCount = 4;//cuantos enemigos "spawnea" cada vez
public float radius = 10f;//radio donde se "spawnean" alrededor de este objeto
public GameObject enemy;//el enemigo
  
void Update() {
   timer += Time.deltatime;
   if (timer > waveCountDown) {
      timer = 0;
      spawn();
   }
}
void spawn() {
 
   for (int i = 0; i < enemyCount; i++) {//bucle (tantos enemigos como hayas puesto)
      Vector3 pos = new Vector3(Random.Range(-radius, radius), 0f, Random.Range(-radius, radius));     
     //posicion aleatoria dentro de ese area
      pos += transform.position;  //añadir la posicion de este obj    
      Instantiate(enemy, pos, transform.rotation);//crear enemigo
   }
}

   
      ahi van dos fragmentos sencillos de codigo que hacen lo que dices
   
   
      el primero suelta items al morir (un item, de entre una lista de items que le pongas)
   
   
      el segundo crea 4 enemigos cada dos minutos en un area de 20*20 alrededor del objeto que lo posea...
   
   
      los he hecho lo mas basico... obviamente se puede hacer todo lo complejo que quieras... que los items salgan como con un impulso... puedes instanciar tambien una explosion (hecha con particulas porejemplo) 
   
   
      ...si quieres que el primero suelte mas de un item puedes hacer un bucle como en el segundo...
   


Muchas gracias, me has ayudado un monton, saludos!
#12
General (Antiguo) / [RESUELTO]Ayuda Con Enemigo
Julio 24, 2018, 11:00:03 PM
Hola, 1 -¿ alguien sabe como se puede hacer para que un enemigo cuando muera suelte cosas por ejemplo una poción de vida?
 
          2- tambien me gustaria saber como se puede hacer para generar oleadas de enemigos, por ejemplo  primero salen 4 enemigos y después cuando se eliminen esos enemigos salen otros 4 y así hasta que finalice las oleadas. 
#13
General (Antiguo) / Consulta
Marzo 01, 2018, 05:46:10 AM
Cita de: lightbug date=1519857687Como se está con el drag and drop ultimamente en foro ...
   
   
      La parte de que recoja objetos y se vayan llenando, podés hacer la lógica muy simple, algo así (está todo muy por arriba )
   
   

//-------------------------------------------------------------------------------
//Tu manager de inventarios ?? o cualquier parte del código que decida cuando y donde guardar los items
//-------------------------------------------------------------------------------
 
void GuardarItem(Item item)   //este es el item que recogiste
{

if(inventario1.permitido)
{
   inventario1.GuardarItem(item);
}else if(inventario2.permitido)
{
   inventario2.GuardarItem(item);
}else{
   //No hay más espacio
}
}
//-------------------------------------------------------------------------------
// Inventario ---------------------------------------------------------------------
//-------------------------------------------------------------------------------
 
List<Item> listaElementos = new List<Item>();
int maximoPermitido = 10;   
public bool permitido{ get{ return listaElementos.Count < maximoPermitido } }
 
public void GuardarItem(Item item){
listaElementos.Add(item);
}
 

   
      La parte del drag and drop se divide en dos:
   
   
      1 - hacer el drag and drop, debe haber miles de tutoriales por ahí, si estás en UGUI podés usar los eventos dragenter dragexit (creo, ya ni me acuerdo) y en cada uno interpretar las posiciones o detectar los slots del inventario, en base a eso realizar una funcionalidad (punto siguiente), imprimí siempre el lugar donde "dropeas", la pos del mouse, y lo que se te ocurra. Aprendé de anc***dPosition y rectTransform en general, va a ser vital en esto.
   
   
       
   
   
      2- Funcionalidad, olvidate por ahora del drag and drop, dentro del mismo manager de inventario ejemplo de arriba podés hacer algo bien sencillo (a modo de prueba):
   
   

//fijate que puse int, solo para dar una idea, sería la pos en la lista de elementos
public int slotA;   
public int slotB;
public void HacerElCambio()
{
//Aca va la lógica del intercambio
}

   
      Y desde cualquier lado disparar esto (con la "E", por qué no?):
   
   

if( input --> "E")
HacerIntercambio():

   
      LA idea es probar toda combinación de Slot A y B, de un Inv a otro, al mismo, a un objeto ya existente, a un lugar inexistente, etc... fijate que los iconos (si tenés) deben comportarse correctamente, todo en orden. Una vez que la parte funcional ande sabés que el proceso del punto 1 culmina en llamar a esta función (pero pasandole los Slots correspondientes).
   
   
      Saludos
   
   
       
   


Muchas gracias, eres un genio! lo voy a porbar y cualquier cosa comento que tal me fue, Muchas gracias.
#14
General (Antiguo) / Consulta
Febrero 28, 2018, 09:15:16 PM
Buenas!. Quiero consultarles a la comunidad si alguien hizo o tiene idea de como seria la lógica de lo siguiente:
Tengo hecho un inventario de selección de objetos, lo que quiero hacer y no me sale es que cuando el Inventario 1 este lleno, que los objetos que recoja se pase al inventario 2 y que del inventario 2 pueda hacer un drag and drop con el inventario 1.
¿No se si me explico? ¿alguien me podria dar alguna orientación de cómo seria la logica para esto
 
P/D El inventario 1 es el principal y de donde puedo seleccionar y usar los objetos, el inventario 2 vendría hacer una especie de caja donde me guarda los ítems que no puedo recoger del inventario 1 por estar lleno y por ende se guardan aquí, pero si los quiero usar los tengo que pasar al inventario 1, y esa mecánica no me sale.
#15
General (Antiguo) / Saludos
Mayo 12, 2017, 01:51:16 AM
Hola soy nuevo en la comunidad espero poder ayudar en lo que pueda y que me puedan ayudar en lo que puedan, soy de argentina.