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 - Centauro5legs

#1
Scripting / Ayuda identificando un evento
Febrero 21, 2020, 01:46:11 AM
Es un poco complicado explicar lo que quiero hacer, pero básicamente tengo un personaje que se mueve en base a sus animaciones. Es decir, el componente Animator le mueve, al "Preservar" sus transformaciones. Pero quiero que ese "movimiento" que hace en automático el Animator, pasárselo al padre. En teoría seria tan fácil como esto:
 

Update(){
  transform.parent.transform.position = transform.position;
  transform.parent.transform.rotation = transform.rotation;
  transform.localposition = vector3.zero;
  transform.localrotation = quaternion.identity;
}

 
Hasta cierto punto funciona, el problema es que da ciertos "lagasos", y a veces se ve como el personaje se retrocede. En especial en animaciones como correr o saltar, donde el personaje se desplaza mucho o cuando coliciona con una pared. Me imagino que esto pasa, porque el personaje se mueve, y a la mitad del desplazamiento entra el update y hace la corrección, lo que hace que todo se descuadre.
 
Creo que la solución seria hacer lo anterior, justo después de que el Animator mueva al personaje, pero antes de que se realicen las coliciones. En lugar de una vez por frame, que es lo que hace el Update.
 
Solo que no se que evento seria ese, intente con el UpdateFixed, el LastUpdate y el OnPostRender, y todos tienen el mismo fallo. Alguien puede darme un consejo?
#2
Bien, esto es complicado de explicar, así que me tomare mi tiempo: Como ya saben, y si no saben yo les explico, en Unity 3D hay dos modos de hacer Scripts de Movimiento, el primero es moviemto a tu personaje con un Script, y usar animaciones en la que el personaje se encuentra caminando sobre su mismo sitio, sin desplazarse realmente, y el segundo es usar animaciones en las que el personaje se despasa de su punto de origen, y dejar que sean las animaciones las que muevan al personajes, y vía script solo controlamos en AnimatorControler. Mi proyecto es de este segundo tipo.
 
En general el proyecto funciona correctamente, el problema yace en que mi personaje principal esta formado por varias partes; estas serian "Cuerpo, Casco, Peto, Calzas, Botas, Guantes, Cinturón, Armas y Extras". Todas con el mismo esqueleto, y todas compartiendo las mismas animaciones. Esto lo hago de este modo, porque el personaje tiene la capacidad de cambiar su equipamiento.
 
El problema es que, si a todas estas partes les pongo un CharacterController, al mover al personaje, los CharacterControllers se empujan entre si, y todo se me desacomoda, y si solo le pongo un CharacterControler a uno de ellos, cuando este colisiona con algo, todos los demás siguen su camino y el personaje se me desacomoda. Además de que por la estructura del juego, me resulta mas fácil que todas las piezas se encuentren dentro de un mismo GameObject, que sea el que lo mueva todo, pero de ser así, los "hijos" se moverán gracias a sus animaciones, mientras que el padre se quedara en su sitio, sin poder detectar colisiones. 
 
La solución a este problema, fue colocar todas las piezas dentro de un GameObject, y a ese GameObject añadirle el CharacterController y con el siguiente código corregir la posición;
 

private void CorrecionDeTransformaciones()
    {
        transform.position = transform.GetChild(0).transform.position;
        transform.rotation = transform.GetChild(0).transform.rotation;
        transform.localScale = transform.GetChild(0).transform.localScale;
        for (int i = 0; i < transform.childCount; i++)
        {
            transform.GetChild(i).localPosition = Vector3.zero;
            transform.GetChild(i).localRotation = Quaternion.identity;
            transform.GetChild(i).localScale = Vector3.one;
        }
    }

 
Como ven, la solución fue sencillamente igualar la posición, rotación y escala del Padre al de el primero de los hijos, y después devolver la posición, rotación y escala de todos los hijos, a "ceros". Y hasta cierto punto funciona bien. El problema es que cuando el personaje se topa con una pared, empieza a vibrar muy bruscamente. Me imagino que lo que pasa, es que el CharacterControler devuelve al personaje a su posición anterior, y luego mi script lo hace avanzar. 
 
