public static void LoadMapFromXML() { TextAsset asset = Resources.Load <TextAsset>("BackgroundSplit"); MemoryStream stream = new MemoryStream(asset.bytes); XmlSerializer serializer = new XmlSerializer(typeof(BackgroundPieceCollection)); BackgroundPieceCollection collection = (BackgroundPieceCollection)serializer.Deserialize(XmlReader.Create(stream)); List <BackgroundPiece> piecesToLoad = collection.FindWithin(0, 8640, 0, 19200); foreach (BackgroundPiece piece in piecesToLoad) { if (piece.shown != true) { var bundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/background/backgroundsplit-" + piece.x + "-" + piece.y + ".normal"); if (bundle == null) { Debug.Log("Fail to Load Bundle"); return; } var backgroundTexture = bundle.LoadAsset <Texture2D>(piece.resName); Sprite sprite = Sprite.Create(backgroundTexture, new Rect(0, 0, backgroundTexture.width, backgroundTexture.height), new Vector2(0.5f, 0.5f)); GameObject obj = new GameObject(); SpriteRenderer renderer = obj.AddComponent <SpriteRenderer>(); renderer.sprite = sprite; int posx = 0; int posy = 0; for (int i = 0; i <= 37 - piece.y; i++) { if (i == 0) { posy += 128; } if (i == 1) { posy += 128 + 256; } if (i > 1) { posy += 512; } } for (int i = 0; i <= piece.x; i++) { if (i == 16) { posx += 224 + 256; } else { posx += 512; } } obj.transform.position = new Vector3(posx / 100.0f, posy / 100.0f, 0f); Debug.Log(obj.transform.position); obj = PrefabUtility.InstantiatePrefab(obj) as GameObject; bundle.Unload(false); } } }
public static void ReleaseFiles() { TextAsset asset = Resources.Load <TextAsset>("BackgroundSplit"); MemoryStream stream = new MemoryStream(asset.bytes); XmlSerializer serializer = new XmlSerializer(typeof(BackgroundPieceCollection)); BackgroundPieceCollection collection = (BackgroundPieceCollection)serializer.Deserialize(XmlReader.Create(stream)); List <BackgroundPiece> piecesToLoad = collection.FindWithin(0, 8640, 0, 19200); foreach (BackgroundPiece piece in piecesToLoad) { var bundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/background/backgroundsplit-" + piece.x + "-" + piece.y + ".normal"); bundle.Unload(true); } }
// Update is called once per frame void Update() { float startX = cameraTransform.position.x * 100 - cameraSize.x / 2 - 256; float endX = cameraTransform.position.x * 100 + cameraSize.x / 2 + 256; float startY = cameraTransform.position.y * 100 - cameraSize.y / 2 - 256; float endY = cameraTransform.position.y * 100 + cameraSize.y / 2 + 256; List <BackgroundPiece> piecesToShow = collection.FindWithin(startX, endX, startY, endY); List <BackgroundPiece> piecesToLoad = collection.FindWithin(startX - 256, endX + 256, startY - 256, endY + 256); foreach (BackgroundPiece piece in collection.collection) { if (!piecesToLoad.Contains(piece)) { piece.shown = false; piece.loading = false; } } ReuseOutsight(); foreach (BackgroundPiece piece in piecesToLoad) { if (piece.shown != true) { if (piecesToShow.Contains(piece) && !piece.loading) { var bundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/background/backgroundsplit-" + piece.x + "-" + piece.y + ".normal"); if (bundle == null) { Debug.Log("Fail to Load Bundle"); return; } piece.loading = true; var backgroundTexture = bundle.LoadAsset <Texture2D>(piece.resName); Sprite sprite = Sprite.Create(backgroundTexture, new Rect(0, 0, backgroundTexture.width, backgroundTexture.height), new Vector2(0.5f, 0.5f)); GameObject backgroundObject = availableBackground.Pop(); backgroundObject.GetComponent <SpriteRenderer>().sprite = sprite; float initPosX = piece.initialX / 100.0f; int xCount = Mathf.FloorToInt(cameraTransform.position.x * 100 / backgroundWidth); initPosX = initPosX + backgroundWidth / 100.0f * xCount; if (initPosX < cameraTransform.position.x - cameraSize.x / 100.0f) { initPosX += backgroundWidth / 100.0f; } if (initPosX > cameraTransform.position.x + cameraSize.x / 100.0f) { initPosX -= backgroundWidth / 100.0f; } backgroundObject.transform.position = new Vector3(initPosX, piece.initialY / 100.0f, 0); bundle.Unload(false); piece.shown = true; } else { if (!piece.loading) { StartCoroutine(LoadBackgroundAsync(piece)); } } } } }