Unity3d - цвет отдельных частей спрайта / изображения отдельно - PullRequest
0 голосов
/ 26 марта 2019

У меня есть простой спрайт / изображение в Unity3d.Я хотел бы динамически менять цвет листьев / стебля / лепестка отдельно.

Какой самый простой способ это сделать?Должен ли я просто создавать разные объекты и манипулировать ими по отдельности, или есть более эффективный способ сделать это?

(я не ищу код, просто совет высокого уровня - например, используйте svg / create pre-фаб с листьями / стеблем / лепестками, сгруппированными вместе и просто раскрашиваем каждый по отдельности)

Причина, по которой я спрашиваю, так как я новичок в Unity, у меня нет «грамматики», чтобы что-то гуглить, но я был бы признателенбыстрый указатель и должен управлять остальными.

enter image description here

Ответы [ 2 ]

3 голосов
/ 26 марта 2019

Вам придется сохранять каждую часть отдельно.
Как я понимаю, у вас будет более одного изображения для раскраски.Если это так, я бы предложил вам использовать объекты сценариев для хранения изображений, которые сделаны из этих отдельных спрайтов.Вот видео, рассказывающее об основах скриптовых объектов и о том, как их использовать.

https://www.youtube.com/watch?v=aPXvoWVabPY

Это некоторый базовый код, как я представляю, как бы вы сохранили изображение:

[CreateAssetMenu(fileName = "Sprite Scriptable Object", menuName = "Sprite SO")]
public class ScriptObje : ScriptableObject {
    public string naming;
    public List<Sprite> parts;
}
0 голосов
/ 27 марта 2019

Существует еще одна опция, которая позволит вам манипулировать svg: способ сделать это - проанализировать SVG-файл, чтобы получить векторное представление файла (vector Scene), затем вы можете изменить любые свойства перед тесселяцией.Например:

string svg =
    @"<svg xmlns=""http://www.w3.org/2000/svg"" xmlns:xlink=""http://www.w3.org/1999/xlink"" viewBox=""0 0 216 216"">
       <g>
           <polygon id=""Poly1"" points=""...""/>
       </g>
   </svg>";

// Import the SVG at runtime
var sceneInfo = SVGParser.ImportSVG(new StringReader(svg));
var shape = sceneInfo.NodeIDs["Poly1"].Shapes[0];
shape.Fill = new SolidFill() { Color = Color.red };

// Tessellate
var geoms = VectorUtils.TessellateScene(sceneInfo.Scene, tessOptions);

// Build a sprite
var sprite = VectorUtils.BuildSprite(geoms, 10.0f, VectorUtils.Alignment.Center, Vector2.zero, 128, true);
GetComponent<SpriteRenderer>().sprite = sprite;

источник

...