【发布时间】:2014-11-27 17:25:16
【问题描述】:
我想要一张图片的预制件。图像及其功能将完全相同,但有两种颜色 - 具体来说,我需要将源图像设置为两个图像之一,具体取决于附加到预制件的脚本中布尔值的实际值。当然,我可以不使用两个图像,而是更改原始图像的颜色,或者以其他方式绘制它,但我猜方法大致相同 - 全部在 Unity 内部完成,而不是在代码中完成。
使用 Unity 4.6 最终版本。
顺便说一句,预制件不能继承,对吗?
【问题讨论】:
我想要一张图片的预制件。图像及其功能将完全相同,但有两种颜色 - 具体来说,我需要将源图像设置为两个图像之一,具体取决于附加到预制件的脚本中布尔值的实际值。当然,我可以不使用两个图像,而是更改原始图像的颜色,或者以其他方式绘制它,但我猜方法大致相同 - 全部在 Unity 内部完成,而不是在代码中完成。
使用 Unity 4.6 最终版本。
顺便说一句,预制件不能继承,对吗?
【问题讨论】:
我假设您在新 UI 中引用了 Image 组件并且您想要更改精灵。
在预制件中分配 2 个精灵:
public Sprite spriteOn;
public Sprite spriteOff;
public bool onOff;
void Start() {
Image imageComponent gameObject.GetComponent<Image>();
if(imageComponent != null) onOff ? imageComponent.sprite = spriteOn : imageComponent.spriteOff;
}
或者改变原来的精灵:
public bool onOff;
void Start() {
Image imageComponent gameObject.GetComponent<Image>();
if(imageComponent != null) {
if(onOff) {
Sprite baseSprite;
Texture2D tex = baseSprite.texture;
Texture2D newTex = (Texture2D)Texture2D.Instantiate(tex);
Color[] originalPixels = tex.GetPixels(0);
Color[] newPixels = newTex.GetPixels(0);
for (int i = 0; i < originalPixels.Length; i++) {
// As an example we invert the colors
newPixels[i].r = 1f - originalPixels[i].r;
newPixels[i].g = 1f - originalPixels[i].g;
newPixels[i].b = 1f - originalPixels[i].b;
}
newTex.SetPixels(newPixels, 0);
newTex.Apply();
imageComponent.sprite = Sprite.Create(newTex, baseSprite.rect, baseSprite.bounds.center, baseSprite.pixelsPerUnit);
}
}
}
请注意,这会实例化新对象,当您不再需要它们时必须清理它们。
【讨论】: