250 lines
7.9 KiB
C#
250 lines
7.9 KiB
C#
using Axibug.Runtime;
|
||
using UnityEngine;
|
||
using UnityEditor;
|
||
using Axibug.Resources;
|
||
using System.Collections.Generic;
|
||
using System.Diagnostics.SymbolStore;
|
||
using System.Runtime.Remoting.Metadata.W3cXsd2001;
|
||
using System.Linq;
|
||
using Axibug;
|
||
using UnityEditor.Graphs;
|
||
|
||
namespace Game
|
||
{
|
||
public class BulletMgrNoMono : NoMono
|
||
{
|
||
public PrefabPoolForPath _BulletPool;
|
||
|
||
#region ÉúÃüÖÜÆÚ
|
||
public BulletMgrNoMono(string Name, Transform trans = null) : base(Name, trans)
|
||
{
|
||
_BulletPool = new PrefabPoolForPath(this.transform, E_PREFAB_TYPE.NONE,
|
||
Common.GetBulletProfabPath("1"));
|
||
//×¢²á»Øµ÷
|
||
AddEvent(E_LIFE_MONO_CYCLE.Update | E_LIFE_MONO_CYCLE.FixUpdate);
|
||
}
|
||
|
||
public override void Update()
|
||
{
|
||
|
||
}
|
||
|
||
public override void FixedUpdate()
|
||
{
|
||
FixedUpdate_BullteCheck();
|
||
FixedUpdate_BullteFly();
|
||
}
|
||
|
||
public override void OnApplicationPause()
|
||
{
|
||
|
||
}
|
||
public override void OnApplicationQuit()
|
||
{
|
||
|
||
}
|
||
#endregion
|
||
|
||
#region Ö´ÐÐ
|
||
class BulletRunState
|
||
{
|
||
public Vector3 CenterPos;
|
||
public float RunStartTime;
|
||
public BulletGroupCfg cfgs;
|
||
public bool[] Task_bStart;
|
||
public bool[] Task_bFinish;
|
||
public float[] Task_LastDoTime;
|
||
public int[] Task_Num;
|
||
public float[] Task_LastAngle;
|
||
}
|
||
|
||
List<BulletRunState> _BulletRunList = new List<BulletRunState>();
|
||
List<BulletRunState> Temp_RemoveRun = new List<BulletRunState>();
|
||
|
||
public void AddBulletRun(Vector3 CenterPos,string BulletCfgName)
|
||
{
|
||
string path = Common.GetBulletCfgPath(BulletCfgName);
|
||
BulletGroupCfg cfg = GamePlayEntry.Resources.LoadAsset(path) as BulletGroupCfg;
|
||
AddBulletRun(CenterPos, cfg);
|
||
}
|
||
|
||
public void AddBulletRun(Vector3 CenterPos, BulletGroupCfg cfg)
|
||
{
|
||
BulletRunState run = new BulletRunState();
|
||
run.CenterPos = CenterPos;
|
||
run.RunStartTime = Time.time;
|
||
run.cfgs = cfg;
|
||
|
||
int taskcount = cfg.TaskList.Count;
|
||
run.Task_bStart = new bool[taskcount];
|
||
run.Task_bFinish = new bool[taskcount];
|
||
run.Task_LastDoTime = new float[taskcount];
|
||
run.Task_Num = new int[taskcount];
|
||
run.Task_LastAngle = new float[taskcount];
|
||
for (int i = 0; i < cfg.TaskList.Count; i++)
|
||
{
|
||
run.Task_bStart[i] = false;
|
||
run.Task_bFinish[i] = false;
|
||
run.Task_LastDoTime[i] = -1f;
|
||
run.Task_LastAngle[i] = 0;
|
||
run.Task_Num[i] = 0;
|
||
}
|
||
_BulletRunList.Add(run);
|
||
}
|
||
|
||
|
||
void FixedUpdate_BullteCheck()
|
||
{
|
||
Temp_RemoveRun.Clear();
|
||
for (int i = 0; i < _BulletRunList.Count; i++)
|
||
{
|
||
BulletRunState run = _BulletRunList[i];
|
||
//ûÓÐδÍê³É
|
||
if (!run.Task_bFinish.Contains(false))
|
||
{
|
||
Temp_RemoveRun.Add(run);
|
||
continue;
|
||
}
|
||
|
||
for (int j = 0; j < run.Task_bFinish.Length; j++)
|
||
{
|
||
//ÒÑÍê³É
|
||
if (run.Task_bFinish[j]) continue;
|
||
|
||
BulletGroupCfg_Task onecfg = run.cfgs.TaskList[j];
|
||
bool bFrie = false;
|
||
bool bFrist = false;
|
||
//δ¿ªÊ¼ ÅжϿªÊ¼Ê±¼ä
|
||
if (!run.Task_bStart[j])
|
||
{
|
||
if (Time.time - run.RunStartTime > onecfg.StartTime)
|
||
{
|
||
run.Task_bStart[j] = true;
|
||
bFrist = true;
|
||
bFrie = true;
|
||
}
|
||
}
|
||
else//δ¿ªÊ¼ Åжϼä¸ôʱ¼ä
|
||
{
|
||
if (Time.time - run.Task_LastDoTime[j]> onecfg.IntervalTime)
|
||
{
|
||
run.Task_bStart[j] = true;
|
||
bFrie = true;
|
||
}
|
||
}
|
||
|
||
//Èç¹û·¢Éä²ÅÖ´ÐÐ
|
||
if (!bFrie) continue;
|
||
|
||
float FrieAngle;
|
||
if (bFrist)//Èç¹ûÊǵÚÒ»´Î
|
||
{
|
||
FrieAngle = onecfg.StartAngle;
|
||
}
|
||
else//²»ÊǵÚÒ»´Î
|
||
{
|
||
FrieAngle = run.Task_LastAngle[j] + onecfg.IntervalAngle;
|
||
}
|
||
//ÐÞÕý½Ç¶È£¨£¿¿ÉÄÜÇóÓà ºÃһЩ£¿
|
||
if (FrieAngle > 360) FrieAngle -= 360;
|
||
if (FrieAngle < -360) FrieAngle += 360;
|
||
|
||
run.Task_LastAngle[j] = FrieAngle;
|
||
run.Task_LastDoTime[j] = Time.time;
|
||
run.Task_Num[j]++;
|
||
|
||
//TODO ·¢Éä
|
||
//FrieAngle + onecfg.AfterFireAngle;
|
||
AddBulletFly(run.CenterPos, onecfg, FrieAngle + onecfg.AfterFireAngle);
|
||
|
||
AxibugLog.Debug("·¢Ë͵¯Ä»");
|
||
|
||
//ÅжÏÊÇ·ñ½áÊø
|
||
if (onecfg.bCicircular > 0)//°´ÕÕȦÊý
|
||
{
|
||
if (Mathf.Abs(run.Task_Num[j] * onecfg.IntervalAngle) / 360f >= onecfg.bCicircular)
|
||
run.Task_bFinish[j] = true;
|
||
}
|
||
else//²»°´ÕÕȦÊý£¬°´ÕÕÊýÁ¿
|
||
{
|
||
if (run.Task_Num[j] >= onecfg.LimitNum)
|
||
run.Task_bFinish[j] = true;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (Temp_RemoveRun.Count > 0)
|
||
{
|
||
for (int i = 0; i < Temp_RemoveRun.Count; i++)
|
||
{
|
||
_BulletRunList.Remove(Temp_RemoveRun[i]);
|
||
}
|
||
Temp_RemoveRun.Clear(); ;
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region ¹ÜÀí²úÉúµÄBullte
|
||
class BulletFlyState
|
||
{
|
||
public Vector3 StartPos;
|
||
public float StartTime;
|
||
public float Speed;
|
||
public Vector3 Dir;
|
||
public GameObject go;
|
||
}
|
||
|
||
const float BulletMaxTime = 5f;
|
||
List<BulletFlyState> _BulletFlyStateList = new List<BulletFlyState>();
|
||
List<BulletFlyState> Temp_RemoveFly = new List<BulletFlyState>();
|
||
|
||
public void FixedUpdate_BullteFly()
|
||
{
|
||
Temp_RemoveFly.Clear();
|
||
for (int i = 0; i < _BulletFlyStateList.Count; i++)
|
||
{
|
||
BulletFlyState fly = _BulletFlyStateList[i];
|
||
if (Time.time - fly.StartTime > BulletMaxTime)
|
||
{
|
||
Temp_RemoveFly.Add(fly);
|
||
continue;
|
||
}
|
||
//·ÉÐÐÒÆ¶¯
|
||
fly.go.transform.position += Time.deltaTime * fly.Speed * fly.Dir;
|
||
}
|
||
|
||
if (Temp_RemoveFly.Count > 0)
|
||
{
|
||
for (int i = 0; i < Temp_RemoveFly.Count; i++)
|
||
{
|
||
//»Ø³Ø
|
||
Temp_RemoveFly[i].go.SetActive(false);
|
||
_BulletFlyStateList.Remove(Temp_RemoveFly[i]);
|
||
}
|
||
Temp_RemoveFly.Clear();
|
||
}
|
||
}
|
||
|
||
void AddBulletFly(Vector3 Center, BulletGroupCfg_Task cfg,float FrieAngle)
|
||
{
|
||
GameObject obj = _BulletPool.GetAnyHide();
|
||
//TODO sprite
|
||
//TODO ÒôЧ
|
||
//TODO ·¢ÉäλÖÃÆ«ÒÆ£¨¾àÀëÖÐÐÄλÖÃÆ«ÒƾàÀë
|
||
obj.transform.position = Center;
|
||
|
||
_BulletFlyStateList.Add(new BulletFlyState()
|
||
{
|
||
Speed = cfg.Speed,
|
||
StartPos = Center,
|
||
StartTime = Time.time,
|
||
Dir = Common.GetVecForAngleXY(FrieAngle),
|
||
go = obj
|
||
});
|
||
}
|
||
#endregion
|
||
}
|
||
}
|
||
|