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ú

Temas - Bydark

#1
General (Antiguo) / Problema deshabilitando script
Diciembre 01, 2018, 04:34:10 PM
Muy buenas, estoy realizando diálogos y me interesa que al hacer X cosa ya no puedas volver a dialogar. Estoy usando para ello Fluent Dialogue.
 
 
 
El problema es que cuando inicio una conversación, FluentDialogue instancia un script llamado ProximityInitiator al objeto con el que estás hablando, lo que quiero es deshabilitarlo una vez se haya cumplido una variable, pero no puedo acceder al script desde mi código porque no existe ( es una instancia ).
 
No sé si me he explicado bien, intento deshabilitarlo de esta manera..
 
 
 

public GameObject dialoguepotions;
if (hasapotion == true) {
   
      dialoguepotions.GetComponent<ProximityInitiator> ().enable = false;
   }
 

 
 
 


Esto obviamente no funciona, porque el script al que intento acceder no ha sido instanciado aún.. alguna idea??
 
Muchas gracias!
#2
General (Antiguo) / Problema con luces y Ambient Oclusion
Noviembre 27, 2018, 11:09:13 PM
Buenas a todos, estoy teniendo un problema que creo que está relacionado con algún parámetro de la cámara, cuando una luz desaparece de la vista de la cámara es como que se apaga de repente, y deja un efecto muy raro, al acercarme hace como si encendiera de nuevo.
 
Me pasa lo mismo con el efecto Ambient Oclusion, al acercarme y alejarme desaparece el efecto.
 
En este pequeño vídeo se puede ver el ejemplo de las luces y Ambient Oclusion, aunque esté último es más difícil de ver porque la escena es muy oscura (fijaros por los lados, veréis como la oscuridad desaparece a medida que la cámara se mueve)
 
Un saludo!
 
 
 
https://i.gyazo.com/aca269768f0b29f345d339594490d4d7.mp4
 
 
 
PD: Aprovecho para recordar que estoy buscando diseñadores 2D para el juego que podéis ver en el link de arriba.
#3
Muy buenas a todos, estoy realizando un proyecto desde hace unos días, y me he dado cuenta de que necesito un diseñador 2D, ya que este no es mi fuerte, básicamente necesito que cree personajes y enemigos, con sus debidas animaciones, sólo puedo mostrar una foto del proyecto, aún está muy verde.
 
 
 
Por favor, sólo gente seria y con experiencia.
 
 
 
PD: El sprite usado en la foto no es mío.
 
 
 
PD2: Os preguntaréis por qué no uso un modelo 3D, la respuesta es simple, quiero que así sea el juego, un sprite en un mundo 3D.
 
 
 
Gracias a todos.
 
#4
Estoy haciendo un juego donde el personaje y Npcs son sprites, pero el resto de cosas son elementos 3D.
 
 
 
Lo que quiero es que los enemigos me persigan y para ello he intentado adaptar un script que lo hace pero en 2D, os dejo el script y más abajo un enlace de como se comporta el personaje, a ver si me podéis echar una mano, intuyo que hay que cambiar algunas cosillas para que funcione en los ejes tan particulares que tiene este juego.
 
 
 
