Unity에서 Texture2D로 그리기

8910 단어 Unity3DUnity2DUnity
QIX 을 작성하는 과정에서 Texture2D에 직접 선을 그려, 채우는 것을 검토하고 있었습니다.

실제로는 채용하지 않았습니다만, 비망록으로서 Texture2D에 그리는 방법을 남겨 둡니다.



PaintController.cs
public class PaintController : MonoBehaviour
{

    public Texture2D texture2D; // 描き込み先のTexture
    public GameObject pointer;  // カーソル
    private Brush brush;        // ブラシサイズ、色情報を保持するクラス

    void Start()
    {
        // 初期化処理(Inspectorでpublic変数が紐付けられていない時はタグから取得する)
        if (texture2D == null)
        {
            texture2D = GameObject.FindWithTag("Canvas")
                                  .GetComponent<SpriteRenderer>()
                                  .sprite
                                  .texture;
        }

        if (pointer == null)
        {
            Debug.Log("pointer");
            pointer = GameObject.FindWithTag("Pointer");
        }

        brush = new Brush();
    }

    void Update()
    {
        // マウス座標をワールド座標からスクリーン座標に変換する
        Vector2 mouse = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        pointer.transform.position = new Vector3(
            mouse.x,
            mouse.y,
            this.transform.position.z /* マウスのz座標は-10となってしまうため、
            スクリプトがアタッチされているオブジェクトのz座標で補正する */
        );

        // マウスクリック
        if (Input.GetMouseButton(0))
        {
            Draw(Input.mousePosition);
        }
    }

    // 描き込み(Textureに描き込むだけで、元になったpngファイルには反映されない)
    private void Draw(Vector2 position)
    {
        // Textureにピクセルカラーを設定する
        texture2D.SetPixels((int)position.x, (int)position.y,
                            brush.blockWidth,
                            brush.blockHeight,
                            brush.colors);

        // 反映
        texture2D.Apply();
    }

    // ブラシ
    private class Brush
    {
        public int blockWidth = 4;
        public int blockHeight = 4;
        public Color color = Color.gray;
        public Color[] colors;

        public Brush()
        {
            colors = new Color[blockWidth * blockHeight];
            for (int i = 0; i < colors.Length; i++)
            {
                colors[i] = color;
            }
        }
    }
}

그려진 대상의 Texture는 Inspector상에서 이하의 변경을 가해 둘 필요가 있습니다. (SetPixels 함수 실패)
  • Read/Write Enable을 체크한다
  • Format을 DXT1 및 DXT5와 같은 압축 시스템에서 비 압축 시스템으로 변경합니다.



    소스 코드는 GitHub에 업로드 중입니다.
  • 좋은 웹페이지 즐겨찾기