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.
109 lines
3.3 KiB
C#
109 lines
3.3 KiB
C#
using Entitas;
|
|
using UnityEngine;
|
|
using Game;
|
|
|
|
/// <summary>
|
|
/// 麻薯的管理
|
|
/// </summary>
|
|
public class MasterSoulSystem : IExecuteSystem, IInitializeSystem
|
|
{
|
|
public static float ShakeTerm = 1.5f; //抖动周期
|
|
public static float ShakeDistance = 0.0625f; //抖动幅度 直径为2像素
|
|
public static float ShakeRate = (2 * Mathf.PI) / ShakeTerm; //sin抖动方程a值
|
|
public void Initialize()
|
|
{
|
|
}
|
|
public void Execute()
|
|
{
|
|
var entity = Util.GetMasterSoul();
|
|
if (entity == null)
|
|
{
|
|
return;
|
|
}
|
|
CheckInit(entity);
|
|
UpdateMove(entity);
|
|
UpdateShootPre(entity);
|
|
UpdateShoot(entity);
|
|
}
|
|
public void CheckInit(GameEntity entity)
|
|
{
|
|
var masterSoul = entity.masterSoul;
|
|
}
|
|
public void UpdateMove(GameEntity entity)
|
|
{
|
|
var master = Util.GetMaster();
|
|
|
|
var targetPos = master.Pos() + new Vector3(0.2f * (master.move.IsRight ? -1 : 1), 0, 0.2f);
|
|
targetPos = new Vector3(targetPos.x, 0, targetPos.z);
|
|
var nowPos = entity.Pos();
|
|
var distance = Vector3.Distance(targetPos, nowPos);
|
|
|
|
if (distance > 5)
|
|
{
|
|
entity.SetPos(targetPos);
|
|
return;
|
|
}
|
|
|
|
if (distance < 0.2f)
|
|
{
|
|
if (Util.EntityIsWalk(entity.ID()))
|
|
{
|
|
Util.EntityStopMove(entity.ID());
|
|
Util.SetMasterSoulDir(entity, Vector2.down);
|
|
}
|
|
return;
|
|
}
|
|
var masterSoul = entity.masterSoul;
|
|
var moveSpeed = distance * distance * 4;
|
|
var moveDir = (targetPos - nowPos).normalized;
|
|
entity.move.MoveParam.MoveSpeedMax = moveSpeed;
|
|
Util.EntityMove(entity.ID(), moveDir);
|
|
Util.SetMasterSoulDir(entity, -new Vector2(moveDir.x, moveDir.z));
|
|
}
|
|
public void UpdateShootPre(GameEntity entity)
|
|
{
|
|
var masterSoul = entity.masterSoul;
|
|
var preList = masterSoul.ShootPreList;
|
|
for (int i = preList.Count - 1; i >= 0; i--)
|
|
{
|
|
var info = preList[i];
|
|
info.TimeLeft -= Time.deltaTime;
|
|
if (info.TimeLeft <= 0)
|
|
{
|
|
for (int j = 0; j < info.Count; j++)
|
|
{
|
|
masterSoul.ShootTargetQueue.Enqueue(info.Target);
|
|
}
|
|
preList.RemoveAt(i);
|
|
}
|
|
}
|
|
}
|
|
public void UpdateShoot(GameEntity entity)
|
|
{
|
|
var masterSoul = entity.masterSoul;
|
|
if (masterSoul.ShootTimeLeft > 0)
|
|
{
|
|
masterSoul.ShootTimeLeft -= Time.deltaTime;
|
|
return;
|
|
}
|
|
if (masterSoul.ShootTimeLeft < 0)
|
|
{
|
|
masterSoul.ShootTimeLeft = 0;
|
|
}
|
|
if (masterSoul.ShootTargetQueue.Count == 0)
|
|
{
|
|
return;
|
|
}
|
|
var targetId = masterSoul.ShootTargetQueue.Dequeue();
|
|
var target = Util.GetEntity(targetId);
|
|
if (target == null)
|
|
{
|
|
return;
|
|
}
|
|
masterSoul.ShootTimeLeft = GameConst.MasterSoulShootTime;
|
|
var pos = entity.view.PositionView;
|
|
var posTarget = target.view.PositionLogic;
|
|
var dir = posTarget - pos;
|
|
Util.CreateSubEntity(0, entity.ID(), targetId, dir, pos);
|
|
}
|
|
} |