EJEMPLO DEL RAYCAST
 
 
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour {
    // Variables para gestionar el radio de visión, el de ataque y la velocidad
    public float visionRadius;
    public float attackRadius;
    public float speed;
    // Variable para guardar al jugador
    GameObject player;
    // Variable para guardar la posición inicial
    Vector3 initialPosition;
    // Animador y cuerpo cinemático con la rotación en Z congelada
    Animator anim;
    Rigidbody rb3d;
    void Start () {
        // Recuperamos al jugador gracias al Tag
        player = GameObject.FindGameObjectWithTag("Player");
        // Guardamos nuestra posición inicial
        initialPosition = transform.position;
        anim = GetComponent<Animator>();
        rb3d = GetComponent<Rigidbody>();
    }
    void Update () {
        // Por defecto nuestro target siempre será nuestra posición inicial
        Vector3 target = initialPosition;
        // Comprobamos un Raycast del enemigo hasta el jugador
   RaycastHit2D hit =   Physics2D.Raycast(
            transform.position,
            player.transform.position - transform.position,
            visionRadius,
            1 << LayerMask.NameToLayer("Default")
                // Poner el propio Enemy en una layer distinta a Default para evitar el raycast
                // También poner al objeto Attack y al Prefab Slash una Layer Attack
                // Sino los detectará como entorno y se mueve atrás al hacer ataques
        );
        // Aquí podemos debugear el Raycast
        Vector3 forward = transform.TransformDirection(player.transform.position - transform.position);
        Debug.DrawRay(transform.position, forward, Color.red);
        // Si el Raycast encuentra al jugador lo ponemos de target
        if (hit.collider != null) {
            if (hit.collider.tag == "Player"){
                target = player.transform.position;
            }
        }
        // Calculamos la distancia y dirección actual hasta el target
        float distance = Vector3.Distance(target, transform.position);
        Vector3 dir = (target - transform.position).normalized;
        // Si es el enemigo y está en rango de ataque nos paramos y le atacamos
        if (target != initialPosition && distance < attackRadius){
            // Aquí le atacaríamos, pero por ahora simplemente cambiamos la animación
            anim.SetFloat("movX", dir.x);
      anim.SetFloat("movZ", dir.z);
            anim.Play("Enemy_Walk", -1, 0);  // Congela la animación de andar
        }
        // En caso contrario nos movemos hacia él
        else {
            rb3d.MovePosition(transform.position + dir * speed * Time.deltaTime);
            // Al movernos establecemos la animación de movimiento
            anim.speed = 1;
            anim.SetFloat("movX", dir.x);
            anim.SetFloat("movZ", dir.z);
            anim.SetBool("walking", true);
        }
        // Una última comprobación para evitar bugs forzando la posición inicial
        if (target == initialPosition && distance < 0.02f){
            transform.position = initialPosition;
            // Y cambiamos la animación de nuevo a Idle
            anim.SetBool("walking", false);
        }
        // Y un debug optativo con una línea hasta el target
        Debug.DrawLine(transform.position, target, Color.green);
    }
    // Podemos dibujar el radio de visión y ataque sobre la escena dibujando una esfera
    void OnDrawGizmosSelected() {
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireSphere(transform.position, visionRadius);
        Gizmos.DrawWireSphere(transform.position, attackRadius);
    }
}

 
 
#5
General (Antiguo) / Problema al disparar en juego 2D
Noviembre 21, 2018, 08:59:43 PM
 
 
Muy buenas a todos, iré directamente al grano.
 
 
 
He hecho un sistema de disparo en un vídeojuego donde el personaje es un sprite 2d y el resto del juego es en 3D, por lo que los ejes en los que se desplaza el personaje son XZ.
 
He conseguido que dispare en 4 posiciones, accediendo al valor de un vector al que llamo mov, si movX vale 1, dispara en una dirección, si movZ vale -1, dispara en otra dirección, etc.
 
El problema es que sólo es capaz de acceder a movX y movZ cuando el personaje está andando, por lo que es imposible disparar si el personaje está quieto.
 
Os dejo el código y algunas imágenes, muchísimas gracias.
 
 
 
PD: Como podéis en el breve vídeo que he dejado justo debajo, el personaje no puede disparar si está quieto, en la parte de abajo podéis ver los valores de movX y movZ en la pestaña Animator.
 
 
 
