- Home /
Change Materials On Button Press or Hold?
I am making a 2d game and I am using three different sprite sheets ive made as materials for animation.
I have a plane as my character and attached this script below that will cycle through the sprites using offset..
var uvAnimationTileX = 24; //Here you can place the number of columns of your sheet.
//The above sheet has 24
var uvAnimationTileY = 1; //Here you can place the number of rows of your sheet.
//The above sheet has 1
var framesPerSecond = 10.0;
function Update () {
// Calculate index
var index : int = Time.time * framesPerSecond;
// repeat when exhausting all frames
index = index % (uvAnimationTileX * uvAnimationTileY);
// Size of every tile
var size = Vector2 (1.0 / uvAnimationTileX, 1.0 / uvAnimationTileY);
// split into horizontal and vertical index
var uIndex = index % uvAnimationTileX;
var vIndex = index / uvAnimationTileX;
// build offset
// v coordinate is the bottom of the image in opengl so we need to invert.
var offset = Vector2 (uIndex * size.x, 1.0 - size.y - vIndex * size.y);
renderer.material.SetTextureOffset ("_MainTex", offset);
renderer.material.SetTextureScale ("_MainTex", size);
}
The script works perfect....
But i need a script that would switch my idle material to a left material when i press the left key and then switch to the right material when i press the right key.... Therefore it would be an animated left and right movement and then move back to the idle material when nothing is pressed....
can someone help me out with this please?
Answer by robertbu · Mar 12, 2013 at 10:52 PM
Here is are mods to your script that change the texture when an arrow key is pressed. You will need to set the array size of artex to 3 and drag the three textures onto the three slots in the array.
#pragma strict
var artex : Texture[];
var uvAnimationTileX = 24; //Here you can place the number of columns of your sheet.
//The above sheet has 24
var uvAnimationTileY = 1; //Here you can place the number of rows of your sheet.
//The above sheet has 1
var framesPerSecond = 10.0;
private var iTexture = 1;
private var iNewTexture = 0;
function Update () {
if (artex.Length < 3) {
Debug.Log("Need to assign textures in the inspector");
return;
}
if (Input.GetKey(KeyCode.LeftArrow)) {
iNewTexture = 0;
// Insert code here to modify uvAnimationTileX for first texture
}
else if (Input.GetKey(KeyCode.RightArrow)) {
iNewTexture = 2;
// Insert code here to modify uvAnimationTileX for last texture
}
else {
iNewTexture = 1;
// Insert code here to modify uvAnimationTileX for middle texture
}
if (iNewTexture != iTexture) {
iTexture = iNewTexture;
renderer.material.mainTexture = artex[iTexture];
}
// Calculate index
var index : int = Time.time * framesPerSecond;
// repeat when exhausting all frames
index = index % (uvAnimationTileX * uvAnimationTileY);
// Size of every tile
var size = Vector2 (1.0 / uvAnimationTileX, 1.0 / uvAnimationTileY);
// split into horizontal and vertical index
var uIndex = index % uvAnimationTileX;
var vIndex = index / uvAnimationTileX;
// build offset
// v coordinate is the bottom of the image in opengl so we need to invert.
var offset = Vector2 (uIndex * size.x, 1.0 - size.y - vIndex * size.y);
renderer.material.SetTextureOffset ("_MainTex", offset);
renderer.material.SetTextureScale ("_MainTex", size);
}
You attach the script to a plane. Select the plane in the hierarchy. Looking in the inspector, you will see a variable called artex. This is an array of textures. Click the down triangle next to artex to open it up. Set the size to three, and three array entries will appear. Drag your three textures onto the three variables. The idle texture needs to be in the middle slot.
ok this works but my textures have different rows and collumns....how do i make it ajust to each textures number of rows and columns to animate correctly?
and also how do i make it go back to idle as soon as i let go of the horizontal keys?