Прозрачность спрайт в месте нажатия

Общие вопросы о Unity3D

Прозрачность спрайт в месте нажатия

Сообщение fenix72rus 10 июн 2018, 23:26

Подскажите, как сделать спрайт прозрачным в месте нажатия(куда попал луч).
fenix72rus
UNец
 
Сообщения: 42
Зарегистрирован: 08 апр 2017, 16:26

Re: Прозрачность спрайт в месте нажатия

Сообщение 1max1 11 июн 2018, 04:22

Аватара пользователя
1max1
Адепт
 
Сообщения: 1408
Зарегистрирован: 28 июн 2017, 10:51

Re: Прозрачность спрайт в месте нажатия

Сообщение fenix72rus 13 июн 2018, 09:41

1max1 писал(а):https://docs.unity3d.com/ScriptReference/Texture2D.SetPixel.html

Спасибо, а как именно мне получать координаты пикселей в небольшом радиусе вокруг точки нажатия?
fenix72rus
UNец
 
Сообщения: 42
Зарегистрирован: 08 апр 2017, 16:26

Re: Прозрачность спрайт в месте нажатия

Сообщение 1max1 13 июн 2018, 09:51

Это мой собственный код, так что за адекватность работы не ручаюсь)
Пример использования:
Синтаксис:
Используется csharp
SpriteRenderer sr = GetComponent<SpriteRenderer>();
int x,y; // Координаты пикселя.
var m_pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
// Получаем позицию пикселя в точке курсора (думаю как брать радиус сам догадаешься:))
if (sr.WorldToPixelPosition(m_pos, out x, out y))
{
   // Если пиксель существует, тут делаешь что хотел...
}


Синтаксис:
Используется csharp
static class Extensions
{
    #region Vectors
    public static Vector2 Divide(this Vector2 me, Vector2 divider)
    {
        try { return Vector2.Scale(me, new Vector3(1.0f / divider.x, 1.0f / divider.y)); }
        catch { return Vector2.zero; }
    }

    public static Vector3 Divide(this Vector3 me, Vector3 divider)
    {
        try { return Vector3.Scale(me, new Vector3(1.0f / divider.x, 1.0f / divider.y, 1.0f / divider.z)); }
        catch { return Vector3.zero; }
    }
    #endregion

    #region Picture
    // Проверка существования пикселя
    public static bool IsPixelPositionExist(this SpriteRenderer me, int x, int y)
    {
        return x >= 0 && x <= me.sprite.texture.width
            && y >= 0 && y <= me.sprite.texture.height;
    }

    // Переводит координаты из пиксельных в мировые (если всё ок, вернет true)
    public static bool PixelToWorldPosition(this SpriteRenderer me, int x, int y, out Vector3 worldPosition)
    {
        Vector3 delta = new Vector2(x, y) - me.sprite.pivot;

        delta = Quaternion.AngleAxis(me.transform.eulerAngles.z, Vector3.forward) * delta;

        delta = Vector3.Scale(delta, me.transform.localScale);

        worldPosition = me.transform.position + delta / me.sprite.pixelsPerUnit;

        return me.IsPixelPositionExist(x, y);
    }

    // Переводит координаты из мировых в пиксельные (если всё ок, вернет true)
    public static bool WorldToPixelPosition(this SpriteRenderer me, Vector3 worldPosition, out int x, out int y)
    {
        Vector2 delta = worldPosition - me.transform.position;

        delta = Quaternion.AngleAxis(-me.transform.rotation.eulerAngles.z, Vector3.forward) * delta;

        delta = delta.Divide(me.transform.localScale);

        Vector2 result = me.sprite.pivot + delta * me.sprite.pixelsPerUnit;

        x = (int)result.x + 1;
        y = (int)result.y + 1;

        return me.IsPixelPositionExist(x, y);
    }

    // Вернет true если текстура читабельна (стоить галочка Read/Write в инспекторе)
    public static bool IsReadWrite(this Texture2D me)
    {
        try { me.GetPixel(0, 0); return true; }
        catch { return false; }
    }
    #endregion
}
 
Последний раз редактировалось 1max1 13 июн 2018, 12:38, всего редактировалось 1 раз.
Аватара пользователя
1max1
Адепт
 
Сообщения: 1408
Зарегистрирован: 28 июн 2017, 10:51

Re: Прозрачность спрайт в месте нажатия

Сообщение fenix72rus 13 июн 2018, 12:17

