Пример #1
0
 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);
    }
Пример #5
0
    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);
    }
Пример #6
0
 public void Build(PBCircle[] circles, PBCircleCurveType type)
 {
     curveType = type;
     nodes     = PBCircleCurveBuilder.Build(circles, type);
 }