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; }
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(); } } }