La función anteriormente mostrada la ejecuto en un "LateUpdate()", pero me imagino que para que este código funcione correctamente, sin "convulsiones", es necesario que se ejecute justo después de las colisiones del "CharacterControler". ¿Alguien sabe como corregir este problema?, ¿En que evento llamar mi función? o ¿Cómo adaptar mi código?
 
 
 
De antemano, gracias por leer.....
#3
Ayuda!!!.... estaba trabajando en un proyecto, pero debido aun fallo en mi com***dora, me mude a otra distinta, y aprovechando, actualice el Unity a la versión mas reciente (la 2019). Y ahora TODOS mis scripts fallan, todos arrojan el mensaje "No MonoBehavior script in this file", incluso si creo un Script nuevo, sin ningún tipo de modificación, arroja el mismo error.
 
Además, si abro el Visual Studio (2017, para ser mas exactos) para editar los scripts, aparece el mensaje; "Se detecto una excepción que puede estar causada por una extensión", y no me detecta las Clases de Unity. Alguien sabe que pasa y como puedo solucionarlo.
 
Y antes de que lo digan, El nombre de archivo de mis scripts es el mismo que el de su clase, y a su vez tienen su referencia a la clase "MonoBehavior".
#4
Ok, tengo un problema. Tengo el siguiente Script:
 

using UnityEngine;
using System.Collections;
public static class DataParticle
{
    public static GameObject ItemCurativo;   //[01]
    public static GameObject PociónRoja;     //[02]
    public static GameObject PociónAzul;     //[03]
    public static GameObject PociónVerde;    //[04]
    public static GameObject PociónAmarilla; //[05]
    public static GameObject PociónMorada;   //[06]
    public static GameObject PociónNaranja;  //[07]
    public static GameObject PociónCeleste;  //[08]
    public static GameObject PociónBlanca;   //[09]
    public static GameObject PociónNegra;    //[10]
    public static GameObject Comida;         //[11]
    public static GameObject Bebida;         //[12]
public static GameObject GetItemCurativo (){
   return ItemCurativo;
}
public void SetItemCurativo(GameObject Entrada){
   ItemCurativo = Entrada;
}
}

 
Hasta aquí todo bien, no provoca error, y puede llamarlo desde otros Scripts sin tener que inicializarlo ni anclarlo a un objeto en la escena, que es lo que deseo. El problema es que no me deja cargar mis prefabs en las variables GameObject en el inspector. En teoría, seleccionando el Script en Unity, te permitiría inicializar las variables. Pero no me deja, muestra un mensaje que dice; "No Monobehaviour scripts in the file". Saben como solucionar el error?.
 
 
#5
Ok, no se donde mas publicar esto, así que lo publicare aqui. Hace tiempo, ya casi 2 años, subí un asset a la asset store. En ese momento no tenia una cuenta de PayPal, pero segun tenia entendido, una vez hecha la cuenta de Asset Store Publisher, y vinculada con PayPal, Unity te paga tus ventas a finales de cada mes. 
 
La cosa es que pasaron unos dos o tres meses, y mi asset no se vendia, asi que me desilusione, y ya no me moleste en hacer esa cuenta de PayPal. Pero recientemente me voy enterando de que ese Asset se ha estado vendiendo en estos últimos años, y con las tonterias ya son casi 100 Dolares los que se han juntado. (100 Dolares en 2 año no es mucho, pero los quiero). 
 
Ya hice la cuenta de PayPal, y ya la vincule con mi cuenta de Asset Store Publisher, mi pregunta es, ¿A finales de este mes me pagaran ese dinero que se ha estado acumulando,? o ya mejor lo doy por vencido.
#6
General (Antiguo) / [Ayuda] isGrounded no funciona
Febrero 19, 2018, 03:41:36 AM
Primero que nada, para quien no lo sepa, el CharacterControler cuenta con una función llamada  "isGrounded", la cual devuelve un "True" si el CharacterControler toca el piso, y "False" sino.
 
Pues simplemente no me funciona, para no hacer el cuento largo, si CharacterControler esta tocando el piso, "IsGrounded" devuelve trues y false aleatoriamente, en cambio, si no esta tocando el piso, si devuelve únicamente "false".
 
