|  |  |  | using System; | 
					
						
							|  |  |  | using Entitas; | 
					
						
							|  |  |  | using UnityEngine; | 
					
						
							|  |  |  | using Game; | 
					
						
							|  |  |  | /// <summary> | 
					
						
							|  |  |  | /// 交互系统 带InteractComp的是可交互物 类型为门、宝箱、怪物等 | 
					
						
							|  |  |  | /// </summary> | 
					
						
							|  |  |  | public class InteractSystem : IExecuteSystem, IInitializeSystem | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     private IGroup<GameEntity> _entities; | 
					
						
							|  |  |  |     private const float SearchWaitTimeMax = 0.2f; | 
					
						
							|  |  |  |     private float _searchWaitTimeLeft = 0; | 
					
						
							|  |  |  |     public void Initialize() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         _entities = Util.GetGroup(GameMatcher.Interact); | 
					
						
							|  |  |  |         EventManager.Instance.AddEvent<PPlayerInput>(EEvent.PlayerInput, OnPlayerAction); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     public void Execute() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!Util.IsControl()) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         var master = Util.GetMaster(); | 
					
						
							|  |  |  |         UpdateInteract(master); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     public void UpdateInteract(GameEntity entity) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         //TODO 瞬间触发多次的问题 | 
					
						
							|  |  |  |         var combo = entity.combo; | 
					
						
							|  |  |  |         var target = combo.TargetInteract; | 
					
						
							|  |  |  |         _searchWaitTimeLeft -= Time.deltaTime; | 
					
						
							|  |  |  |         if (_searchWaitTimeLeft <= 0) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var newTarget = FindTarget(entity); | 
					
						
							|  |  |  |             if (newTarget != target.Value) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (target.Value > 0) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     Util.SetIsTarget(target.Value, false); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 if (newTarget > 0) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     Util.SetIsTarget(newTarget, true); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             target.Value = newTarget; | 
					
						
							|  |  |  |             _searchWaitTimeLeft = SearchWaitTimeMax; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     private int FindTarget(GameEntity entity) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         var combo = entity.combo; | 
					
						
							|  |  |  |         var newTarget = 0; | 
					
						
							|  |  |  |         var distanceMin = float.MaxValue; | 
					
						
							|  |  |  |         foreach (var target in _entities) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (!target.interact.IsActive.Value) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             var entityID = target.ID(); | 
					
						
							|  |  |  |             var distance = Vector3.Distance(entity.Pos(), target.Pos()); | 
					
						
							|  |  |  |             if (distance > GameConst.InteractRange) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (distance < distanceMin) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 newTarget = entityID; | 
					
						
							|  |  |  |                 distanceMin = distance; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return newTarget; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     private void Interact(GameEntity entity) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         var interact = entity.interact; | 
					
						
							|  |  |  |         switch (interact.InteractType) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             case EInteractType.Door: | 
					
						
							|  |  |  |                 Util.EnterLevel(interact.TargetId); | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case EInteractType.Npc: | 
					
						
							|  |  |  |                 Util.StartDrama(interact.TargetId); | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case EInteractType.Monster: | 
					
						
							|  |  |  |                 Util.Print("处决", entity.ID()); | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case EInteractType.Bless: | 
					
						
							|  |  |  |                 // Util.OpenBlessUI((EElementType)Enum.Parse(typeof(EElementType), interact.TargetId, true)); | 
					
						
							|  |  |  |                 Util.DestroyEntity(entity); | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private void OnPlayerAction(PPlayerInput info) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (info.Action == EKeyActionType.Press && info.Key == EFunctionKey.Interact) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var master = Util.GetMaster(); | 
					
						
							|  |  |  |             var combo = master.combo; | 
					
						
							|  |  |  |             var target = combo.TargetInteract; | 
					
						
							|  |  |  |             if (target.Value > 0) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 Interact(Util.GetEntity(target.Value)); | 
					
						
							|  |  |  |                 target.Value = 0; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |