Is it possible in Unity 3D using C# to create an array to load sprites randomly from a folder rather than from a sprite sheet? If it is, what code do I use to refer to the folder? From what I can find, sprites are usually coded to load using random.range with an array using a sprite sheet instead of actually accessing the folder. The only thing even similar to this that I have been able to find is here:
http://docs.unity3d.com/ScriptReference/Resources.html
but as you can see with this you can only load from a folder titled "Resources" in the "Assets" folder, and possibly I'm mistaken but it would also seem that this can only be done with a game object. (?)
You are looking at the right docs.
A sprite is a GameObject, just a more specific one meant to be used in 2d games. So you would create your sprites and make prefab of them. Those prefabs go in the Resources folder and here is the code:
GameObject [] objs = (GameObject[])Resources.LoadAll("SpriteFolder");
GameObject randomSprite = objs[Random.Range(0, objs.Length)];
Here is what I ended up using:
Sprite[] enemySprites = Resources.LoadAll("Sprites/Enemies");
Related
I am trying to save/load sprites for my game, and am achieving it by simply getting the path of the asset. Although, whenever trying to save a sprite that is inside of .psb file I simply cannot as it is saved as one singular .psb file. For example, I am getting a path for a .png file inside my folder, and it works flawlessly, but, whenever trying to access lets say head sprite that is inside of .psb file in my assets folder, I cannot do that.
Any tips for saving/accessing those files and how to achieve it?
Please help :)
It seems to me that what you get is not a Sprite but a SpriteAtlas in which case you could use SpriteAtlas.GetSprites to list all sprites and SpriteAtlas.GetSprite to get specific sprite by name/tag.
SpriteAtlas theAtlas;
var sprites = new Sprite[theAtlas.spriteCount];
theAtlas.GetSprites(sprites);
var specificSprite = theAtlas.GetSprite("Head");
I'm trying to make an application that has sprites going down the screen with numbers in them. The Text(Script) component only works for 3D objects. I've tried using Text Mesh and making that a child of the sprites but I need them to be instantiated as a Prefab. So when I load the sprite in as a prefab it loses it's relationship to the Text Mesh. Does anyone know of a solution that worked for them?
There are many ways to do it depending upon your requirement. I will show you two of the most basic.
1- Use 2D Sprite and TextMesh.
2- Use Canvas Image and Text Objects.
P.S First one, that is 2D Sprite can be Instantiated directly in the hierarchy but for 2nd(Canvas Image) you need to instantiate it inside the canvas obj means as a child of canvas object.
I'm making a tile based board game (on a grid). In going about making the gameboard, the easy thing would be to instantiate all of the tiles in code, but then they only appear in play mode. I want to be able to edit the tiles in the editor, but I still want my tiles to be stored in a 2D array in my controller class. If I build the board in the editor, how might I go about loading them in at runtime?
Keep The Tiles in the Resources Folder Unity. At Run-time Load from the Resources and instantiate Tiles To Your Grid Positions in the Scene.
GameObject[] Tiles= (Resources.LoadAll<GameObject> ("Tiles"));
I made a water swirl and surface mesh in unity by script, and now I need to add wall which is a simple mesh. But I don't know how to add another mesh though. I wanted to find something like meshfilter.addmesh, but there is no such methods though. I 'm wondering how can I add another mesh or mesh filter to add that wall. I use C# btw.
From the description of your problem (which is not clear enough) it looks like you should create another game object with MeshFilter and MeshRenderer components (you can do it either by hands or by script) for your wall.
If for some reason you REALLY want to have several meshes in one MeshFilter then your only option is to use submeshes (see Mesh.subMeshCount, Mesh.SetIndices, Mesh.SetTriangles, Renderer.materials and maybe Mesh.CombineMeshes).
I'm trying to create an object that will be responsible of creating and showing different sprites, so I would like to access directly the assets/sprites programmatically instead of drag and drop a sprite in the hierarchy under that object.
There's a way to programmatically create a new sprite and assign what I have in the assets folder?
I also would like to have a sort of data structure with a few images loaded at the start of the game, an array or a dictionary or something like that so I can change based on some situation which images I need to show. But what confuses me since I'm new to Unity is how to create a sprite taking the reference to the sprite programmatically using the assets folder.
edit with progress:
I've created an array of sprites like this:
public Sprite[] mySprites;
in Unity I've added sprites inside the array manually (I just dragged png's inside the variable array) so actually in this Object I have a Component with this array full of sprites
inside the component I also have done this:
public SpriteRenderer renderer;
renderer = transform.GetComponent<SpriteRenderer>();
renderer.sprite = (Sprite)mySprites [0];
I got no error until I run the game, then the sprite is NOT assigned and I got this:
"PPtr cast failed when dereferencing! Castin from Texture2D to Sprite!"
I got this error even without casting (Sprite) and btw I don't know why he is telling my about Texture2D since verything is setted as sprite
To create a sprite programmatically might be a little too difficult to do. You'd probably need to create a Texture in memory, fill in the data, and then write that texture on the disk. After that, you should be able to read that using C#'s File, or Unity's WWW.LoadFromCacheOrDownload.
Here is how you would create a texture dynamically: http://answers.unity3d.com/questions/9919/how-do-i-create-a-texture-dynamically-in-unity.html
To load your sprites programmatically (not the ones created dynamically though), they need to be under a folder with the name Resources (which is a special folder).
I.e. suppose you have a sprite named MySprite.png under a folder named Sprites which is under a folder named Resources. You would then load it like this:
renderer.sprite = Resources.Load<Sprite>("Sprites/MySprite");
(notice how you do not include the Resources folder and the extension of the sprite)
You can find more details in the Loading Resources at Runtime documentation.
PPtr cast failed when dereferencing!
I did some searching and found out from this forum post that usually that happens when you had a list of one type and then changed it into another type. I.e. if mySprites was at some point GameObject[] and you linked a bunch of Sprites, and then changed it to Sprite[]. And since it specifically says Texture2D, I'm assuming that the import settings of your Sprites (or some of them) are set to Texture instead of Sprite:
Also, all MonoBehaviours have already a field named renderer, which is of type Renderer. I would suggest you rename that field to avoid confusion, unless you only used that as an example.
Here is real code.. will help you
void SetSprite(UI2DSprite uiSprite, Sprite[] sprites, string strKey)
{
foreach (Sprite stexture in sprites)
{
if (stexture.name == strKey)
{
uiSprite.sprite2D = stexture;
break;
}
}
}
use it following the way..
UI2DSprite[] uiSprites = tmpObject.GetComponentsInChildren<UI2DSprite>();
Sprite[] sprites = Resources.LoadAll<Sprite>("Textures");
string resName = "icon_favorite_2";
foreach (UI2DSprite uiSprite in uiSprites)
{
if(uiSprite.name = "icon")
SetSprite(uiSprite, sprites , resName);
}
Just to throw my tuppence worth in. I had this problem when I changed a SerializedField from Texture2D to Sprite in the code. The texture was already a sprite in the editor but it needed to be Sprite in the code. The field in the editor initially said type mismatch and then displayed the sprite texture again.
To cure it I set the field in the editor to none and the reset it to the required sprite.