Пример #1
0
    IEnumerator drawConnector(bool space)
    {
        Debug.Log("Start Checking Paths");
        var connectorObject = new GameObject("ConnectionTest between " + path1.pathNumber + " and " + path2.pathNumber);

        connector = new MLine(connectorObject);

        connector.SetMaterial(level.pathMat);
        connector.sortingOrder = Statics.LineSortingOrder + 1;
        width           = Statics.lineThickness / 2f;
        connector.width = width;
        connector.SetColor(Color.red);

        connector.SetLocalPosition(0, path1.GetPosition(0));
        connector.SetLocalPosition(1, path2.GetPosition(0));

        dot1 = Instantiate(level.dotPrefab);
        dot1.transform.position = path1.GetPosition(0);
        dot1.GetComponent <SpriteRenderer> ().color = connector.GetColor();
        GameObject.Destroy(dot1.GetComponentInChildren <TrailRenderer> ());
        dot1.GetComponent <SpriteRenderer> ().sortingOrder = connector.sortingOrder;
        dot1.transform.localScale = width * 2 * Vector3.one;

        dot2 = Instantiate(level.dotPrefab);
        dot2.transform.position = path2.GetPosition(0);
        dot2.GetComponent <SpriteRenderer> ().color = connector.GetColor();
        GameObject.Destroy(dot2.GetComponentInChildren <TrailRenderer> ());
        dot2.GetComponent <SpriteRenderer> ().sortingOrder = connector.sortingOrder;
        dot2.transform.localScale = width * 2 * Vector3.one;

        var maxDistance  = 1f;
        var speed        = 10f;
        var meanTime     = 1f / speed;
        var timeForStep1 = meanTime;
        var timeForStep2 = meanTime;

        if (space == false)
        {
            if (path1.Count < path2.Count)
            {
                timeForStep2 = ((float)path1.Count / path2.Count) * timeForStep1;
            }
            else
            {
                timeForStep1 = ((float)path2.Count / path1.Count) * timeForStep2;
            }
        }
        Debug.Log(path1.Count * timeForStep1 + " vs. " + path2.Count * timeForStep2);
        Debug.Log(timeForStep1 + " vs. " + timeForStep2);
        var timeGone1 = 0f;
        var timeGone2 = 0f;

        var i = 1;
        var j = 1;

        while (i < path1.Count - 1 || j < path2.Count - 1)
        {
            if (i < path1.Count - 1 && connector.GetLocalPosition(0) == path1.GetPosition(i))
            {
                i++;
                timeGone1 = timeGone1 - timeForStep1;
            }
            if (j < path2.Count - 1 && connector.GetLocalPosition(1) == path2.GetPosition(j))
            {
                j++;
                timeGone2 = timeGone2 - timeForStep2;
            }

            timeGone1 += Time.deltaTime;
            timeGone2 += Time.deltaTime;

            //			var t = GetPercentage (path1, i) - GetPercentage (path2, j);
            //			timeForStep1 = 1f / (speed + Mathf.Lerp (-speed, speed, 0.5f - t / 2));
            //			timeForStep2 = 1f / (speed + Mathf.Lerp (-speed, speed, 0.5f + t / 2));
            //			Debug.Log ("t = " + t + ", factor= " + (0.5f - t / 2) + ", lerp = " + Mathf.Lerp (-speed, speed, 0.5f - t / 2) + ", timeForStep1-meantime = " + (timeForStep1 - meanTime));
            connector.SetLocalPosition(0, Vector3.Lerp(path1.GetPosition(i - 1), path1.GetPosition(i), timeGone1 / timeForStep1));
            connector.SetLocalPosition(1, Vector3.Lerp(path2.GetPosition(j - 1), path2.GetPosition(j), timeGone2 / timeForStep2));
            connector.width = width * (1 - Vector3.Distance(connector.GetLocalPosition(0), connector.GetLocalPosition(1)) / (maxDistance * 1.1f));
            connector.SetMesh();

            dot1.transform.position = connector.GetLocalPosition(0);
            dot2.transform.position = connector.GetLocalPosition(1);

            if (Vector3.Distance(dot1.transform.position, dot2.transform.position) > maxDistance)
            {
                StartCoroutine(ShrinkConnector(3f));
                yield return(new WaitForSeconds(5));

                Destroy(connectorObject);
                Destroy(dot1);
                Destroy(dot2);
                yield break;
            }
            yield return(null);
        }
        if (isHomotopic)
        {
            level.ShowHintCanvas();
            LevelData.showHint("The paths are homotopic!");
            yield return(new WaitForSeconds(5));

            level.HideHintCanvas();
        }
        yield break;
    }
Пример #2
0
 internal void SetLine(GameObject pathObject, Material mat)
 {
     line = new MLine(pathObject);
     line.SetMaterial(mat);
     line.sortingOrder = Statics.LineSortingOrder;
 }