前提・実現したいこと
imageに線を描きたいのですが,ネットを参考にしてチャレンジしているのですが
線が途切れて表示されます。
線が繋がるようにする方法を見つけたいのですが参考になるnet情報があれば
教えていただけませんか。
URL
canvasをconstant pixelサイズに変更
canvas,imageを以前と同じscale with screen sizeのままですが
サイズをどちらも(canvas,image) 200に合わせる
該当のソースコード
Unity
1sing UnityEngine; 2using System; 3using System.Linq; 4using UnityEngine.UI; 5using UnityEngine.EventSystems; 6 7/// <summary> 8/// お絵描き 9/// </summary> 10public class Painter : MonoBehaviour 11{ 12 Texture2D texture; 13 Vector3 beforeMousePos; 14 Vector2 localCursor; 15 16 Color bgColor = Color.white; 17 Color lineColor = Color.red; 18 //Color lineColor = Color.black; 19 20 void Start() 21 { 22 var img = GetComponent<Image>(); 23 var rt = GetComponent<RectTransform>(); 24 var width = (int)rt.rect.width; 25 var height = (int)rt.rect.height; 26 texture = new Texture2D(width, height, TextureFormat.ARGB32, false); 27 img.sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero); 28 29 //背景が透明なTexture2Dを作る 30 //http://d.hatena.ne.jp/shinriyo/20140520/p2 31 Color32[] texColors = Enumerable.Repeat<Color32>(bgColor, width * height).ToArray(); 32 texture.SetPixels32(texColors); 33 texture.Apply(); 34 } 35 36 void Update() 37 { 38 if (Input.GetMouseButtonDown(0)) 39 { 40 beforeMousePos = GetPosition(); 41 } 42 else if (Input.GetMouseButton(0)) 43 { 44 Vector3 v = GetPosition(); 45 LineTo(beforeMousePos, v, lineColor); 46 beforeMousePos = v; 47 texture.Apply(); 48 } 49 } 50 51 /// <summary> 52 /// UIのクリック座標のx、y座標を求める - 新しいguiシステムの画像 - Unity Answers 53 /// https://answers.unity.com/questions/892333/find-xy-cordinates-of-click-on-uiimage-new-gui-sys.html 54 /// </summary> 55 public Vector3 GetPosition() 56 { 57 var dat = new PointerEventData(EventSystem.current); 58 dat.position = Input.mousePosition; 59 60 var rect1 = GetComponent<RectTransform>(); 61 var pos1 = dat.position; 62 if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(rect1, pos1, 63 null, out localCursor)) 64 return localCursor; 65 66 int xpos = (int)(localCursor.x); 67 int ypos = (int)(localCursor.y); 68 69 if (xpos < 0) xpos = xpos + (int)rect1.rect.width / 2; 70 else xpos += (int)rect1.rect.width / 2; 71 72 if (ypos > 0) ypos = ypos + (int)rect1.rect.height / 2; 73 else ypos += (int)rect1.rect.height / 2; 74 75 Debug.Log("Correct Cursor Pos: " + xpos + " " + ypos); 76 return new Vector3(xpos, ypos, 0); 77 } 78 79 /// <summary> 80 /// Unityでお絵描きしてみる 81 /// http://tech.gmo-media.jp/post/56101930112/draw-a-picture-with-unity 82 /// </summary> 83 public void LineTo(Vector3 start, Vector3 end, Color color) 84 { 85 float x = start.x, y = start.y; 86 // color of pixels 87 Color[] wcolor = { color }; 88 89 if (Mathf.Abs(start.x - end.x) > Mathf.Abs(start.y - end.y)) 90 { 91 float dy = Math.Abs(end.x - start.x) < float.Epsilon ? 0 : (end.y - start.y) / (end.x - start.x); 92 float dx = start.x < end.x ? 1 : -1; 93 //draw line loop 94 while (x > 0 && x < texture.width && y > 0 && y < texture.height) 95 { 96 try 97 { 98 texture.SetPixels((int)x, (int)y, 1, 1, wcolor); 99 x += dx; 100 y += dx * dy; 101 if (start.x < end.x && x > end.x || 102 start.x > end.x && x < end.x) 103 { 104 break; 105 } 106 } 107 catch (Exception e) 108 { 109 Debug.LogException(e); 110 break; 111 } 112 } 113 } 114 else if (Mathf.Abs(start.x - end.x) < Mathf.Abs(start.y - end.y)) 115 { 116 float dx = Math.Abs(start.y - end.y) < float.Epsilon ? 0 : (end.x - start.x) / (end.y - start.y); 117 float dy = start.y < end.y ? 1 : -1; 118 while (x > 0 && x < texture.width && y > 0 && y < texture.height) 119 { 120 try 121 { 122 texture.SetPixels((int)x, (int)y, 1, 1, wcolor); 123 x += dx * dy; 124 y += dy; 125 if (start.y < end.y && y > end.y || 126 start.y > end.y && y < end.y) 127 { 128 break; 129 } 130 } 131 catch (Exception e) 132 { 133 Debug.LogException(e); 134 break; 135 } 136 } 137 } 138 } 139}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/21 03:53
2019/12/21 08:33 編集
2019/12/21 10:18
2019/12/21 22:52
2019/12/21 23:53
2019/12/22 00:29
2019/12/22 04:11
2019/12/22 06:20
2019/12/22 07:05