using System.Collections; using System.Collections.Generic; using UnityEngine; public class Main : MonoBehaviour { // ---------------------------------------------------------------------------------------------------------------- #region properties [SerializeField] public float tileSize = 32f; [SerializeField] public float offset; [SerializeField] public float ppu = 100f; [Space] [SerializeField] public GameMapsAsset mapsAsset; [SerializeField] public GameObject[] towerFab; [SerializeField] public GameObject[] enemyTowerFab; [SerializeField] public GameObject[] enemyFabs; public GameObject radiusBox; [Space] public float dragSpeed = 2.0f; // 拖动速度 [HideInInspector] public Vector3 dragOrigin; // 拖动起始点 [HideInInspector] public Transform TowerContainer; [HideInInspector] public Transform EnemyTowerContainer; [HideInInspector] public Transform EnemyContainer; [HideInInspector] public Transform BoxContainer; //import public ButtonTest buttonTest; #endregion // ---------------------------------------------------------------------------------------------------------------- #region system private void Start() { LoadMap(0); } private void Update() { if (Input.GetKeyDown(KeyCode.R)) { LoadMap(0); } if (Input.GetKeyDown(KeyCode.Space)) { Camera.main.transform.localPosition = Vector3.zero; } if (Input.GetMouseButtonDown(2)) { dragOrigin = Input.mousePosition; return; } if (Input.GetMouseButton(2)) { Vector3 offset = Camera.main.ScreenToViewportPoint(dragOrigin - Input.mousePosition); Vector3 move = dragSpeed * offset.x * Vector3.right; Camera.main.transform.Translate(move, Space.World); dragOrigin = Input.mousePosition; } } // an example of how map data could be loaded private void LoadMap(int mapIdx) { GameMap map = mapsAsset.maps[mapIdx]; float sz = tileSize / ppu; float offsX = -((map.width / 2f * sz) - (sz / 2f)); float offsY = -offset; // create containers for the various map objects if (!TowerContainer) { TowerContainer = new GameObject("Tower").transform; EnemyTowerContainer = new GameObject("EnemyTower").transform; EnemyContainer = new GameObject("Enemy").transform; BoxContainer = new GameObject("Box").transform; } else { for (int i= 0; i < TowerContainer.transform.childCount; i++) { Destroy(TowerContainer.transform.GetChild(i).gameObject); } for (int i = 0; i < EnemyTowerContainer.transform.childCount; i++) { Destroy(EnemyTowerContainer.transform.GetChild(i).gameObject); } for (int i = 0; i < EnemyContainer.transform.childCount; i++) { Destroy(EnemyContainer.transform.GetChild(i).gameObject); } for (int i = 0; i < BoxContainer.transform.childCount; i++) { Destroy(BoxContainer.transform.GetChild(i).gameObject); } } // place tiles and objects. GameMap supports laters but if you choose not to use them then you only need to read from map.grid[] // if you do use layers then you should also read data from map.layers[].grid[] while also still using map.grid[] as layer-0 // to make it easier to read from these two sources of data you can simply use map.LayerCount and map.GetLayerData for (int i = 0; i < map.LayerCount; i++) { int[] grid = map.GetlayerData(i); int idx = 0; for (int y = 0; y < map.height; y++) { for (int x = 0; x < map.width; x++) { GameMapTile t = mapsAsset.tileAsset.GetTile(grid[idx++]); if (t == null) continue; SpriteRenderer ren = null; switch (t.type) { case GameMapTile.Type.Tower: ren = Instantiate(towerFab[t.opt1]).GetComponent(); ren.transform.SetParent(TowerContainer, false); break; case GameMapTile.Type.EnemyTower: ren = Instantiate(enemyTowerFab[t.opt1]).GetComponent(); ren.transform.SetParent(EnemyTowerContainer, false); break; case GameMapTile.Type.Enemy: ren = Instantiate(enemyFabs[t.opt1]).GetComponent(); ren.transform.SetParent(EnemyContainer, false); break; } if (ren == null) continue; ren.color = t.color; ren.transform.localScale = new Vector3(tileSize / ren.sprite.rect.width, tileSize / ren.sprite.rect.height, 1f); ren.transform.localPosition = new Vector3(x * sz + offsX, y * sz + offsY, 0f); Transform box = Instantiate(radiusBox).transform; box.SetParent(BoxContainer, false); box.GetComponent().color = t.color; box.localScale = new Vector3(t.radius.x * 0.4f, t.radius.y*0.4f, 1); box.position = ren.transform.position; } } } } #endregion // ---------------------------------------------------------------------------------------------------------------- }