1max1 писал(а):Это мой собственный код, так что за адекватность работы не ручаюсь)
Пример использования:
Синтаксис:
Используется csharp
SpriteRenderer sr = GetComponent<SpriteRenderer>();
int x,y; // Координаты пикселя.
var m_pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
// Получаем позицию пикселя в точке курсора (думаю как брать радиус сам догадаешься:))
if (sr.WorldToPixelPosition(m_pos, out x, out y)
{
   // Если пиксель существует, тут делаешь что хотел...
}


Синтаксис:
Используется csharp
static class Extensions
{
    #region Vectors
    public static Vector2 Divide(this Vector2 me, Vector2 divider)
    {
        try { return Vector2.Scale(me, new Vector3(1.0f / divider.x, 1.0f / divider.y)); }
        catch { return Vector2.zero; }
    }

    public static Vector3 Divide(this Vector3 me, Vector3 divider)
    {
        try { return Vector3.Scale(me, new Vector3(1.0f / divider.x, 1.0f / divider.y, 1.0f / divider.z)); }
        catch { return Vector3.zero; }
    }
    #endregion

    #region Picture
    // Проверка существования пикселя
    public static bool IsPixelPositionExist(this SpriteRenderer me, int x, int y)
    {
        return x >= 0 && x <= me.sprite.texture.width
            && y >= 0 && y <= me.sprite.texture.height;
    }

    // Переводит координаты из пиксельных в мировые (если всё ок, вернет true)
    public static bool PixelToWorldPosition(this SpriteRenderer me, int x, int y, out Vector3 worldPosition)
    {
        Vector3 delta = new Vector2(x, y) - me.sprite.pivot;

        delta = Quaternion.AngleAxis(me.transform.eulerAngles.z, Vector3.forward) * delta;

        delta = Vector3.Scale(delta, me.transform.localScale);

        worldPosition = me.transform.position + delta / me.sprite.pixelsPerUnit;

        return me.IsPixelPositionExist(x, y);
    }

    // Переводит координаты из мировых в пиксельные (если всё ок, вернет true)
    public static bool WorldToPixelPosition(this SpriteRenderer me, Vector3 worldPosition, out int x, out int y)
    {
        Vector2 delta = worldPosition - me.transform.position;

        delta = Quaternion.AngleAxis(-me.transform.rotation.eulerAngles.z, Vector3.forward) * delta;

        delta = delta.Divide(me.transform.localScale);

        Vector2 result = me.sprite.pivot + delta * me.sprite.pixelsPerUnit;

        x = (int)result.x + 1;
        y = (int)result.y + 1;

        return me.IsPixelPositionExist(x, y);
    }

    // Вернет true если текстура читабельна (стоить галочка Read/Write в инспекторе)
    public static bool IsReadWrite(this Texture2D me)
    {
        try { me.GetPixel(0, 0); return true; }
        catch { return false; }
    }
    #endregion
}
 

А разве WorldToScreenPoint не из камеры нужно делать?
fenix72rus
UNец
 
Сообщения: 42
Зарегистрирован: 08 апр 2017, 16:26

Re: Прозрачность спрайт в месте нажатия

Сообщение 1max1 13 июн 2018, 12:36

А разве WorldToScreenPoint не из камеры нужно делать?

Ты о чем?
Вот же строка получение игровых координат от мышки:
Синтаксис:
Используется csharp
var m_pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

Не путай с WorldToPixelPosition - это расширение для спрайта, для получения пикселя из мировых координат.
Аватара пользователя
1max1
Адепт
 
Сообщения: 1408
Зарегистрирован: 28 июн 2017, 10:51

Re: Прозрачность спрайт в месте нажатия

Сообщение fenix72rus 13 июн 2018, 13:01

В чём я ошибся? Какую бы worldPosition не делал, mX и mY всегда равны 961 и 541. Пытаюсь из мировых в пиксельные перевести
Синтаксис:
Используется csharp
                Vector3 worldPosition = new Vector3(350, 250);
                SpriteRenderer render = hit.transform.GetComponent<SpriteRenderer>();
                Vector2 delta = worldPosition - render.transform.position;
                delta = Quaternion.AngleAxis(-render.transform.rotation.eulerAngles.z, Vector3.forward) * delta;
                delta = Vector2.Scale(render.transform.localScale, new Vector3(1.0f / delta.x, 1.0f / delta.y));
                Vector2 result = render.sprite.pivot + delta * render.sprite.pixelsPerUnit;
                int mX = (int)result.x + 1;
                int mY = (int)result.y + 1;
                Debug.Log(mX);
                Debug.Log(mY);
 
fenix72rus
UNец
 
Сообщения: 42
Зарегистрирован: 08 апр 2017, 16:26

Re: Прозрачность спрайт в месте нажатия

Сообщение 1max1 13 июн 2018, 14:12

Я вообще не улавливаю что за жесть ты мутишь честно говоря) Я дал тебе статический класс с расширением (ты ведь знаешь что это такое?). Ты решил вывернуть мой код наизнанку :-? Возможно я не так доходчиво объяснил как его использовать, ок, вот тебе пример проекта, где используются этот метод.
https://mega.nz/#!7d4i1RCQ!zyud9tBCQcJa ... DwFqOZ3qhg
Аватара пользователя
1max1
Адепт
 
