- Home /
Editing sprite opacity at runtime
I am currently using SetPixel() to set the opacity of pixels in a 3 x 3 texture at runtime, create a sprite from that texture, and apply it to an object's SpriteRenderer. Even though the pixels have different opacities, when the sprite is rendered it appears as though the whole sprite has the opacity of the center pixel. Does anyone have a suggestion as to how I could ensure that the differences in opacity are actually rendered?
Here is my script: using UnityEngine; using System.Collections; using DopplerInteractive.TidyTileMapper.Utilities; using System.Collections.Generic; [RequireComponent(typeof(SpriteRenderer))] public class WaveCalculator : MonoBehaviour { public Color fieldColor; private float fieldValue; private Texture2D texture; public static List emitters; private float[][] ampField; private Sprite appearance; public float averageAmplitude; private SpriteRenderer myRenderer;
void Awake () {
texture = new Texture2D(3,3);
ampField = new float[3][]{new float[3], new float[3], new float[3]};
emitters = new List<GameObject>{};
myRenderer = gameObject.GetComponent<SpriteRenderer>();
}
void Start(){
fieldColor = My_GUI.fieldColor;
}
void Update () {
for(int x = 0; x < 3; x++){
for(int y = 0; y < 3; y++){
ampField[x][y] = 0.5f;
foreach(GameObject emitter in emitters){
WaveProjector projector = emitter.GetComponent<WaveProjector>();
bool obstructed = Physics.Linecast(emitter.transform.position,new Vector3(transform.position.x+((x-1f)*0.3333f), transform.position.y+((y-1f)*0.3333f),0f), LayerMask.NameToLayer("Opaque"));
if(projector.active && !obstructed){
Vector3 pixelPos = transform.position + new Vector3((x-1f)*0.3333f,(y-1f)*0.3333f,0f);
float amp = 0.083333f*Mathf.Sin((10f/(2f*Mathf.PI*projector.waveLength))*Vector3.Distance(emitter.transform.position,pixelPos*(1f+projector.phase)));
ampField[x][y] += amp;
averageAmplitude += ampField[x][y];
}
}
texture.SetPixel(x,y,new Color(fieldColor.r, fieldColor.g, fieldColor.b, ampField[x][y]));
averageAmplitude = averageAmplitude/25f;
}
}
texture.Apply();
appearance = Sprite.Create(texture, new Rect(0f,0f,texture.width,texture.height), new Vector2(0.5f,0.5f), 3f);
myRenderer.sprite = appearance;
}
}
Your answer
Follow this Question
Related Questions
Sprite not showing in spriteRenderer 2 Answers
SetPixel on a sprite texture without changing it globally 1 Answer
Toggling a sprite renderer? 2 Answers