public void SetCircles(PBCircle[] circles, PBCircleCurveType curveType) { CurveType = curveType; Circles = circles; circleCurve.Build(Circles, CurveType); ForceUpdate(); }
private void OnGUI() { GUILayout.BeginHorizontal(); foreach (PBCircleCurveType type in curveTypes) { if (EditorGUILayout.ToggleLeft(guiContents[type], curveType == type, GUILayout.Width(150), GUILayout.Height(140)) && curveType != type) { curveType = type; } GUILayout.Space(10); } GUILayout.EndHorizontal(); GUI.color = Color.red; GUILayout.Label("请按照顺序选择圆!!!", labelStyle); GUILayout.Label("顺序为:左手法则,逆时针选择!!!不懂请仔细看图,以及下面的温馨提示", labelStyle); GUI.color = Color.white; GUILayout.Space(10); GUILayout.BeginHorizontal(); GUI.color = Color.yellow; if (GUILayout.Button("已经选好圆\n我要创建履带", btnStyle, GUILayout.Width(200), GUILayout.Height(60))) { CreateTrack(); } if (splineTrack != null) { GUILayout.Label("当前履带节数:" + splineTrack.ChildCount, labelStyle, GUILayout.Height(60)); GUILayout.Space(10); } GUI.color = Color.white; GUILayout.EndHorizontal(); GUILayout.Space(10); TuneGlobalSettings(); GUILayout.Space(10); if (circleObjects != null) { foreach (GameObject circleObj in circleObjects) { EditorGUILayout.ObjectField("", circleObj, typeof(GameObject), GUILayout.Width(200)); } } GUILayout.Space(10); GUILayout.Label("温馨提示", labelStyle); GUILayout.Label("1. 确保所有圆在同一平面,并且forward方向一致!!!", labelStyle); GUILayout.Label("2. 使用左手法则:大拇指朝着forward方向,确定其他手指旋转的方向(逆时针/顺时针", labelStyle); GUILayout.Label("3. 确定了逆时针顺序,则按照此顺序选择圆", labelStyle); GUILayout.Label("4. 请尽量保证圆的up方向与所有圆组成的平面的up方向一致(可能会影响到平铺动画的效果)"); }
public void SetSplineTrack(PBSplineTrack track) { splineTrack = track; curveType = track.CurveType; circleObjects = new List <GameObject>(); if (track.Circles != null && track.Circles.Length > 0) { foreach (PBCircle circle in track.Circles) { circleObjects.Add(circle.transform.gameObject); } } }
public static LinkedList <PBCircleNode> Build(PBCircle[] circles, PBCircleCurveType type) { LinkedList <PBCircleNode> nodes = null; switch (type) { case PBCircleCurveType.OneCircle: nodes = BuildForOne(circles); break; case PBCircleCurveType.Line: nodes = BuildForLine(circles); break; case PBCircleCurveType.Enclosed: nodes = BuildForEnclosed(circles); break; } //compute distance for nodes LinkedListNode <PBCircleNode> listNode = nodes.First; listNode.Value.distance = 0; listNode = listNode.Next; while (listNode != null) { PBCircleNode node = listNode.Value; PBCircleNode preNode = listNode.Previous.Value; if (node.ConnectLine(preNode)) { //直线 node.distance = preNode.distance + Vector3.Distance(node.position, preNode.position); //Debug.Log(">>>>>>>1 distance: " + node.distance); } else { //圆弧 float radius = node.circle.radius; node.distance = preNode.distance + preNode.deltaAngle(node) * Mathf.Deg2Rad * radius; //Debug.Log(">>>>>>>2 distance: " + node.distance); } listNode = listNode.Next; } return(nodes); }
protected override void LoadString(string data) { this.ShowWindow = false; string realData = data.Substring("track:".Length); string[] values = realData.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); Spacing = float.Parse(values[0]); CurveType = (PBCircleCurveType)int.Parse(values[1]); Deviation = values.Length >= 4 ? float.Parse(values[3]) : 0; values = values[2].Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); PBAnimNode[] blocks = GameObject.FindObjectsOfType <PBAnimNode>(); PBCircle[] circles = new PBCircle[values.Length / 2]; for (int i = 0; i < circles.Length; i++) { PBAnimNode block = blocks.FirstOrDefault(b => string.Equals(b.pbID, values[i * 2])); if (block == null) { Debug.LogError(">>>>>履带:找不到齿轮,pbID: " + values[i * 2]); } if (block.transform.localScale != Vector3.one) { Debug.LogError(">>>>>履带:齿轮gameobject的localscale不为1"); } float radius = float.Parse(values[i * 2 + 1]); #if BLOCK_EDITOR if (!Mathf.Approximately(block.transform.lossyScale.x, 1)) { Debug.LogError(">>>>>搭建积木块不允许有缩放,请从根节点开始检查,并修正!"); } #else //app中在创建搭建前,可能会缩放根节点 radius *= block.transform.lossyScale.x; #endif PBCircle circle = new PBCircle(block.transform, radius); circles[i] = circle; } SetCircles(circles, CurveType); }
public void Build(PBCircle[] circles, PBCircleCurveType type) { curveType = type; nodes = PBCircleCurveBuilder.Build(circles, type); }