Сообщения: 1408
Зарегистрирован: 28 июн 2017, 10:51

Re: Прозрачность спрайт в месте нажатия

Сообщение fenix72rus 13 июн 2018, 14:19

1max1 писал(а):Я вообще не улавливаю что за жесть ты мутишь честно говоря) Я дал тебе статический класс с расширением (ты ведь знаешь что это такое?). Ты решил вывернуть мой код наизнанку :-? Возможно я не так доходчиво объяснил как его использовать, ок, вот тебе пример проекта, где используются этот метод.
https://mega.nz/#!7d4i1RCQ!zyud9tBCQcJa ... DwFqOZ3qhg

Извини, что туплю. Я новичок.
Вот код который я состряпал(ещё не смотрел твой проект). Вот что получилось, почему то не красило дальше этой линии: http://vfl.ru/fotos/ac16c0d522099231.html
Синтаксис:
Используется csharp
 
SpriteRenderer sr = GetComponent<SpriteRenderer>();
        int mX, mY; // Координаты пикселя.
        var m_pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        // Получаем позицию пикселя в точке курсора (думаю как брать радиус сам догадаешься:))
        if (sr.WorldToPixelPosition(m_pos, out mX, out mY))
        {
            for (int y = mY; y < mY + 10; y++)
            {
                for (int x = mX; x < mY + 10; x++)
                {
                    tmpTexture.SetPixel(x, y, targetTexture.GetPixel(x, y));

                }
            }
            tmpTexture.Apply();
            Sprite spr = Sprite.Create(tmpTexture, new Rect(0f, 0f, tmpTexture.width, tmpTexture.height), new Vector2(0.5f, 0.5f));
            this.gameObject.GetComponent<SpriteRenderer>().sprite = spr;
        }
 
fenix72rus
UNец
 
Сообщения: 42
Зарегистрирован: 08 апр 2017, 16:26

Re: Прозрачность спрайт в месте нажатия

Сообщение fenix72rus 13 июн 2018, 16:48

1max1 писал(а):Я вообще не улавливаю что за жесть ты мутишь честно говоря) Я дал тебе статический класс с расширением (ты ведь знаешь что это такое?). Ты решил вывернуть мой код наизнанку :-? Возможно я не так доходчиво объяснил как его использовать, ок, вот тебе пример проекта, где используются этот метод.
https://mega.nz/#!7d4i1RCQ!zyud9tBCQcJa ... DwFqOZ3qhg

Братишка, ты гений. Я так понимаю спрайты должны быть rgba 32 bit? Где ты такие сохранял?
fenix72rus
UNец
 
Сообщения: 42
Зарегистрирован: 08 апр 2017, 16:26

Re: Прозрачность спрайт в месте нажатия

Сообщение 1max1 13 июн 2018, 18:16

Хз какие нужны спрайты, я взял первые что попались из интернета)
Аватара пользователя
1max1
Адепт
 
Сообщения: 1408
Зарегистрирован: 28 июн 2017, 10:51

Re: Прозрачность спрайт в месте нажатия

Сообщение fenix72rus 14 июн 2018, 15:53

1max1 писал(а):Хз какие нужны спрайты, я взял первые что попались из интернета)

Довольно мало fps, есть способы оптимизации этого?
fenix72rus
UNец
 
Сообщения: 42
Зарегистрирован: 08 апр 2017, 16:26

Re: Прозрачность спрайт в месте нажатия

Сообщение 1max1 14 июн 2018, 16:32

Изменения текстур вручную требовательная штука, используй ее реже
Аватара пользователя
1max1
Адепт
 
Сообщения: 1408
Зарегистрирован: 28 июн 2017, 10:51

Re: Прозрачность спрайт в месте нажатия

Сообщение seaman 14 июн 2018, 18:21

Маской не быстрее будет?
https://docs.unity3d.com/Manual/class-SpriteMask.html
seaman
Адепт
 
Сообщения: 7507
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Прозрачность спрайт в месте нажатия

Сообщение fenix72rus 16 июн 2018, 20:36

seaman писал(а):Маской не быстрее будет?
https://docs.unity3d.com/Manual/class-SpriteMask.html

А как ей рисовать?
fenix72rus
UNец
 
Сообщения: 42
Зарегистрирован: 08 апр 2017, 16:26

След.

Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


cron