Gameplay de ejemplo
 
 
 
 
 


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour {
 
public float speed = 1f;
 
Animator anim;
Rigidbody rb3d;
Vector3 mov;
public GameObject arrowPrefab;
 
void Start () {
   anim = GetComponent<Animator>();
   rb3d = GetComponent<Rigidbody>();
   
}

void Update () {
   //Sistema de movimiento
   
   mov = new Vector3 (
      Input.GetAxisRaw ("Horizontal"),
      0,
      Input.GetAxisRaw ("Vertical")
   );
 
                 ;
   transform.position = Vector3.MoveTowards (
 
      transform.position,
      transform.position + mov,
      speed * Time.deltaTime
 
   );
 
   if (mov != Vector3.zero) {
      anim.SetFloat ("movX", mov.x);
      anim.SetFloat ("movZ", mov.z);
      anim.SetBool ("walking", true);
   } else {
   
      anim.SetBool ("walking", false);
   
   
   }
 

   //Sistema de disparo
 
   if (Input.GetButtonDown ("Fire1") && mov.x == 1) {
      GameObject arrow = Instantiate (arrowPrefab, transform.position, Quaternion.identity);
      arrow.GetComponent<Rigidbody> ().velocity = new Vector2 (50.0f, 0.0f);
 
   }
   if (Input.GetButtonDown ("Fire1") && mov.x == -1) {
      GameObject arrow = Instantiate (arrowPrefab, transform.position, Quaternion.identity);
      arrow.GetComponent<Rigidbody> ().velocity = new Vector2 (-50.0f, 0.0f);
 
   }
   if (Input.GetButtonDown ("Fire1") && mov.z == 1) {
      GameObject arrow = Instantiate (arrowPrefab, transform.position, Quaternion.identity);
      arrow.GetComponent<Rigidbody> ().velocity = new Vector3 (0.0f, 0.0f,50.0f);
 
   }
   if (Input.GetButtonDown ("Fire1") && mov.z == -1) {
      GameObject arrow = Instantiate (arrowPrefab, transform.position, Quaternion.identity);
      arrow.GetComponent<Rigidbody> ().velocity = new Vector3 (0.0f, 0.0f,-50.0f);
 
   }
}
void FixedUpdate(){

//Sistema de movimiento
   rb3d.MovePosition (rb3d.position + mov * speed * Time.deltaTime);




}
 
}

 
 
#6
Pues el título lo dice todo, la verdad es que no sé como lograr esto en 2d, quiero que haya X objetos que siempre estén sonando pero que se escuchen más fuerte o más flojo a medida que el player se aleje o acerque.
 


Esto se hacerlo en 3D, pero no doy con la tecla para hacerlo en 2D, alguna idea??
 
 
 
Muchas gracias!!!
#7
General (Antiguo) / Ayuda con animación 2D
Enero 31, 2018, 09:54:32 PM
Hola, estoy teniendo problemas para hacer la animación de correr.
 
El problema aparece cuando quiero cambiar de dirección mientras el personaje está corriendo, parece que al ser tanta velocidad, el personaje resbala por el suelo.
 
Tengo dos vídeos, en uno la velocidad es baja y en otro es alta.
 
VÍDEO 1: https://gyazo.com/1dd3dd4ba68fe6eceffd2b1ced6b9284
 
VÍDEO 2: https://gyazo.com/0b4c855937572048ce4d4e3f6dcbdc5b
 
Aquí os dejo el código que estoy usando.
 
 
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
 
public float speed = 2f;
private Rigidbody2D rb2d;
public float maxSpeed = 5f;
private Animator anim;
public bool grounded;
public bool pressrun;
 
void Start () {
 
   rb2d = GetComponent<Rigidbody2D> ();
   anim = GetComponent<Animator> ();
   
}

// Update is called once per frame
void Update () {
 
   anim.SetFloat ("Speed", Mathf.Abs(rb2d.velocity.x));
   anim.SetBool ("Grounded", grounded);
   anim.SetBool ("PressRun", pressrun);
}
 