Mi Script de Movimiento es el siguiente;
 

      //Rotacion
        transform.Rotate(0, Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime, 0);
        //Obtiene los valores de entrada
        motion = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
        if (controller.isGrounded)
        {
            //Calcula el Movimiento
            motion = transform.TransformDirection(motion);
            motion *= speed;
            //Corre
            if (Input.GetKey(KeyCode.AltGr))
            {
                if (DataUsuario.GetEstadoAnimación().Contains("Rápido"))
                    motion *= 2.0f;
                segundos = 0;
            }
            //Salta
            if (Input.GetButton("Jump"))
            {
                motion.y = jumpForce;
            }
        }else{
           //Gravedad
            motion.y -= gravity * Time.deltaTime * 2;
   }
        //Se mueve
        controller.Move(motion * Time.deltaTime);

 
Y funciona bien, pero necesito que el "IsGrounded" funcione bien, para que mi Script de Animacion funcione correctamente. Alguien sabe que puede provocar el fallo?
#7
General (Antiguo) / Ayuda con Maya
Enero 10, 2018, 07:58:48 PM
Ok, esto es complicado. Digamos que tengo 3 archivos FBX. Los tres tienen el mismo modelo, con el mismo esqueleto y el mismo riggin, pero diferentes animaciones. Digamos que son "En Espera", "Caminar" y "Saltar". Ahora bien, quiero mezclar las tres animaciones en un solo FBX para no gastar demasiado espacio de memoria. 
 
Abrí los archivos en diferentes ventanas de Maya, para copiar y pegar los keyframes, pero me salta un error que dice que no hay nada copiado. Si arrastro un FBX a maya, mientras ya tenga otro FBX abierto, se sobrescriben, cuando lo que yo quiero es que cada animación comience después de la anterior.
 
Hay alguna función en Maya y/o Unity para fusionar varios FBX en uno solo. O hay que configurar maya para que pueda copiar información de una ventana de maya a otra.
 
 
#8
Ok, esto es complicado, hice un script que debería, primero convertir los materiales de un objeto en "Standard/Transparent", y después reducir su alpha, para hacer que se desvanezca. El problema, es que si bien si se cambia a "Transparent" y se desvanece, pero no se llega a volver totalmente trasparente, sino que se queda grisaseo, ademas aunque cambio le doy un "Glossiness" (Brillo) 0, sigue reflejando la luz. Y si yo pauso el juego, y modifico manualmente el material (Aunque no modifique el alpha), inmediatamente se corrige. ¿Alguien sabe porque pasa esto, y como corregirlo??
 

private float[] a;
private Color32[] c;
void Start(){
c = new Color32[transform.childCount];
    a = new float[transform.childCount];
for (int i = 0; i < transform.childCount; i++)
    {
   Material[] m = transform.GetChild(i).GetComponent<Renderer>().materials;
        for (int j=0; j < m.Length; j++)
        {
      m[j].shader = Shader.Find("Standard");
            m[j].SetFloat("_Mode", 3f);
            m[j].SetFloat("_Glossiness", 0f);
            m[j].DisableKeyword("_ALPHATEST_ON");
            m[j].DisableKeyword("_ALPHABLEND_ON");
            m[j].EnableKeyword("_ALPHAPREMULTIPLY_ON");
            m[j].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
            m[j].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
            m[j].SetInt("_ZWrite", 0);
            m[j].renderQueue = 5000;
        }
}
}
void Update(){
for (int i = 0; i < transform.childCount; i++)
    {
       Material[] m = transform.GetChild(i).GetComponent<Renderer>().materials;
        c = new Color32(c.r, c.g, c.b, (byte)a);
   a -= Time.deltaTime;
         
        for(int j =0; j<m.Length; j++)
           m[j].SetColor("_Color", c);
   if(a[0]<=0)
          Destroy(gameobject);
}
}
#9
Como lo dice el Titulo, como podría mediante un script, cambiar el tipo de material de "Opaco" a "Transparente". Es decir, permitir que se transparente.
#10
General (Antiguo) / Pregunta rápida [Animación]
Agosto 29, 2017, 05:02:40 AM
Como podría saber el nombre de la animación en curso, de un Animator a través de un Scrip.
#11
Ok, este es un problema que espero tenga una solución simple, pero es difícil de explicar;
 
