首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绘画精神统一

绘画精神统一
EN

Stack Overflow用户
提问于 2015-04-19 16:16:43
回答 2查看 6.2K关注 0票数 1

问题:

我想要为清洁窗户的原型(我指的是清洁脏窗户)的统一。

我在搜索这个主题,发现我可以通过Texture2D.SetPixel()改变像素。

我试着用这种方法来做,首先我启用了纹理的读/写,并尝试了这个方法,但是我的sprite没有发生任何事情。

所以,我想问一问,是否有可能改变雪碧的阿尔法被鼠标点击或触摸,以显示下面的精灵原!?

我的守则:

代码语言:javascript
复制
    private RaycastHit2D hitInfo;
    private SpriteRenderer spriteRendererComponent;
    private Color zeroAlpha;

    // Use this for initialization
    void Start ()
    {
        spriteRendererComponent = transform.GetComponent<SpriteRenderer>();
        zeroAlpha = Color.blue;
    }

    // Update is called once per frame
    void Update () {
        if (Input.GetMouseButton(0))
        {
            MouseClick();
        }
    }

    public void MouseClick()
    {
        Vector2 mousePosition = Vector2.zero;
        mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        hitInfo = Physics2D.Raycast(mousePosition, Vector2.zero);
        if (hitInfo)
        {
            spriteRendererComponent.sprite.texture.SetPixel((int)hitInfo.point.x, (int)hitInfo.point.y, zeroAlpha);
            spriteRendererComponent.sprite.texture.Apply();
        }
    }

答案:

您可以使用 this thread 来优化雪碧的变化像素。

我找到了关于改变雪碧(绘画)像素的答案

代码语言:javascript
复制
public float radius;
public Color InitialColor;

private RaycastHit2D hitInfo;

// Use this for initialization
void Start()
{

}

// Update is called once per frame
void Update()
{
    if (CustomInput.ControlStay())
    {
        hitInfo = CustomInput.ClickednTouched().hitInfo;
        if (hitInfo)
        {
            UpdateTexture();
        }
    }
}

public Texture2D CopyTexture2D(Texture2D copiedTexture2D)
{
    float differenceX;
    float differenceY;

    //Create a new Texture2D, which will be the copy
    Texture2D texture = new Texture2D(copiedTexture2D.width, copiedTexture2D.height);

    //Choose your filtermode and wrapmode
    texture.filterMode = FilterMode.Bilinear;
    texture.wrapMode = TextureWrapMode.Clamp;

    //Center of hit point circle 
    int m1 = (int)((hitInfo.point.x + 2.5f) / 5 * copiedTexture2D.width);
    int m2 = (int)((hitInfo.point.y + 2.5f) / 5 * copiedTexture2D.height);

    for (int x = 0; x < texture.width; x++)
    {
        for (int y = 0; y < texture.height; y++)
        {
            differenceX = x - m1;
            differenceY = y - m2;

            //INSERT YOUR LOGIC HERE
            if (differenceX * differenceX + differenceY * differenceY <= radius * radius)
            {
                //This line of code and if statement, turn all texture pixels within radius to zero alpha
                texture.SetPixel(x, y, InitialColor);
            }
            else
            {
                //This line of code is REQUIRED. Do NOT delete it. This is what copies the image as it was, without any change
                texture.SetPixel(x, y, copiedTexture2D.GetPixel(x, y));
            }
        }
    }

    //This finalizes it. If you want to edit it still, do it before you finish with Apply(). Do NOT expect to edit the image after you have applied.
    texture.Apply();

    return texture;
}

public void UpdateTexture()
{
    SpriteRenderer mySpriteRenderer = gameObject.GetComponent<SpriteRenderer>();
    Texture2D newTexture2D = CopyTexture2D(mySpriteRenderer.sprite.texture);

    //Get the name of the old sprite
    string tempName = mySpriteRenderer.sprite.name;
    //Create a new sprite
    mySpriteRenderer.sprite = Sprite.Create(newTexture2D, mySpriteRenderer.sprite.rect, new Vector2(0.5f, 0.5f));
    //Name the sprite, the old name
    mySpriteRenderer.sprite.name = tempName;

    //Update the material
    //If you have multiple sprites, you will want to do this in a loop
    //mySpriteRenderer.material.mainTexture = newTexture2D;
    //mySpriteRenderer.material.shader = Shader.Find("Unlit/Transparent");

}

另一个问题:

在雪碧上寻找像素:

在Unity3d中我们有RaycastHit.textureCoord,但是它在2D中已经不存在了。我一直在寻找这个问题,但是我没有发现任何有用的东西。

所以我想知道这个问题的解决方案,我想知道为什么像3D中的textureCoord这样的方法在2D中不存在。

答案:

,我又找到了答案,正如您在前面的代码中看到的那样,用于在sprite.上查找像素。

线程:Finding pixel on sprite in Unity

EN

回答 2

Stack Overflow用户

发布于 2016-04-26 14:56:40

看看这个!

