public static void Activate(LevelData levelData) { if (_instance != null) { _instance.rotationSlider.value = (int)LevelEditor.selectedObject.transform.rotation.eulerAngles.z; speedStrip = LevelEditor.selectedObject.GetComponent <SpeedStrip>(); if (speedStrip != null) { _instance.pushSlider.value = speedStrip.accelSpeed; } } editData = levelData; started = false; }
private void Start() { _instance = this; onPreferenceChange.AddListener(PreferenceChanged); if (LevelEditor.selectedObject != null && LevelEditor.selectedObject.objectType == objectType && rotationSlider.IsActive() && pushSlider.IsActive()) { rotationSlider.value = (int)LevelEditor.selectedObject.transform.rotation.eulerAngles.z; speedStrip = LevelEditor.selectedObject.GetComponent <SpeedStrip>(); if (speedStrip != null) { pushSlider.value = speedStrip.accelSpeed; } started = false; } }
// add an object to the level. this step of reference is needed for later deconstruction of the level and serialization public LevelObject AddObject(LevelObject.ObjectType type, Vector3 position) { if (LevelPlacer._instance != null) { switch (type) { case LevelObject.ObjectType.turret: Turret turret = (Turret)Instantiate(LevelPlacer._instance.turretPrefab, Vector3.zero, Quaternion.identity); turret.transform.parent = LevelPlacer.generatedLevel.transform; Vector2 turretPos = new Vector3(position.x, position.y, LevelPlacer.levelObjectZ); turret.transform.position = turretPos; turrets.Add(turret); // ProgressManager.GetProgress().unlocks.inventory.Add(type, -1); UndoManager.AddUndoPoint(); return(turret); case LevelObject.ObjectType.attractor: Attractor a = (Attractor)Instantiate(LevelPlacer._instance.attractorPrefab, Vector3.zero, Quaternion.identity); a.transform.parent = LevelPlacer.generatedLevel.transform; Vector2 aPos = new Vector3(position.x, position.y, LevelPlacer.levelObjectZ); a.transform.position = aPos; attractors.Add(a); //ProgressManager.GetProgress().unlocks.inventory.Add(type, -1); UndoManager.AddUndoPoint(); return(a); case LevelObject.ObjectType.portal: Portal p = (Portal)Instantiate(LevelPlacer._instance.portalPrefab, Vector3.zero, Quaternion.identity); p.transform.parent = LevelPlacer.generatedLevel.transform; Vector2 pPos = new Vector3(position.x, position.y, LevelPlacer.levelObjectZ); p.transform.position = pPos; p.portalID = GetFreePortalID(0); p.linkedPortalID = -1; portals.Add(p); // ProgressManager.GetProgress().unlocks.inventory.Add(type, -1); UndoManager.AddUndoPoint(); return(p); case LevelObject.ObjectType.speedStrip: SpeedStrip s = (SpeedStrip)Instantiate(LevelPlacer._instance.speedStripPrefab, Vector3.zero, Quaternion.identity); s.transform.parent = LevelPlacer.generatedLevel.transform; Vector2 sPos = new Vector3(position.x, position.y, LevelPlacer.levelObjectZ); s.transform.position = sPos; s.transform.rotation = Quaternion.Euler(0, 0, 180); speedStrips.Add(s); // ProgressManager.GetProgress().unlocks.inventory.Add(type, -1); UndoManager.AddUndoPoint(); return(s); case LevelObject.ObjectType.bouncer: Bouncer b = (Bouncer)Instantiate(LevelPlacer._instance.bouncerPrefab, Vector3.zero, Quaternion.identity); b.transform.parent = LevelPlacer.generatedLevel.transform; Vector2 bPos = new Vector3(position.x, position.y, LevelPlacer.levelObjectZ); b.transform.position = bPos; b.transform.rotation = Quaternion.Euler(0, 0, 0); bouncers.Add(b); // ProgressManager.GetProgress().unlocks.inventory.Add(type, -1); UndoManager.AddUndoPoint(); return(b); default: //Debug.Log("Wasnt able to add the levelobject to the LevelDataMono of type " + lo.objectType); break; } } else { Debug.LogError("LevelPlacer needed to add an object to the level."); } return(null); }
// generate a level based on the input leveldata and assign it as placedLevel, ready for referencing public bool Place(LevelData levelData) { if (levelData != null) { if (generatedLevel != null) { bool vertsDifferen = levelData.moveVerticies != generatedLevel.levelData.moveVerticies; Debug.Log("Destroy Old generated Level, verticies are different: " + vertsDifferen); DestroyImmediate(generatedLevel.gameObject); generatedLevel = null; } // create the base level gameobject, parent of all levelObjects GameObject generatedLevelGO; generatedLevelGO = new GameObject("Generated Level " + levelData.id); // add leveldatamono generatedLevel = generatedLevelGO.AddComponent <LevelDataMono>(); generatedLevel.levelData = levelData; generatedLevel.gameObject.tag = "Level"; generatedLevel.gameObject.layer = LayerMask.NameToLayer("LevelMask"); generatedLevel.transform.parent = transform; generatedLevel.transform.position = transform.position; // create lists generatedLevel.turrets = new List <Turret>(); generatedLevel.portals = new List <Portal>(); generatedLevel.speedStrips = new List <SpeedStrip>(); generatedLevel.attractors = new List <Attractor>(); generatedLevel.bouncers = new List <Bouncer>(); // add spawn Spawn spawn = (Spawn)Instantiate(spawnPrefab, Vector3.zero, Quaternion.identity); spawn.transform.parent = generatedLevel.transform; Vector2 spawnPos = new Vector3(levelData.objectData.spawnPosition.x, levelData.objectData.spawnPosition.y, levelObjectZ); print("spawnpos loading: " + spawnPos); spawn.transform.localPosition = spawnPos; generatedLevel.spawn = spawn; // add finish Finish finish = (Finish)Instantiate(finishPrefab, Vector3.zero, Quaternion.identity); finish.transform.parent = generatedLevel.transform; Vector2 finishPos = new Vector3(levelData.objectData.finishPosition.x, levelData.objectData.finishPosition.y, levelObjectZ); finish.transform.localPosition = finishPos; generatedLevel.finish = finish; // add turrets foreach (TurretData td in levelData.objectData.turretData) { // create gameobject Turret turret = (Turret)Instantiate(turretPrefab, Vector3.zero, Quaternion.identity); turret.transform.parent = generatedLevel.transform; Vector2 turretPos = new Vector3(td.position.x, td.position.y, levelObjectZ); turret.transform.localPosition = turretPos; turret.transform.rotation = Quaternion.Euler(td.rotation.x, td.rotation.y, td.rotation.z); // assign values turret.shotDelay = td.shotDelay; turret.startupDelay = td.startupDelay; turret.constantFire = td.constantFire; turret.shotSpeed = td.shotSpeed; generatedLevel.turrets.Add(turret); } // add attractors foreach (AttractorData ad in levelData.objectData.attractorData) { // create gameobject Attractor attractor = (Attractor)Instantiate(attractorPrefab, Vector3.zero, Quaternion.identity); attractor.transform.parent = generatedLevel.transform; Vector2 attractorPos = new Vector3(ad.position.x, ad.position.y, levelObjectZ); attractor.transform.localPosition = attractorPos; // assign values attractor.pullRadius = ad.radius; attractor.maxPullForce = ad.pullStrength; attractor.SetScale(); // add to the reference list for later saving access generatedLevel.attractors.Add(attractor); } // add speedstrips foreach (SpeedStripData sd in levelData.objectData.speedStripData) { // create gameobject SpeedStrip speedStrip = (SpeedStrip)Instantiate(speedStripPrefab, Vector3.zero, Quaternion.identity); speedStrip.transform.parent = generatedLevel.transform; Vector2 speedStripPos = new Vector3(sd.position.x, sd.position.y, levelObjectZ); speedStrip.transform.localPosition = speedStripPos; speedStrip.transform.rotation = Quaternion.Euler(sd.rotation.x, sd.rotation.y, sd.rotation.z); speedStrip.accelSpeed = sd.pushStrength; generatedLevel.speedStrips.Add(speedStrip); } // add bouncers foreach (BouncerData bd in levelData.objectData.bouncerData) { Bouncer bouncer = (Bouncer)Instantiate(bouncerPrefab, Vector3.zero, Quaternion.identity); bouncer.transform.parent = generatedLevel.transform; Vector2 bouncerPos = new Vector3(bd.position.x, bd.position.y, levelObjectZ); bouncer.transform.localPosition = bouncerPos; bouncer.transform.rotation = Quaternion.Euler(bd.rotation.x, bd.rotation.y, bd.rotation.z); bouncer.bounciness = bd.bounciness; bouncer.width = bd.width; generatedLevel.bouncers.Add(bouncer); } // add portals... foreach (PortalData pd in levelData.objectData.portalData) { // create gameobject Portal portal = (Portal)Instantiate(portalPrefab, Vector3.zero, Quaternion.identity); portal.transform.parent = generatedLevel.transform; Vector2 portalPos = new Vector3(pd.position.x, pd.position.y, levelObjectZ); portal.transform.localPosition = portalPos; // assign values portal.portalID = pd.portalID; portal.linkedPortalID = pd.linkedPortalID; portal.active = pd.active; generatedLevel.portals.Add(portal); } // ... and link them with one another - if there is no fitting counterpart, delete them foreach (Portal p in generatedLevel.portals) { // get the portal that matches the linked id Portal linkPortal = generatedLevel.portals.Find(x => x.portalID == p.linkedPortalID); p.Link(linkPortal); //// link both portals //if (linkPortal != null) //{ // p.linkedPortal = linkPortal; // linkPortal.linkedPortal = p; //} //// no matching portal was found, linking not possible. Set this portal to inactive. //else //{ // p.active = false; //} } // create movearea MoveArea moveArea = (MoveArea)Instantiate(moveAreaPrefab, Vector3.zero, Quaternion.identity); moveArea.transform.parent = generatedLevel.transform; moveArea.transform.localPosition = Vector3.zero; int length = levelData.moveVerticies.Length; generatedLevel.moveArea = moveArea; // if the leveldata has verticies listed, generate a mesh from it and place it if (length > 0) { MeshFilter mr = moveArea.GetComponent <MeshFilter>(); Vector3[] verts = new Vector3[length]; for (int i = 0; i < length; i++) { verts[i] = new Vector3(levelData.moveVerticies[i].x, levelData.moveVerticies[i].y, moveAreaZ); } Mesh m = CreateMoveAreaMesh(verts, levelData.moveTriangles); mr.sharedMesh = m; } // ... otherwise create a default level mesh and place it else { MeshFilter mr = moveArea.GetComponent <MeshFilter>(); Vector3[] verts = new Vector3[4]; int[] tri = new int[6]; // upper left verts[0] = Round(generatedLevel.moveArea.transform.InverseTransformPoint(new Vector3(3990f, 1110f, moveAreaZ))); // upper right verts[1] = Round(generatedLevel.moveArea.transform.InverseTransformPoint(new Vector3(4050f, 1110f, moveAreaZ))); // lower left verts[2] = Round(generatedLevel.moveArea.transform.InverseTransformPoint(new Vector3(3990f, 950f, moveAreaZ))); // lower right verts[3] = Round(generatedLevel.moveArea.transform.InverseTransformPoint(new Vector3(4050f, 950f, moveAreaZ))); // create clockwise triangles based on the vertices we just created tri[0] = 0; tri[1] = 1; tri[2] = 2; tri[3] = 1; tri[4] = 3; tri[5] = 2; Mesh m = CreateMoveAreaMesh(verts, tri); mr.sharedMesh = m; //LevelLoader.SaveCustomLevel(LevelEditor.CreateLevelData()); } // set the movearea as the selected object if (Main.currentScene == Main.ActiveScene.editor) { LevelEditor.SetSelectedObject(generatedLevel.moveArea); } return(true); } else { print("[LevelLoader] level already placed or the LevelData trying to be generated is null"); } return(false); }