void FixedUpdate(){



   float h = Input.GetAxis ("Horizontal");
   rb2d.AddForce (Vector2.right * speed * h);
 
   
   float limitedSpeed = Mathf.Clamp (rb2d.velocity.x, -maxSpeed, maxSpeed);
   rb2d.velocity = new Vector2 (limitedSpeed, rb2d.velocity.y);
 
   if (Input.GetKey ("k")) {
      pressrun = true;
      rb2d.velocity = new Vector2 (limitedSpeed * 2, rb2d.velocity.y);
 
   } else {
 
      pressrun = false;
   }
   if (h > 0.1f) {
   
      transform.localScale = new Vector3 (1f, 1f, 1f);
   
   }
 
   if (h < -0.1f) {
      transform.localScale = new Vector3 (-1f, 1f, 1f);
   }
}
 
}

 
Muchas gracias a todos.
#8
Muy buenas, estoy creando un inventario a traves de una lista y no encuentro la manera de comprobar si un objeto existe en el inventario, la lista la he creado así:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Inventory {
    public string name;
    public int health;
    public Inventory(string newName, int newHealth)    {
        name = newName;
        health = newHealth;
    }
}

 
 
 
Para añadir un objeto lo que hago es esto:
 



   
       
   
   
      List<Inventory> inventario = new List<Inventory> ();
              inventario.Add (new Inventory ("Manzana", 1));
   
   
   
   
       
   

[/quote]
 
Donde manzana es el nombre del objeto y 1 su poder de salud (health en el código de arriba).
 
Lo que intento es saber como buscar en mi lista si por ejemplo tengo una manzana pero no encuentro el comando adecuado, alguna idea?? :S
 
Muchísimas gracias.
 
 
 
PD: El primer código y el segundo están en scripts distintos, aunque no creo que eso suponga ningún problema al declarar las variables públicas.
#9
General (Antiguo) / Pasar de un diálogo a otro...
Abril 12, 2017, 08:41:02 PM
Muy buenas, llevo varios días intento pasar de un diálogo a otro, sinceramente la manera de hacerlo tal vez no sea la más óptima, pero bueno, de momento con conseguirlo me conformo, después depuraré el código.
 
 
 
El problema que tengo es que mi código se va directamente a la segunda frase, y no sé como decirle que eso sólo debe hacerlo al pulsar por segunda vez la tecla "J"
 
 
 
Aquí os dejo el código, es C#  aunque haya puesto JavaScript para que se coloree un poquito:
 
 
 
PD: El script hace referencia al método GetMsg, el cuál está en otro script, no voy a poneros ese script porque no viene al caso y funciona perfectamente :) .
 
 
 

using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
public class DeteccionDialogo : MonoBehaviour {
[SerializeField] GameObject PanelMsg;
[SerializeField] Text msgText;
[SerializeField] GameObject ButtonTalk;
    bool talking = false;
bool PressTalk = false;
int frases;
int contadorfrase;
void Start () {
   GetComponent<Collider> ().isTrigger = true;
   PanelMsg.SetActive (false);
   ButtonTalk.SetActive (false);
}
void OnTriggerEnter (Collider other) {

   if (other.CompareTag("npc")) {
      print ("Tag Comparado");                     // Se comparan los tags y si es NPC aparece el cartel para hablar
      ButtonTalk.SetActive (true);
   }
}
 
void OnTriggerStay (Collider other) {
   if (other.name == "npc_1" && Input.GetKey("j") ) {         // Si el nombre del otro collider es npc_1 y pulsas la tecla J... (FUNCIONA)
      ButtonTalk.SetActive (false);
      string msg = other.GetComponent<msgNpcS> ().GetMsg_1_1_1 ();      //Si el NPC es el 1, se muestra el texto del método GetMsg_1 (FUNCIONA)
         msgText.text = msg;
         PanelMsg.SetActive (true);
      if (Input.GetKey ("j")) {
      
         msg = other.GetComponent<msgNpcS> ().GetMsg_1_1_2 ();      //Al pulsar DE NUEVO la tecla J, debería mostrar el siguiente texto.. (NO FUNCIONA)
         msgText.text = msg;
         PanelMsg.SetActive (true);
            }                     
   }
}
void OnTriggerExit (Collider other) {
   if(other.CompareTag("npc")){
      ButtonTalk.SetActive (false);
      PanelMsg.SetActive (false);
   }
}
}

 
 
 
 
 
Muchísimas gracias y espero que podáis ayudarme a encontrar en qué estoy fallando, un saludo !
#10
Mi problema es el siguiente, estoy haciendo una escena donde elegir personaje, el cambio de personaje se realiza, pero necesito confirmar que quiero usar ese prefab y tenerlo en la siguiente escena listo para ser cargado.
 
