public override void OnClick() { //如果在地图范围内 if (m_UISelectedArea.IsOutRange() == false) { int posX, posY; //将游戏地图上的坐标转换为地图数组的下标 Vector2 pos = m_UISelectedArea.GetClickMapPos(); posX = (int)pos.x; posY = (int)pos.y; MapType mapType = m_MapManager.GetMap(posX, posY); switch (mapType) { case MapType.Empty: { //if(currentStateName=="Stone") { //直接建造 不经过UI确认 //如果可以添加到地图 if (m_MapManager.ModifyMap(posX, posY, MapType.Basic)) { m_TowerManager.RandomInstantiateStone(m_UISelectedArea.GetClickOffsetRealPos()); } } break; } case MapType.Basic: { //如果是外圈模型 则不做更改 if (posX == 0 || posX == MapManager.mapRegionX - 1 || posY == 0 || posY == MapManager.mapRegionY - 1) { return; } //if(currentStateName=="DeleteStone") { //直接删除 不经过UI确认 if (m_MapManager.GetMap(posX, posY) == MapType.Basic) { //先删除石头实体模型,再删除地图上的石头信息,防止石头模型实体未被删除,地图已被删除的情况,石头的Collider未覆盖整个石头建造区域 //由于边界的石头没有实体模型,所以同时可以防止边界石头的地图信息被删除 if (m_TowerManager.DestroyStone(m_UISelectedArea.GetCameraRay())) { m_MapManager.DeleteStone(posX, posY); } } } break; } } } }
//当鼠标左键被触发时,调用此函数 //已弃用 public void ClickConfirmed() { //如果在地图范围内 if (isOutRange == false) { //将游戏地图上的坐标转换为地图数组的下标 int posX, posY; posX = (int)(m_VecTemp.x / size); posY = (int)(m_VecTemp.z / size); MapType mapType = m_MapManager.GetMap(posX, posY); //只有该位置有石头或防御塔的时候才会显示ConstructUI switch (mapType) { case MapType.Empty: { if (fsm.GetCurrentState() == "Stone") { //直接建造 不经过UI确认 //如果可以添加到地图 if (m_MapManager.ModifyMap(posX, posY, MapType.Basic)) { m_TowerManager.RandomInstantiateStone(GetClickOffsetRealPos()); } // m_ConstructUIController.MoveTo(m_VecTemp.x,m_VecTemp.z); // m_ConstructUIController.UpdateMapPos(RealPosToMapPos(m_VecTemp)); // m_ConstructUIController.UpdateCameraRay(ray); // m_ConstructUIController.ChangeButtonText("Stone"); // m_ConstructUIController.Enable(); } else { m_ConstructUIController.Hide(); } break; } case MapType.Basic: //就是石头的意思 { if (fsm.GetCurrentState() == "Tower") { //写到一个函数里面 //m_ConstructUIController.MoveTo(m_VecTemp.x,m_VecTemp.z); m_ConstructUIController.UpdateMapPos(RealPosToMapPos(m_VecTemp)); m_ConstructUIController.UpdateCameraRay(ray); m_ConstructUIController.ChangeButtonImage("Tower"); m_ConstructUIController.Show(); } else { m_ConstructUIController.Hide(); if (fsm.GetCurrentState() == "DeleteStone") { //直接删除 不经过UI确认 if (m_MapManager.GetMap(posX, posY) == MapType.Basic) { //先删除石头实体模型,再删除地图上的石头信息,防止石头模型实体未被删除,地图已被删除的情况,石头的Collider未覆盖整个石头建造区域 //由于边界的石头没有实体模型,所以同时可以防止边界石头的地图信息被删除 if (m_TowerManager.DestroyStone(ray)) { m_MapManager.DeleteStone(posX, posY); } } } } break; } default: { m_ConstructUIController.Hide(); break; } } } }
public override void OnClick() { int posX, posY; //将游戏地图上的坐标转换为地图数组的下标 Vector2 pos = m_UISelectedArea.GetClickMapPos(); posX = (int)pos.x; posY = (int)pos.y; GameObject m_SelectedTower = m_UISelectedArea.GetSelectedTower(); GameObject m_SelectedEnemy = m_UISelectedArea.GetEnemy(); //如果在地图范围内 if (m_UISelectedArea.IsOutRange() == false) { MapType mapType = m_MapManager.GetMap(posX, posY); //如果点击到怪物 if (m_SelectedEnemy != null) { //隐藏UI m_ConstructUIController.Hide(); m_UIRangeIndicator.Disable(); BasicEnemy m_BasicEnemy = m_SelectedEnemy.GetComponent <BasicEnemy>(); if (m_MonsterManager.m_FocusedEnemy == null) { m_BasicEnemy.isFocused = true; m_MonsterManager.m_FocusedEnemy = m_BasicEnemy; } else if (m_MonsterManager.m_FocusedEnemy == m_BasicEnemy) { //如果已经被标记,则取消标记 m_BasicEnemy.isFocused = false; m_MonsterManager.m_FocusedEnemy = null; } else { //取消之前的标记,标记新的怪物 m_MonsterManager.m_FocusedEnemy.isFocused = false; m_BasicEnemy.isFocused = true; m_MonsterManager.m_FocusedEnemy = m_BasicEnemy; } } else { //如果处于升级模式,则不能建造塔,也不能显示UI if (TowerManager.isOnUpdate) { GameObject m_MergeableTower = m_UISelectedArea.GetUpdateTower(); //如果用户点击的塔可以合并 if (m_MergeableTower != null) { GameObject m_UpdatableTower = m_ConstructUIController.GetTowerGameObject(); pos = m_UISelectedArea.RealPosToMapPos(m_MergeableTower.transform.position); posX = (int)pos.x; posY = (int)pos.y; m_MapManager.DeleteTower(posX, posY); //只有在建造塔的状态时 奖励塔的机制才会启动 if (currentStateName == "Construct") { m_TowerManager.UpdateTower(m_UpdatableTower, m_MergeableTower, true); } else { m_TowerManager.UpdateTower(m_UpdatableTower, m_MergeableTower, false); } //升级后销毁被升级的塔 m_TowerManager.DestroyTower(m_MergeableTower); //显示升级后的塔的范围 m_UIRangeIndicator.ShowTowerRangeIndicator(m_UpdatableTower); //再次搜索 m_TowerManager.RetrieveUpdatableTower(); } else { //取消升级状态 TowerManager.isOnUpdate = false; m_TowerManager.RetrieveUpdatableTower(); //隐藏所有UI m_ConstructUIController.Hide(); m_UIRangeIndicator.Disable(); } } else { switch (mapType) { case MapType.Empty: { //隐藏UI m_ConstructUIController.Hide(); m_UIRangeIndicator.Disable(); //如果现在允许建造 if (currentStateName == "Construct") { //如果现在允许建造石头 if (ConstructState.isStone) { //直接建造 不经过UI确认 //如果可以添加到地图 if (m_MapManager.ModifyMap(posX, posY, MapType.Basic)) { m_TowerManager.RandomInstantiateStone(m_UISelectedArea.GetClickOffsetRealPos()); } } } break; } case MapType.Basic: { //隐藏范围指示器 m_UIRangeIndicator.Disable(); //如果现在允许建造 if (currentStateName == "Construct") { //如果现在允许建造石头 if (ConstructState.isStone) { //直接删除 不经过UI确认 if (m_MapManager.GetMap(posX, posY) == MapType.Basic) { //先删除石头实体模型,再删除地图上的石头信息,防止石头模型实体未被删除,地图已被删除的情况,石头的Collider未覆盖整个石头建造区域 //由于边界的石头没有实体模型,所以同时可以防止边界石头的地图信息被删除 if (m_TowerManager.DestroyStone(m_UISelectedArea.GetCameraRay())) { m_MapManager.DeleteStone(posX, posY); } } } else { //如果点击的是地图外围的石头 则不会相应 //虽然看不到外围石头 但在地图数据上存在,用于方便约束寻路 if (posX == 0 || posX == MapManager.mapRegionX - 1 || posY == 0 || posY == MapManager.mapRegionY - 1) { return; } //如果还有剩余的建造塔数量,显示建造UI if (UIRemainTowerCount.remainTowerCount > 0) { UpdateConstructUIConstroller("Tower"); } else { m_ConstructUIController.Hide(); } } } else { m_ConstructUIController.Hide(); } break; } case MapType.Tower: { //如果现在允许建造石头 if (ConstructState.isStone) { return; } //显示范围指示器 m_UIRangeIndicator.ShowTowerRangeIndicator(m_SelectedTower); GameObject m_Tower = m_UISelectedArea.GetUpdateTower(); //如果该塔可以升级 if (m_Tower != null) { UpdateConstructUIConstroller("Upgrade"); m_ConstructUIController.SetTowerGameObject(m_Tower); } else { m_ConstructUIController.Hide(); } break; } } } } } else { //在地图外,隐藏所有UI m_ConstructUIController.Hide(); m_UIRangeIndicator.Disable(); } }