LineRendererでグラフィックを生成するオブジェクトをPrefab(script: Line.cs)からLineGenerator.cs(GameObjectにアタッチされている)で生成し
そのオブジェクトのLine.csにfloat[] x,yで座標を送ってグラフィックを移動させています。
生成時の座標からfloat[]で送った座標に移動させるときにMathf.Lerpでアニメーションさせています。
LineGenerator.csから送る座標は全部で四つのグラフィック分あり、今後増えることを考えて一度List<>に格納しています。
マウスボタンを押すたびに一つ生成し座標を送っています。
問題はアニメーションのためのMathf.Lerpをつけるとprivateなはずの値が干渉してしまうのか四つのグラフィックが全部真ん中に集まってしまうことです。Playを一時停止してグラフィックのオブジェクトを一つずつ消すと与えた座標の位置に近づいていきます。オブジェクトが一つになると正しい位置に収まります。
アニメーションをつけたままfloat[]で与えた座標の位置にすべてのグラフィックが収まるようにしたいのですがどうしたらよいでしょうか?
また、もしかするとLineGeneratorから座標を送るシステムが悪いのでしょうか? 別のクラスに座標計算メソッドを作ってグラフィックのオブジェクトから呼び出す形にした方が良いでしょうか?
こちらがLineGenerator.cs
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class LineGenerator : MonoBehaviour 6{ 7 [SerializeField] public GameObject LinePrefab; 8 [SerializeField] public GameObject panel; 9 10 public int count = -1; 11 public static List<List<float>> listx = new List<List<float>>(); 12 public static List<List<float>> listy = new List<List<float>>(); 13 public static List<GameObject> boxes = new List<GameObject>(); 14 15 16 private Line LineScript; 17 18 // Start is called before the first frame update 19 void Start() 20 { 21 22 } 23 24 // Update is called once per frame 25 void Update() 26 { 27 28 if (Input.GetMouseButtonDown(0)) 29 { 30 31 count++; 32 GameObject Line = Instantiate(LinePrefab) as GameObject; 33 Line.transform.SetParent(panel.transform, false); 34 Line.GetComponent<Line>().indexNo = count; 35 Line.name = "Box" + count; 36 37 boxes.Add(Line); 38 39 // 生成する枠の正しい位置を計算するメソッド 40 // Calcurate(); 41 42 float[] vertexX = CalcurateX(count); 43 float[] vertexY = CalcurateY(count); 44 45 46 boxes[count].transform.GetComponent<Line>().x = vertexX; 47 boxes[count].transform.GetComponent<Line>().y = vertexY; 48 49 } 50 } 51 52 public float[] CalcurateX(int n) 53 { 54 listx.Add(new List<float>()); 55 //仮に手打ち。今後は自動化とメソッドで適正な位置に生成 56 listx[0].Add(-8.8f); 57 listx[0].Add(-4.4f); 58 listx[0].Add(-4.4f); 59 listx[0].Add(-8.8f); 60 listx.Add(new List<float>()); 61 listx[1].Add(-4.4f); 62 listx[1].Add(0f); 63 listx[1].Add(0f); 64 listx[1].Add(-4.4f); 65 listx.Add(new List<float>()); 66 listx[2].Add(0f); 67 listx[2].Add(4.4f); 68 listx[2].Add(4.4f); 69 listx[2].Add(0f); 70 listx.Add(new List<float>()); 71 listx[3].Add(4.4f); 72 listx[3].Add(8.8f); 73 listx[3].Add(8.8f); 74 listx[3].Add(4.4f); 75 listx.Add(new List<float>()); 76 77 78 float a = listx[n][0]; 79 float b = listx[n][1]; 80 float c = listx[n][2]; 81 float d = listx[n][3]; 82 float[] vertexX = new float[] { a, b, c, d }; 83 return vertexX; 84 85 } 86 87 public float[] CalcurateY(int p) 88 { 89 listy.Add(new List<float>()); 90 //仮に手打ち。今後は自動化とメソッドで適正な位置に生成 91 listy[0].Add(4.9f); 92 listy[0].Add(4.9f); 93 listy[0].Add(-4.9f); 94 listy[0].Add(-4.9f); 95 listy.Add(new List<float>()); 96 listy[1].Add(4.9f); 97 listy[1].Add(4.9f); 98 listy[1].Add(-4.9f); 99 listy[1].Add(-4.9f); 100 listy.Add(new List<float>()); 101 listy[2].Add(4.9f); 102 listy[2].Add(4.9f); 103 listy[2].Add(-4.9f); 104 listy[2].Add(-4.9f); 105 listy.Add(new List<float>()); 106 listy[3].Add(4.9f); 107 listy[3].Add(4.9f); 108 listy[3].Add(-4.9f); 109 listy[3].Add(-4.9f); 110 listy.Add(new List<float>()); 111 112 113 float a = listy[p][0]; 114 float b = listy[p][1]; 115 float c = listy[p][2]; 116 float d = listy[p][3]; 117 float[] vertexY = new float[] { a, b, c, d }; 118 return vertexY; 119 }
こちらがLine.cs
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Line : MonoBehaviour 6{ 7 public int indexNo; 8 private int count; 9 10 //public float x, y; 11 12 public float[] x { get; set; } 13 public float[] y { get; set; } 14 15 private static float a, b, c, d, e, f, g, h = 0; 16 17 public float speed = 1.0f; 18 19 private static Vector3 pos0; 20 private static Vector3 pos1; 21 private static Vector3 pos2; 22 private static Vector3 pos3; 23 24 private static Vector3 endpos0; 25 private static Vector3 endpos1; 26 private static Vector3 endpos2; 27 private static Vector3 endpos3; 28 29 30 // Start is called before the first frame update 31 void Start() 32 { 33 LineRenderer renderer = gameObject.GetComponent<LineRenderer>(); 34 // 線の幅 35 renderer.SetWidth(0.1f, 0.1f); 36 // 頂点の数 37 renderer.SetVertexCount(4); 38 // 頂点を設定 39 40 a = -8.8f; 41 b = 8.8f; 42 c = 8.8f; 43 d = -8.8f; 44 45 e = 4.9f; 46 f = 4.9f; 47 g = -4.9f; 48 h = -4.9f; 49 50 pos0 = new Vector3(a, e, 0f); 51 pos1 = new Vector3(b, f, 0f); 52 pos2 = new Vector3(c, g, 0f); 53 pos3 = new Vector3(d, h, 0f); 54 55 renderer.SetPosition(0, pos0); 56 renderer.SetPosition(1, pos1); 57 renderer.SetPosition(2, pos2); 58 renderer.SetPosition(3, pos3); 59 renderer.loop = true; 60 } 61 62 // Update is called once per frame 63 void Update() 64 { 65 LineRenderer renderer = gameObject.GetComponent<LineRenderer>(); 66 // 線の幅 67 renderer.SetWidth(0.1f, 0.1f); 68 // 頂点の数 69 renderer.SetVertexCount(4); 70 //頂点の線形移動 71 72 73 //どうやらこの部分が悪さをしているようだ。 74 75 a = Mathf.Lerp(a, x[0], 0.1f); 76 b = Mathf.Lerp(b, x[1], 0.1f); 77 c = Mathf.Lerp(c, x[2], 0.1f); 78 d = Mathf.Lerp(d, x[3], 0.1f); 79 80 e = Mathf.Lerp(e, y[0], 0.1f); 81 f = Mathf.Lerp(f, y[1], 0.1f); 82 g = Mathf.Lerp(g, y[2], 0.1f); 83 h = Mathf.Lerp(h, y[3], 0.1f); 84 85 Vector3 endpos0 = new Vector3(a, e, 0f); 86 Vector3 endpos1 = new Vector3(b, f, 0f); 87 Vector3 endpos2 = new Vector3(c, g, 0f); 88 Vector3 endpos3 = new Vector3(d, h, 0f); 89 90 //Lerpぬきのこちらは正常に動く 91 /* 92 Vector3 endpos0 = new Vector3(x[0], y[0], 0f); 93 Vector3 endpos1 = new Vector3(x[1], y[1], 0f); 94 Vector3 endpos2 = new Vector3(x[2], y[2], 0f); 95 Vector3 endpos3 = new Vector3(x[3], y[3], 0f); 96 */ 97 // 頂点を設定 98 renderer.SetPosition(0, endpos0); 99 renderer.SetPosition(1, endpos1); 100 renderer.SetPosition(2, endpos2); 101 renderer.SetPosition(3, endpos3); 102 renderer.loop = true; 103 } 104} 105
あなたの回答
tips
プレビュー