public SpriteShapeControllerDto(SpriteShapeController spriteShapeController)
    {
        SetTransform(spriteShapeController.transform);
        SplineDto        = new SplineDto(spriteShapeController.spline);
        SplineDetail     = spriteShapeController.splineDetail;
        SpriteShapeAsset = AssetDatabase.GetAssetPath(spriteShapeController.spriteShape);
        var objectWithMaterial = spriteShapeController.GetComponent <ObjectWithMaterial>();

        if (objectWithMaterial != null)
        {
            PiekaMaterialAsset = AssetDatabase.GetAssetPath(objectWithMaterial.PiekaMaterial);
        }

        var collider2D = spriteShapeController.GetComponent <Collider2D>();

        if (collider2D != null)
        {
            Collider2DType = collider2D.GetType();
        }
        ColliderDetail     = spriteShapeController.colliderDetail;
        ColliderOffset     = spriteShapeController.colliderOffset;
        ColliderCornerType = spriteShapeController.colliderCornerType;
    }
Exemple #2
0
        public static void Bake(GameObject go, bool forced)
        {
            var sc = go.GetComponent <SpriteShapeController>();
            var lc = go.GetComponent <LegacyCollider>();

            if (sc != null)
            {
                List <IntPoint> path             = new List <IntPoint>();
                int             splinePointCount = sc.spline.GetPointCount();
                int             pathPointCount   = splinePointCount;

                ColliderCornerType cct = ColliderCornerType.Square;
                float co = 1.0f;

                if (lc != null)
                {
                    int hashCode = sc.spline.GetHashCode() + lc.m_ColliderCornerType.GetHashCode() + lc.m_ColliderOffset.GetHashCode();
                    if (lc.m_HashCode == hashCode && !forced)
                    {
                        return;
                    }

                    lc.m_HashCode = hashCode;
                    cct           = lc.m_ColliderCornerType;
                    co            = lc.m_ColliderOffset;
                }

                if (sc.spline.isOpenEnded)
                {
                    pathPointCount--;
                }

                for (int i = 0; i < pathPointCount; ++i)
                {
                    int nextIndex = NextIndex(i, splinePointCount);
                    SampleCurve(sc.colliderDetail, sc.spline.GetPosition(i), sc.spline.GetRightTangent(i), sc.spline.GetPosition(nextIndex), sc.spline.GetLeftTangent(nextIndex), ref path);
                }

                if (co != 0f)
                {
                    List <List <IntPoint> > solution   = new List <List <IntPoint> >();
                    ClipperOffset           clipOffset = new ClipperOffset();

                    EndType endType = EndType.etClosedPolygon;

                    if (sc.spline.isOpenEnded)
                    {
                        endType = EndType.etOpenSquare;

                        if (cct == ColliderCornerType.Round)
                        {
                            endType = EndType.etOpenRound;
                        }
                    }

                    clipOffset.ArcTolerance = 200f / sc.colliderDetail;
                    clipOffset.AddPath(path, (ExtrasClipperLib.JoinType)cct, endType);
                    clipOffset.Execute(ref solution, s_ClipperScale * co);

                    if (solution.Count > 0)
                    {
                        path = solution[0];
                    }
                }

                List <Vector2> pathPoints = new List <Vector2>(path.Count);
                for (int i = 0; i < path.Count; ++i)
                {
                    IntPoint ip = path[i];
                    pathPoints.Add(new Vector2(ip.X / s_ClipperScale, ip.Y / s_ClipperScale));
                }

                var pc = go.GetComponent <PolygonCollider2D>();
                if (pc)
                {
                    pc.pathCount = 0;
                    pc.SetPath(0, pathPoints.ToArray());
                }

                var ec = go.GetComponent <EdgeCollider2D>();
                if (ec)
                {
                    if (co > 0f || co < 0f && !sc.spline.isOpenEnded)
                    {
                        pathPoints.Add(pathPoints[0]);
                    }
                    ec.points = pathPoints.ToArray();
                }
            }
        }