Jump to content
Sign in to follow this  
MaanuRP

Problema de comprension del Scroll View

Recommended Posts

Hola a todos!

Estoy realizando pruebas y me encuentro con un problema que me parece que es muy tonto pero que no lo puedo resolver.

Tengo un chat, estoy recibiendo los mensajes, pero no puedo hacer el sistema de muestreo. Lo normal seria que el nuevo mensaje se muestre en la parte superior de la caja del chat, que si llega uno nuevo se muestre abajo y asi sucesivamente hasta llegar al final, y que cuando se llega al final, se sigan agregando abajo pero haciendo scroll para arriba y asi poder mostrar solamente lo ultimos.

Mi manera de crear y posicionar los mensajes es la siguiente:

        GameObject go = new GameObject("Msg");
        var text = go.AddComponent<UnityEngine.UI.Text>();
        var layout = go.AddComponent<UnityEngine.UI.LayoutElement>();
        var recttransform = go.GetComponent<RectTransform>();
        go.transform.SetParent(chatBox);

        recttransform.sizeDelta = new Vector2(400, 40);
        if (lastMessage != null)
        {
            recttransform.position = lastMessage.GetComponent<Transform>().position;
            recttransform.Translate(new Vector2(0, -lastMessage.GetComponent<RectTransform>().sizeDelta.y));
        }
        else
        {
            recttransform.position = chatBox.position;
            recttransform.Translate(new Vector2(recttransform.sizeDelta.x / 2, -scrollRect.viewport.rect.height + recttransform.sizeDelta.y / 2));
        }


        layout.minHeight = 40f;
        text.text = "<color=" + nameColor + "><b>" + userName + "</b></color>" + ": " + msgString;
        text.color = Color.black;
        text.font = Resources.GetBuiltinResource(typeof(Font), "Arial.ttf") as Font;
        Debug.Log(text.text);
        scrollRect.velocity = new Vector2(0, 40f);

Funciona pero hasta cierto punto:

- Los mensajes van al reves (Se como se soluciona esto, solamente que como estoy con los verdaderos problemas del muestreo, dejo esto para el final.

- ¿Existe alguna manera de hacer el "Content" del scroll view vaya creciendo dependiendo de donde este el ultimo mensaje para asi crearse el scroll vertical?

- Se que al escribir "recttransform.sizeDelta = new Vector2(400, 40);" anulo el "layout.minHeight = 40f;". Pero desconozco la forma de que el height del objeto texto sea acorde al mensaje en si.

Creo que esos son mis 3 problemas, que en realidad los dos ultimos son los que no se solucionar.

Si alguno podria ayudarme o pasarme un link donde esten explicados estos procedimientos (De una pagina externa supongo, ya que busque y no pude encontrar) les agradeceria mucho.

Desde ya, muchisimas gracias a todos y saludos!

 

Share this post


Link to post
Share on other sites

Hola, a que te referis con el sistema de muestreo del chat? Al scroll view nunca lo utilice asi que no te puedo aportar nada la verdad :( .

Con el tema del posicionamiento vos tenes tus mensajes puestos como hijos de "chatBox", podrias utilizar el ChildIndex y asi determinas la posicion. Osea, cada vez que agregas un mensaje lo emparentas como bien haces y luego lo pones arriba en el orden con SetAtFistSibling. Despues que el chatBox se encarge de ordenar los mensajes y no que los mensajes se ordenen solos (Solo para mantener el orden y el registro de cada uno).

Despues mostras los mensajes (los hijos) en orden como los tenes en la jerarquia, podes usar el index que trae cada uno para jugar con las posiciones

//ChatBox.cs (C#) 

for(int i =  ; i < transform.childCount ; i++)
  transform.GetChild(i).position = GetComponent<RectTransform>().position + i * factor * Vector2.down; 

//i = 0 --> mensaje mas reciente

OJO! lo escribi asi nomas jaja pero para tener una idea

Ademas deberias calcular el tamaño en vertical que ocupa cada uno (eso que decis del layout minheight), esa informacion la puede contener cada objeto (con su script mensaje.cs por ejemplo) y el chatBox le pide a cada hijo dicho tamaño y en base a eso posiciona a cada uno.

 

 

 

 

Edited by lightbug

Share this post


Link to post
Share on other sites

El tema de posicionamiento de los mensajes, como habia dicho, ya lo pude solucionar. Mi problema real son dos:

- Establecer el height del texto dependiente del texto que tiene adentro para los chats no se vean cortados y los mensajes se vayan poniendo uno abajo de otro.

- Que el content se mueva la misma cantidad de pixeles que el height de ese texto, para asi mostrar el mensaje nuevo completo.

Share this post


Link to post
Share on other sites
hace 20 horas, MaanuRP said:

El tema de posicionamiento de los mensajes, como habia dicho, ya lo pude solucionar. Mi problema real son dos:

- Establecer el height del texto dependiente del texto que tiene adentro para los chats no se vean cortados y los mensajes se vayan poniendo uno abajo de otro.

- Que el content se mueva la misma cantidad de pixeles que el height de ese texto, para asi mostrar el mensaje nuevo completo.

Para lo primero, añade un componente LayoutElement a ese texto y especifica FlexibleHeight 0, para que el recuadro se adapte siempre al texto. Creo que si además le añades un MinimalHeight 30 o equivalente, obtendrás lo que buscas.

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...