Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Cargar textura 2D desde la carpeta Resources

Iniciado por yaneisy, Enero 11, 2016, 05:37:06 PM

Tema anterior - Siguiente tema
Hola, necesito que me ayuden para cargar en una carpeta que tengo dentro de Resources que se llama Imagenes, todas las texturas que alli se encuentran, si tienen algun ejemplo que me sirva para texturas 2D, pues lo que he visto es para Sprite y no me sirve. Ya que yo necesito guardar todas estas texturas en un arreglo o algo para luego crear Esferas y añadirles estas texturas. 

Utiliza Resources.Load()
Mi duda es si usando esto :         GameObject esfera = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        Renderer rend = esfera.GetComponent<Renderer>();
        rend.material.mainTexture = Resources.Load("texturasEsfera") as Texture;Es que debo crear n esferas y entonces asignarle a cada una su texturaEsfera, y en la carpeta textura dentro de Resources tengo todas las texturas que necesito, entonces no se como cargarlas todas e irlas asignando a su esfera. Por eso pido ayuda  

para asignar una textura a cada esfera, simplemente recorre todos los objetos 'esfera' y usa el script que tu mismo has puesto, no creo que deberias tener problemas.Para recorrer las esferas, puedes asignarles un tag y crear una variable temporal GameObject[] para almacenarlas para hacer los cambios de texturas

Primero, analiza lo siguiente.1 ¿Cuántas esferas vas a utilizar?2 ¿Siempre vas a utilizar todas las texturas?3 ¿Es posible usar un Pool Object?Si la primer respuesta es un Número, es decir que vas a utilizar un Rango de entre 50 a 100 entonces Utiliza un Pool Object y Con esto tendrías todo cubierto. Si el número es algo que realmente no puedes controlar y aun asi quieres seguir con la carga de textura trata de Utilizar lo menos posible Resources.Load(); ¿Por qué?, Simplemente porque cada vez que lo utilices usaras un nuevo espacio en memoria y en 10 minutos si lo llamas 1000 veces podrias tener problemas desde un celular.
*Recomendación.
Crear un Arreglo de Materiales.
Cargar Todas las Texturas que vas a utilizar
Asignar el Largo del arreglo de materiales.
Asignar la textura a cada elemento del arreglo.
Por último para utilizar un material en tu esfera sólo utiliza los del arreglo.Ejemplo C#
public class LibraryMaterial
{
    public List<Material> Materials = new List<Material>;
   
    internal void LoadMaterials(int LenghtTexture)
    {
        for(int i = 0; i < LenghtTexture; i++)
        {
            Texture = Resources.Load("Textura_"+i); as Texture //Buscar Textura_0/ Textura_1 Etc...
            Material m = new Material();
            m.mainTexture = Texture;
        }
       
        Debug.Log("Se cargo un total de "+Materials.Count+ " Texturas");
    }
}
PD: Esta escrito desde el foro, puede tener errores. Bueno, espero te sea de ayuda. Suerte!


Gracias tendre en cuenta lo que me dices para el caso que tenga que generar muchas esferas, pero por ahora para ir entendiendo esta parte he puesto esto y se crea la esfera en la posicion que le tengo asignada que la tomo de un txt, pero no me le pone la textura a la esfera ni me invierte las normales, pues yo tambien tomo del txt el nombre de la textura al igual que la posicion. Podrian ayudarme con esto a ver que pasa con el codigo //aqui necesito crear esferas recorreindo el arrayslist donde tengo almacenadas las posiciones
    void GenerarEsferas()
     {         foreach (Panorama p in Registros)
         {
             GameObject esfera = GameObject.CreatePrimitive(PrimitiveType.Sphere);
             esfera.transform.position = new Vector3((float) p.x, 0, (float) p.z);//Se cre correctamente la esfera en la posicion que tengo del txt que se encuentra en Resources
             Renderer rend = esfera.GetComponent<Renderer>();
             rend.material.mainTexture = Resources.Load("texturas/"+ p.file_name) as Texture;//Esta cogiendo la textura porque me muestra su nombre que lo coge de la carpeta texturas del Resources pero no se la asigna a la esfera en el codigo de arriba ni me invierte las normales
             Debug.Log(p.file_name);
             InvertirNormales(esfera.GetComponent<MeshFilter>());
         }
     }     //funcion de invertir normales    void InvertirNormales(MeshFilter filter)
    {
        //MeshFilter filter = GetComponent(typeof(MeshFilter)) as MeshFilter;
        if (filter != null)
        {
            Mesh mesh = filter.mesh;            Vector3[] normals = mesh.normals;
            for (int i = 0; i < normals.Length; i++)
                normals = -normals;
            mesh.normals = normals;            for (int m = 0; m < mesh.subMeshCount; m++)
            {
                int[] triangles = mesh.GetTriangles(m);
                for (int i = 0; i < triangles.Length; i += 3)
                {
                    int temp = triangles[i + 0];
                    triangles[i + 0] = triangles[i + 1];
                    triangles[i + 1] = temp;
                }
                mesh.SetTriangles(triangles, m);
            }
        }
    }

El problema es que no creas el material para que se asigne una Textura.Intenta agregar esto..
 
 Renderer rend = esfera.GetComponent<Renderer>();
 Material mat = new Material();
 mat.mainTexture = Resources.Load("texturas/"+ p.file_name) as Texture;
 rend.material = mat;
 

cuando hago esto me sale este mensaje de errorAssets/Lector.cs(113,42): error CS1729: The type `UnityEngine.Material' does not contain a constructor that takes `0' arguments


Vale, ya me funciono, el problema que tenia anteriormente era que cogía del txt el nombre de la imagen.jpg y sin embargo en la carpeta textura solamente esta imagen, y por eso no funcionaba lo de añadir textura, sera que: GameObject esfera = GameObject.CreatePrimitive(PrimitiveType.Sphere);
             esfera.transform.position = new Vector3((float) p.x, 0, (float) p.z);//Se cre correctamente la esfera en la posicion que tengo del txt que se encuentra en Resources
             Renderer rend = esfera.GetComponent<Renderer>();
             rend.material.mainTexture = Resources.Load("texturas/"+ p.file_name) as Texture; Si p.file_name= imagen.jpg por eso cuando se busca la textura en la carpeta Resources solo se llama imagen y por eso no se la añadia a la esfera. Por ahora tuve que mediante una cadena de caracteres eliminar .jpg para que me funcione, si hay una forma mas optima indicamelo por favor.

Etiquetas: