2
0
Fork 0
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#

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;
}
}
}
}