我已经修好了你的剧本。适用于不同的纹理尺寸。不同的纹理位置和相机大小。要求对撞机2d。

代码语言:javascript
复制
    using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    public float radius;
    public Color InitialColor;

    private RaycastHit2D hitInfo;

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            hitInfo = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
            if (hitInfo)
            {
                UpdateTexture();
            }
        }
        if (Input.GetMouseButtonUp(0))
        {
            Resources.UnloadUnusedAssets();
        }
    }

    public Texture2D CopyTexture2D(Texture2D copiedTexture2D)
    {
        float differenceX;
        float differenceY;

        //Create a new Texture2D, which will be the copy
        Texture2D texture = new Texture2D(copiedTexture2D.width, copiedTexture2D.height);

        //Choose your filtermode and wrapmode
        texture.filterMode = FilterMode.Bilinear;
        texture.wrapMode = TextureWrapMode.Clamp;

        //Center of hit point circle 
        int m1 = (int)((hitInfo.point.x - hitInfo.collider.bounds.min.x) * (copiedTexture2D.width / hitInfo.collider.bounds.size.x));
        int m2 = (int)((hitInfo.point.y - hitInfo.collider.bounds.min.y) * (copiedTexture2D.height / hitInfo.collider.bounds.size.y));

        //Vector2 extremeScreenPoint = Camera.main.ScreenToWorldPoint(new Vector2(0, 0));
        //Debug.Log("extremeScreenPoint= " + extremeScreenPoint.x
        //                 + " hitInfo.point.x =" +  hitInfo.point.x 

        //    //+ "  mousePosition =" + Camera.main.ScreenToWorldPoint(Input.mousePosition).x
        //                + "  bounds.min =" +  hitInfo.collider.bounds.min .x
        //                + "  bounds.max =" +  hitInfo.collider.bounds.max .x
        //                                        + "  size =" + hitInfo.collider.bounds.size.x
        //                                        + "  hit =" + (hitInfo.point.x - hitInfo.collider.bounds.min.x)
        //                                        + "  pixels =" + (hitInfo.point.x - hitInfo.collider.bounds.min.x) * (copiedTexture2D.width / hitInfo.collider.bounds.size.x)
        //    );



        for (int x = 0; x < texture.width; x++)
        {
            for (int y = 0; y < texture.height; y++)
            {
                differenceX = x - m1;
                differenceY = y - m2;



                //INSERT YOUR LOGIC HERE
                if (differenceX * differenceX + differenceY * differenceY <= radius * radius)
                {
                    //This line of code and if statement, turn all texture pixels within radius to zero alpha
                    texture.SetPixel(x, y, InitialColor);
                }
                else
                {
                    //This line of code is REQUIRED. Do NOT delete it. This is what copies the image as it was, without any change
                    texture.SetPixel(x, y, copiedTexture2D.GetPixel(x, y));
                }
            }
        }

        //This finalizes it. If you want to edit it still, do it before you finish with Apply(). Do NOT expect to edit the image after you have applied.
        texture.Apply();
        //DestroyImmediate(copiedTexture2D, true);
        return texture;
    }

    public void UpdateTexture()
    {
        SpriteRenderer mySpriteRenderer = gameObject.GetComponent<SpriteRenderer>();
        Texture2D newTexture2D = CopyTexture2D(mySpriteRenderer.sprite.texture);

        //Get the name of the old sprite
        string tempName = mySpriteRenderer.sprite.name;
        //Create a new sprite
        mySpriteRenderer.sprite = Sprite.Create(newTexture2D, mySpriteRenderer.sprite.rect, new Vector2(0.5f, 0.5f));
        //Name the sprite, the old name
        mySpriteRenderer.sprite.name = tempName;

        //Update the material
        //If you have multiple sprites, you will want to do this in a loop
        //mySpriteRenderer.material.mainTexture = newTexture2D;
        //mySpriteRenderer.material.shader = Shader.Find("Unlit/Transparent");

    }
}
票数 1
EN

Stack Overflow用户

发布于 2015-04-20 21:03:48

我曾经做过一次写作和阅读纹理的工作(为一张刮擦卡)。你必须考虑到,当你改变雪碧的像素时,你就改变了整个纹理的像素。因此,假设我改变了像素1x1,很可能它不会改变我的sprite中的像素1x1,如果我在同一纹理中有一堆精灵。因此,您必须考虑雪碧的偏移量,并重新定位您想要更改的像素。试着做这样的事情:

代码语言:javascript
复制
public void MouseClick()
{
    Vector2 offset = new Vector2(XXX, YYY);
    Vector2 mousePosition = Vector2.zero;
    mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    hitInfo = Physics2D.Raycast(mousePosition, Vector2.zero);
    if (hitInfo)
    {
        spriteRendererComponent.sprite.texture.SetPixel((int)hitInfo.point.x + offset.x, (int)hitInfo.point.y + offset.y, zeroAlpha);
        spriteRendererComponent.sprite.texture.Apply();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29732404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档