using FairyGUI; using UnityEngine; using UnityEngine.EventSystems; namespace ET { using FUIResource; using FUIUnitName; public class ResourceViewComponentAwakeSystem : AwakeSystem { public override void Awake(ResourceViewComponent self) { self.Awake(); } } public class ResourceViewComponentDestroySystem : DestroySystem { public override void Destroy(ResourceViewComponent self) { self.Destory(); } } [FriendClass(typeof(ResourceViewComponent))] [FriendClass(typeof(ResourcePoint))] [FriendClass(typeof(MapComponent))] [FriendClass(typeof(FUI_ResourceName))] [FriendClass(typeof(FUIUnitNamePanelComponent))] [FriendClass(typeof(FUI_UnitNamePanel))] [FriendClass(typeof(GlobalComponent))] [FriendClass(typeof(OperationComponent))] public static class ResourceViewComponentSystem { public static void Awake(this ResourceViewComponent self) { var res = self.GetParent(); self.CreateResource(res); } public static void CreateResource(this ResourceViewComponent self, ResourcePoint resource) { self.Resource = resource; var resourcePointConfig = resource.Config; var mapComp = self.ZoneScene().CurrentScene().GetComponent(); if (string.IsNullOrEmpty(resourcePointConfig.Prefab[0])) { Log.Warning($"[{resourcePointConfig.Id}]: {resourcePointConfig.ResourcesPointName} has no prefab"); return; } var prefabName = resourcePointConfig.Prefab[0].ToPrefabAddress(); GameObject resGO = self.InstantiateSync(prefabName, mapComp.ResourceRoot); resGO.transform.position = new Vector3(resource.Position.x, resource.Position.y, 0); self.ResourceRoot = resGO; var sprRender = self.ResourceRoot.GetComponentInChildren(); Vector2Int size = mapComp.GetSizeBySpriteCollider(sprRender); #if CLIENTTEST var indicator = BuildingViewHelper.CreateOcupyPlaceInicator("OccupyPlaceInidcator", new Color(1, 0, 0, 0.3f)); indicator.transform.parent = self.ResourceRoot.transform; indicator.transform.localPosition = Vector3.zero; BuildingViewHelper.UpdateIndicatorLocal(indicator, mapComp, resGO.transform.position, size); #endif // 创建怪物图标 if (resource.MonsterGroupId > 0) { self.Parent.AddComponent(resource.MonsterGroupId); } // 更新占位 mapComp.MarkPlaceOnGrid(self.ResourceRoot.transform.position, size); Physics2D.SyncTransforms(); mapComp.UpdateNavMesh2d(); EventTrigger trigger = self.ResourceRoot.transform.Find("Resource_Base/SpriteClick").GetComponent(); EventTrigger.Entry entry = new EventTrigger.Entry(); entry.eventID = EventTriggerType.PointerClick; entry.callback.AddListener((data) => { self.OnSpriteClicked(self); }); trigger.triggers.Add(entry); } public static Vector2 GetNamePos(this ResourceViewComponent self) { var sprRender = self.ResourceRoot.GetComponentInChildren(); Vector3 max = sprRender.bounds.max; Vector3 min = sprRender.bounds.min; return new Vector2((min.x + max.x) / 2, max.y); } public static async ETTask CreateName(this ResourceViewComponent self) { if (self.ResourceRoot == null) { return; } FUI_ResourceName nameEntity = await FUIHelper.CreateInstanceAsync(self.Resource, FUI_ResourceName.UIPackageName, FUI_ResourceName.UIResName); FUIUnitNamePanelComponent unitNamePanelComponent = FUIComponent.Instance.GetUI(FUI_UnitNamePanel.UIResName) as FUIUnitNamePanelComponent; unitNamePanelComponent.FUIUnitNamePanel.FGComp.AddChild(nameEntity.FGComp); nameEntity.m_Name.text = self.Resource.Config.ResourcesPointName; self.UnitName = nameEntity; self.UpdateNamePos(); } public static void UpdateNamePos(this ResourceViewComponent self) { if (self.ResourceRoot == null) { return; } if (self.UnitName == null) { return; } var topPos = self.GetNamePos(); var mainCamera = GlobalComponent.Instance.MainCamera.GetComponent(); self.UnitName.FGComp.xy = FUIHelper.ConvertToUIPos(topPos); self.UnitName.FGComp.scale = Vector2.one * 10 /mainCamera.orthographicSize; } public static bool IsOnUI(this ResourceViewComponent self) { if (Stage.isTouchOnUI) { var unitNamePanel = FUIComponent.Instance.GetUI(FUI_UnitNamePanel.UIResName) as FUIUnitNamePanelComponent; if (unitNamePanel != null && unitNamePanel.FUIUnitNamePanel.Visible) { if (unitNamePanel.FUIUnitNamePanel.FGComp.IsAncestorOf(GRoot.inst.touchTarget)) { return true; } } } return false; } public static void OnSpriteClicked(this ResourceViewComponent self, ResourceViewComponent resourceViewComponent) { if (Stage.isTouchOnUI) { return; } var operationComponent = self.ZoneScene().CurrentScene().GetComponent(); if (operationComponent.IsDragging) { return; } var resource = resourceViewComponent.Resource; // 如果有怪,则先进行打怪 // if (resource.MonsterGroupId > 0) // { // Unit unit = UnitHelper.GetMyUnitFromZoneScene(self.ZoneScene()); // BattleHelper.EnterBattle(unit, resource.MonsterGroupId, ConstBattleType.BATTLE_PVE).Coroutine(); // return; // } var resourceWindowComp = self.ZoneScene().GetComponent().ShowWindow(); resourceWindowComp.ShowInfo(resource); } public static Vector3 GetWorkerPos(this ResourceViewComponent self) { return self.ResourceRoot.transform.position; } public static void UpdateMonsterGroupInfo(this ResourceViewComponent self) { if (self.Resource.MonsterGroupId <= 0) { self.Parent.RemoveComponent(); } } public static void Destory(this ResourceViewComponent self) { if (self.Parent == null) { return; } var mapComp = self.ZoneScene()?.CurrentScene()?.GetComponent(); // 退出程序时,zoneScene会先被清理掉,这里会为空 if (mapComp == null) { return; } FUIUnitNamePanelComponent unitNamePanelComponent = FUIComponent.Instance.GetUI(FUI_UnitNamePanel.UIResName) as FUIUnitNamePanelComponent; unitNamePanelComponent.FUIUnitNamePanel.FGComp.RemoveChild(self.UnitName.FGComp); self.UnitName.Dispose(); var sprRender = self.ResourceRoot.GetComponentInChildren(); mapComp.MarkPlaceOnGrid(self.ResourceRoot.transform.position, mapComp.GetSizeBySpriteCollider(sprRender), false); GameObject.Destroy(self.ResourceRoot); Physics2D.SyncTransforms(); mapComp.UpdateNavMesh2d(); } } }