Tengo un Modelo el cual esta formado por 5 partes; Cuerpo, Cabello, Ojos, Parpados Superiores y Parpados Inferiores. E cuerpo esta riggieado y animado, los ojos y el cabello están emparentados al joint de la cabeza, y los parpados a su vez están emparentados a los ojos. Los ojos y el cabello no tienen animación, solo dejan que el joint de la cabeza los mueva, y esto funciona bien, pero los parpados SI tienen animación, la cual obviamente es parpadear, fruncir el seño, etc.... simplemente su animación consta en rotar sobre su eje.... mi problema es que la animación de los parpados no se exporta.
 
Trate de corregirlo dentro de Unity, creando una animación solo para los parpados, pero no me deja, porque lo considera como si estuviera riggieado.
 
¿Hay alguna configuración especial que tenga que hacer, para que este tipo de animación se exporte al FBX?
 
 
#12
General (Antiguo) / Ayuda con SpeedTree
Septiembre 07, 2016, 04:32:06 AM
¿Como podría cambiar la Seed de un SpeedTree mediante un script C++?
 
Para quien no lo sepa, "SpeedTree" es una herramienta de Unity, que inicialmente comenzó como una herramienta externa, la cual permite crear árboles proceduralmente, al llenar ciertos parámetros. Y la "Seed" es una variable entre "0" y "9999" de la cual parte el diseño del árbol, por lo que si se alterara dinámicamente la Seed de un SpeedTree, eso provocaría que cada árbol se vea diferente, aunque parta de los mismos parámetros.
 
 
#13
General (Antiguo) / Ayuda con Terrain
Agosto 11, 2016, 04:55:57 AM
¿Alguien sabe como puedo comprobar que textura tiene el Terrain?
 
Por ejemplo, digamos que tengo un terreno con 3 texturas; Tierra, Pasto y Roca. ¿Cómo podría saber en cual de esas tres textura se encuentra parado mi personaje?. Asumo que seria haciendo un Rhaycast hacia abajo, encontrar la coordenada del Mapa en el que me encuentro parado y después buscar en el TerrainData el indice de la textura que se encuentra en esa coordenada, pero no se como hacer esto ultimo.
#14
General (Antiguo) / Ayuda con el LAG
Julio 17, 2016, 03:26:27 AM
Tengo un problema con el LAG, no se si sea cosa de mi com***dora, pero cuando en el Nivel hay unos 200 arboles o mas, me empieza a darme LAG. ¿Alguien sabe como hacer que solo se Rendericen los objetos en pantalla?. 
#15
General (Antiguo) / Duda Rápida [Terrain]
Julio 14, 2016, 05:39:00 PM
Tengo 2 dudas rápidas respecto a los Terrain;
 


  1.    ¿Es posible añadir arboles a un Terrain mediante código?, y si es posible, ¿Como?


  2.    ¿Es posible contar el número de arboles con los que cuenta un Terrain mediante código?, y si es posible, ¿Como?


 
 
 
#16
General (Antiguo) / Ayuda con animaciones
Mayo 30, 2016, 12:06:56 AM
¿Como podría saber el nombre de la animación que mi modelo esta ejecutando?
 
Por ejemplo;
 

Animator animacion = GameObject.Find ("000 - Peronaje").GetComponentInChildren<Animator> ();

 
De este modo saco la referencia a la animación, ahora como obtengo el nombre de la animación y lo guardo en un String
 
 
 
 
#17
General (Antiguo) / Ayuda con un error
Mayo 26, 2016, 11:25:17 PM
Tengo un problema, uno de mis Scrips me muestra el siguiente mensaje;
 



   
      No MonoBehaviour scripts in the file, or their names do not match the file name
   

[/quote]
 
No se que sea, o porque me lo marca, pero no me deja acoplar este Scrip a un GameObject en la interfaz de Unity. Aunque puedo acoplarlo mediante código. El Scrip por si solo funciona bien, no tiene error, pero necesito poder acoplarlo a un GameObject. ¿Alguien sabe como corregirlo?
#18
General (Antiguo) / Ayuda Con un Script de GUI
Marzo 03, 2016, 12:07:18 AM
Estoy teniendo problemas con un Script, lo único que este Script debe hacer es devolver un valor True o False cuando el mouse esta sobre un boton, panel, imagen o cualquier elemento del GUI, dependiendo si el mouse esta arriba de el o no, pero me da problemas, a veces funciona y a veces no.... 
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;

