|
|
|
|
using Entitas;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
using Game;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
[Game]
|
|
|
|
|
public class SkillComponent : IComponent
|
|
|
|
|
{
|
|
|
|
|
public MetaData<string> SkillId = new MetaData<string>(); //正在释放的技能id
|
|
|
|
|
public bool IsRunning; //是否技能释放中
|
|
|
|
|
public Vector3 CastDir; //技能释放方向
|
|
|
|
|
|
|
|
|
|
public HashSet<Tuple<int, int>> HitSet = new HashSet<Tuple<int, int>>(); //技能命中信息 生命周期为一次技能释放
|
|
|
|
|
public Queue<SkillHitInfo> HitInfo = new Queue<SkillHitInfo>(); //技能命中结算队列
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace Game
|
|
|
|
|
{
|
|
|
|
|
public abstract partial class Util
|
|
|
|
|
{
|
|
|
|
|
public static void CastSkill(GameEntity entity, string skillId, string skillTimeline, Vector3 castDir)
|
|
|
|
|
{
|
|
|
|
|
TimelineManager.Instance.EndSkillTimeline(entity);
|
|
|
|
|
entity.skill.HitSet.Clear();
|
|
|
|
|
|
|
|
|
|
var skill = entity.skill;
|
|
|
|
|
var move = entity.move;
|
|
|
|
|
skill.IsRunning = true;
|
|
|
|
|
entity.iD.Data.IsFreeControl = false;
|
|
|
|
|
move.IsFreeTurn = false;
|
|
|
|
|
move.TempMoveForceScale = 0;
|
|
|
|
|
|
|
|
|
|
skill.CastDir = castDir;
|
|
|
|
|
skill.SkillId.Value = skillId;
|
|
|
|
|
move.MoveDir = castDir; //释放技能会覆盖移动方向
|
|
|
|
|
if (castDir != GameConst.NoneDir && castDir != GameConst.Stop)
|
|
|
|
|
{
|
|
|
|
|
if (castDir.x != 0)
|
|
|
|
|
{
|
|
|
|
|
move.IsRight = castDir.x > 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TimelineManager.Instance.RunSkillTimeline(entity, skillTimeline);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void EndSkillTimeline(GameEntity entity)
|
|
|
|
|
{
|
|
|
|
|
TimelineManager.Instance.EndSkillTimeline(entity);
|
|
|
|
|
ClearSkill(entity);
|
|
|
|
|
var move = entity.move;
|
|
|
|
|
entity.iD.Data.IsFreeControl = true;
|
|
|
|
|
move.IsFreeTurn = true;
|
|
|
|
|
|
|
|
|
|
if (entity.hasCombo)
|
|
|
|
|
{
|
|
|
|
|
entity.combo.Stance = EComboStance.Idle;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void ClearSkill(GameEntity entity)
|
|
|
|
|
{
|
|
|
|
|
var skill = entity.skill;
|
|
|
|
|
skill.HitSet.Clear();
|
|
|
|
|
skill.HitInfo.Clear();
|
|
|
|
|
skill.IsRunning = false;
|
|
|
|
|
skill.SkillId.Value = "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void CastSkillMonster(GameEntity entity, int index, Vector3 castDir)
|
|
|
|
|
{
|
|
|
|
|
if (!entity.hasAI)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var cfgData = Util.GetMonsterConfigData(entity.CfgId());
|
|
|
|
|
var cfg = cfgData.GetFeatureEntityParamMonster();
|
|
|
|
|
var skillList = cfg.MonsterSkillList;
|
|
|
|
|
if (skillList.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
Util.Print("怪物技能数量为0:", entity.CfgId());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else if (index < 0 || index >= skillList.Count)
|
|
|
|
|
{
|
|
|
|
|
Util.Print("怪物技能释放失败 序号错误:", entity.CfgId(), index, skillList.Count);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var skillCfg = Util.GetSkillMonsterConfigData(skillList[index].TechnicalName);
|
|
|
|
|
var skillTimeline = skillCfg.Template.Skill.Timeline;
|
|
|
|
|
CastSkill(entity, skillCfg.TechnicalName, skillTimeline, castDir);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void CastSkillBullet(GameEntity entity)
|
|
|
|
|
{
|
|
|
|
|
if (!entity.hasBullet)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var bullet = entity.bullet;
|
|
|
|
|
CastSkill(entity, "bullet", bullet.Timeline, bullet.CastDir);
|
|
|
|
|
Util.EntityMove(entity.ID(), bullet.CastDir);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|