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