Пример #1
0
    static void BakeData(MapData data, Boolean inEditor)
    {
#if UNITY_EDITOR
        if (inEditor)
        {
            if (EditorSceneManager.loadedSceneCount != 1)
            {
                Debug.LogErrorFormat("Can't bake map data when more than one scene is open.");
                return;
            }

            // set scene name
            data.Asset.Settings.Scene = EditorSceneManager.GetActiveScene().name;
        }
#endif

        // clear existing colliders
        data.Asset.Settings.StaticColliders = new MapStaticCollider[0];

        // circle colliders
        foreach (var collider in UnityEngine.Object.FindObjectsOfType <QuantumStaticCircleCollider2D>())
        {
            ArrayUtils.Add(ref data.Asset.Settings.StaticColliders, new MapStaticCollider {
                Position        = collider.transform.position.ToFPVector2(),
                Rotation        = collider.transform.rotation.ToFPRotation2D(),
                PhysicsMaterial = collider.Settings.PhysicsMaterial,
                Trigger         = collider.Settings.Trigger,
                StaticData      = GetStaticData(collider.gameObject, collider.Settings),
                Layer           = collider.gameObject.layer,

                // circle
                ShapeType    = Quantum.Core.DynamicShapeType.Circle,
                CircleRadius = FP.FromFloat_UNSAFE(collider.Radius.AsFloat * collider.transform.localScale.x)
            });
        }

        // polygon colliders
        foreach (var collider in UnityEngine.Object.FindObjectsOfType <QuantumStaticPolygonCollider2D>())
        {
            var s        = collider.transform.localScale;
            var vertices = collider.Vertices.Select(x => { var v = x.ToUnityVector3(); return(new Vector3(v.x * s.x, v.y * s.y, v.z * s.z)); }).Select(x => x.ToFPVector2()).ToArray();

            if (FPVector2.IsClockWise(vertices))
            {
                FPVector2.MakeCounterClockWise(vertices);
            }

            var normals = FPVector2.CalculatePolygonNormals(vertices);

            ArrayUtils.Add(ref data.Asset.Settings.StaticColliders, new MapStaticCollider {
                Position        = collider.transform.position.ToFPVector2(),
                Rotation        = collider.transform.rotation.ToFPRotation2D(),
                PhysicsMaterial = collider.Settings.PhysicsMaterial,
                Trigger         = collider.Settings.Trigger,
                StaticData      = GetStaticData(collider.gameObject, collider.Settings),
                Layer           = collider.gameObject.layer,

                // polygon
                ShapeType       = Quantum.Core.DynamicShapeType.Polygon,
                PolygonCollider = new PolygonCollider {
                    Vertices = vertices,
                    Normals  = normals
                }
            });
        }

        // polygon colliders
        foreach (var collider in UnityEngine.Object.FindObjectsOfType <QuantumStaticBoxCollider2D>())
        {
            var e = collider.Size.ToUnityVector3();
            var s = collider.transform.localScale;
            e.x *= s.x;
            e.y *= s.y;
            e.z *= s.z;

            ArrayUtils.Add(ref data.Asset.Settings.StaticColliders, new MapStaticCollider {
                Position        = collider.transform.position.ToFPVector2(),
                Rotation        = collider.transform.rotation.ToFPRotation2D(),
                PhysicsMaterial = collider.Settings.PhysicsMaterial,
                Trigger         = collider.Settings.Trigger,
                StaticData      = GetStaticData(collider.gameObject, collider.Settings),
                Layer           = collider.gameObject.layer,

                // polygon
                ShapeType  = Quantum.Core.DynamicShapeType.Box,
                BoxExtents = e.ToFPVector2() * FP._0_50
            });
        }

        // invoke callbacks
        foreach (var callback in Quantum.TypeUtils.GetSubClasses(typeof(MapDataBakerCallback), "Assembly-CSharp", "Assembly-CSharp-firstpass", "Assembly-CSharp-Editor", "Assembly-CSharp-Editor-firstpass"))
        {
            if (callback.IsAbstract == false)
            {
                try {
                    (Activator.CreateInstance(callback) as MapDataBakerCallback).OnBake(data);
                }
                catch (Exception exn) {
                    Debug.LogException(exn);
                }
            }
        }

        if (inEditor)
        {
            Debug.LogFormat("Baked {0} static colliders", data.Asset.Settings.StaticColliders.Length);
        }
    }