Os dejo el código como lo llevo hasta ahora, como podréis ver, el "Play" funciona igual que el botón "Next" ya que realmente no se seleccionar el prefab y pasar a otra escena..
 
¿Alguna ayuda? Mil gracias!
 
 
 

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public class CharacterSelector : MonoBehaviour {
 
public List<GameObject> characterList;
public int index=0;
void Start () {

   GameObject[] characters = Resources.LoadAll<GameObject>("Prefab");
   foreach (GameObject c in characters) {
      GameObject _char = Instantiate(c) as GameObject;
      _char.name = c.name;
      _char.transform.SetParent(GameObject.Find("CharacterList").transform);
      characterList.Add(_char);
      _char.SetActive(false);
      GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
      characterList[index].SetActive(true);
 
   }
}
public void Next(){
   characterList [index].SetActive (false);
   if (index == characterList.Count - 1) {
      index = 0;
   } else {
      index++;
   }
   GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
   characterList [index].SetActive (true);
   
}
public void Previous(){
   characterList [index].SetActive (false);
   if (index == 0) {
      index = characterList.Count-1;
   } else {
      index--;
   }
   GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
   characterList [index].SetActive (true);
   
}
 

public void Play(){
   characterList [index].SetActive (false);
   if (index == characterList.Count - 1) {
      index = 0;
   } else {
      index++;
   }
   GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
   characterList [index].SetActive (true);
}
void Update(){
   characterList [index].transform.Rotate (0,0.5f,0);
}
}

 
 
#11
Antes de nada siento enormemente tener que ponerlo aquí, pero no se cuantos mensajes necesito para postear en otras secciones del foro..perdón!!
 
 
 
Mi problema es el siguiente, estoy haciendo una escena donde elegir personaje, el cambio de personaje se realiza, pero necesito confirmar que quiero usar ese prefab y tenerlo en la siguiente escena listo para ser cargado.
 
Os dejo el código como lo llevo hasta ahora, como podréis ver, el "Play" funciona igual que el botón "Next" ya que realmente no se seleccionar el prefab y pasar a otra escena..
 
¿Alguna ayuda? Mil gracias!
 
 
 

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public class CharacterSelector : MonoBehaviour {
 
public List<GameObject> characterList;
public int index=0;
void Start () {

   GameObject[] characters = Resources.LoadAll<GameObject>("Prefab");
   foreach (GameObject c in characters) {
      GameObject _char = Instantiate(c) as GameObject;
      _char.name = c.name;
      _char.transform.SetParent(GameObject.Find("CharacterList").transform);
      characterList.Add(_char);
      _char.SetActive(false);
      GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
      characterList[index].SetActive(true);
 
   }
}
public void Next(){
   characterList [index].SetActive (false);
   if (index == characterList.Count - 1) {
      index = 0;
   } else {
      index++;
   }
   GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
   characterList [index].SetActive (true);
   
}
public void Previous(){
   characterList [index].SetActive (false);
   if (index == 0) {
      index = characterList.Count-1;
   } else {
      index--;
   }
   GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
   characterList [index].SetActive (true);
   
}
 

public void Play(){
   characterList [index].SetActive (false);
   if (index == characterList.Count - 1) {
      index = 0;
   } else {
      index++;
   }
   GameObject.Find("CharName").GetComponent<Text>().text = characterList[index].name;
   characterList [index].SetActive (true);
}
void Update(){
   characterList [index].transform.Rotate (0,0.5f,0);
}
}

 
 
#12
General (Antiguo) / Muy buenas!
Julio 04, 2016, 05:41:19 PM
Bueno llevo ya tiempo registrado pero aprovecho para presentarme, actualmente estoy haciendo un juego a si que os dispararé algunas dudas que me van surgiendo, un saludo !! :D
 
 
 
PD: Cuantos mensajes tengo que tener para postear en las demás secciones del foro? No sabía que no se podía :(