public class GetisOver : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
public bool Over = false;

#region IPointerEnterHandler implementation
public void OnPointerEnter (PointerEventData eventData)
{
   Over = true;
}
#endregion

#region IPointerExitHandler implementation
public void OnPointerExit (PointerEventData eventData)
{
   Over = false;
}
#endregion

public bool GetOver () {
   return Over;
}
}
¿Alguien sabe que podría ser?
#19
General (Antiguo) / Ayuda con un Script de Auto-Fit
Febrero 22, 2016, 10:18:16 PM
Antes de comenzar, ¿Alguien ha jugado The Forest, Ark Survival Envolment o Folaut 4?.... les pregunto porque si conocen estos juegos, les sera mas fácil entender mi pregunta....
 
Estoy haciendo un Script de construcciones, en general me funciona bien... pero me falta un detalle... quiero implementar un "Auto-Fit" (Un auto-alinear).... por ejemplo, que después de colocar una pared, la siguiente pared se alinea automaticamente con la anterior, lo mismo con techos y pisos para ayudar a construir una casa mas fácilmente....
 
Tengo lo siguiente ;
 
http://hastebin.com/utorefamiq.avrasm
 
Alguien tiene una idea?
 
 
#20
General (Antiguo) / Ayuda con un RayCast
Febrero 15, 2016, 10:54:12 PM
OK, esto esta complejo, así que me tomare mi tiempo para explicar ...
 
Estoy haciendo un Script para construir dinamicamente, ya tengo la mayor parte hecha, pero tengo un problema. Necesito que la "Estructuras nuevas" se instancien en el lugar hacia donde mi personaje dirige la mirada. Pero no me sale, porque la estructura siempre se instancia en mis pies. Asumo que el problema esta a la hora de hacer el "Physics.Raycast", 
 
 
 
Tengo lo siguiente;
 

using UnityEngine;
using System.Collections;
public class Build : MonoBehaviour
{
    private GameObject EstructuraMuestra;
    public GameObject Estructura;
    RaycastHit myhit = new RaycasaRRRtHit ();
    Ray myray = new Ray ();
    bool EstructuraActiva;

    void Star(){
   
        EstructuraMuestra = Estructura;    
        Renderer[] R = EstructuraMuestra.GetComponentsInChildren<Renderer> ();
   Collider[] C = EstructuraMuestra.GetComponentsInChildren<Collider> ();
   if (EstructuraMuestra.GetComponent<Renderer> ())
      EstructuraMuestra.GetComponent<Renderer> ().material.color = new Color32 (0, 200, 0, 155);
   if (EstructuraMuestra.GetComponent<Collider> ())
      EstructuraMuestra.GetComponent<Collider> ().eneable = false;
           
        for (int i=0; i<R.Length; i++)
         R .material = new Color32 (0, 200, 0, 155);
      for (int i=0; i<C.Length; i++)
         C .eneable = false;
      EstructuraMuestra.name = "Estructura-Ejemplo";
      EstructuraActiva = true;
    }
    void Update ()
    {
        myray = Camera.main.ScreenPointToRay (new Vector3 ((Screen.width / 2), (Screen.height / 2), 0));
        if(EstructuraActiva == true){
            if (Physics.Raycast (myray, out myhit, 1000.0f)) {
           EstructuraMuestra.transform.position = myhit.collider.transform.localPosition;
           }
        }            
       
        if(Input.GetBottonMouse(0)){
            GameObject tempo = (GameObject)Instantiate (Estructura, EstructuraMuestra.transform.localPosition, EstructuraMuestra.transform.localRotation);
      tempo.transform.SetParent (GameObject.Find ("Terreno").transform);
      tempo.name = "Estructura";
      DestroyObject (EstructuraMuestra);
      EstructuraMuestra = new GameObject ();
      EstructuraActiva = false;
        }
    }
}

 
¿Alguien podría ayudarme?...
 
Pdata; Mi personaje esta en 3° persona, ¿Creen que eso afecte?....