You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			111 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
| 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;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| } |