- Home /
Question by
Wesley21spelde · Jan 25, 2014 at 11:21 AM ·
materialscritping
Computer screen animation by texture
hey guys i ve been looking everywhere for my solution but i cant find it like this. would you help me with a script. i have a 3d model of a computer screen with one texture added to it. i have 10 other textures. i want to change the textures lets say every 0.1 seconds like 12345678910 so the computer screen animates thanks guys
Comment
How big are the textures, resolution wise? If they are small enough to all fit on one texture less than 8192x8192, then you could just use the Sprite Renderer system to create a looped animation.
Answer by Nirav-Madhani · Mar 27, 2015 at 06:03 AM
Create a C script named ImageFromDirectory and add following code
using UnityEngine;
using System.Collections;
public class ImageFromDirectory : MonoBehaviour
{
//A texture object that will output the animation
private Texture texture;
//With this Material object, a reference to the game object Material can be stored
private Material goMaterial;
//An integer to advance frames
private int frameCounter = 0;
//A string that holds the name of the folder which contains the image sequence
public string folderName;
//The name of the image sequence
public string imageSequenceName;
//The number of frames the animation has
public int numberOfFrames;
//The base name of the files of the sequence
private string baseName;
void Awake()
{
//Get a reference to the Material of the game object this script is attached to
this.goMaterial = this.renderer.material;
//With the folder name and the sequence name, get the full path of the images (without the numbers)
this.baseName = this.folderName + "/" + this.imageSequenceName;
}
void Start ()
{
//set the initial frame as the first texture. Load it from the first image on the folder
texture = (Texture)Resources.Load(baseName + "00000", typeof(Texture));
}
void Update ()
{
//Start the 'PlayLoop' method as a coroutine with a 0.04 delay
StartCoroutine("PlayLoop", 0.04f);
//Set the material's texture to the current value of the frameCounter variable
goMaterial.mainTexture = this.texture;
}
//The following methods return a IEnumerator so they can be yielded:
//A method to play the animation in a loop
IEnumerator PlayLoop(float delay)
{
//wait for the time defined at the delay parameter
yield return new WaitForSeconds(delay);
//advance one frame
frameCounter = (++frameCounter)%numberOfFrames;
//load the current frame
this.texture = (Texture)Resources.Load(baseName + frameCounter.ToString("D5"), typeof(Texture));
//Stop this coroutine
StopCoroutine("PlayLoop");
}
//A method to play the animation just once
IEnumerator Play(float delay)
{
//wait for the time defined at the delay parameter
yield return new WaitForSeconds(delay);
//if it isn't the last frame
if(frameCounter < numberOfFrames-1)
{
//Advance one frame
++frameCounter;
//load the current frame
this.texture = (Texture)Resources.Load(baseName + frameCounter.ToString("D5"), typeof(Texture));
}
//Stop this coroutine
StopCoroutine("Play");
}
}
Your answer
