You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
8.2 KiB
215 lines
8.2 KiB
using FairyGUI; |
|
using UnityEngine; |
|
using UnityEngine.EventSystems; |
|
|
|
namespace ET |
|
{ |
|
using FUIResource; |
|
using FUIUnitName; |
|
public class ResourceViewComponentAwakeSystem : AwakeSystem<ResourceViewComponent> |
|
{ |
|
public override void Awake(ResourceViewComponent self) |
|
{ |
|
self.Awake(); |
|
} |
|
} |
|
|
|
public class ResourceViewComponentDestroySystem : DestroySystem<ResourceViewComponent> |
|
{ |
|
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<ResourcePoint>(); |
|
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<MapComponent>(); |
|
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<SpriteRenderer>(); |
|
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<ResourceMonsterGroupViewComponent, long>(resource.MonsterGroupId); |
|
} |
|
|
|
// 更新占位 |
|
mapComp.MarkPlaceOnGrid(self.ResourceRoot.transform.position, size); |
|
Physics2D.SyncTransforms(); |
|
mapComp.UpdateNavMesh2d(); |
|
|
|
EventTrigger trigger = self.ResourceRoot.transform.Find("Resource_Base/SpriteClick").GetComponent<EventTrigger>(); |
|
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<SpriteRenderer>(); |
|
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<FUI_ResourceName>(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<Camera>(); |
|
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<OperationComponent>(); |
|
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<FUIComponent>().ShowWindow<FUI_ResourceWindow,FUIResourceWindowComponent>(); |
|
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<ResourceMonsterGroupViewComponent>(); |
|
} |
|
} |
|
|
|
public static void Destory(this ResourceViewComponent self) |
|
{ |
|
if (self.Parent == null) |
|
{ |
|
return; |
|
} |
|
|
|
var mapComp = self.ZoneScene()?.CurrentScene()?.GetComponent<MapComponent>(); |
|
|
|
// 退出程序时,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<SpriteRenderer>(); |
|
mapComp.MarkPlaceOnGrid(self.ResourceRoot.transform.position, mapComp.GetSizeBySpriteCollider(sprRender), false); |
|
GameObject.Destroy(self.ResourceRoot); |
|
Physics2D.SyncTransforms(); |
|
mapComp.UpdateNavMesh2d(); |
|
} |
|
} |
|
} |