AkiraPixelWind/Assets/Scripts/Main/CustomsComponent/NoMonoBehaviour/BulletMgrNoMono.cs
2023-01-17 17:28:47 +08:00

250 lines
7.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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