Project_WL/Assets/Script/Info/ProjectileInfo.cs

75 lines
2.7 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
public class ProjectileInfo : MonoBehaviour
{
public static ProjectileInfo Ins;
public Material[] arr_materials; // 0 얼음, 1 히트
Dictionary<string, List<ProjectileBase>> dic_projectile = new Dictionary<string, List<ProjectileBase>>();
private void Awake() { Ins = this; }
private void Start()
{
var lst = table_effectlist.Ins.Get_DataList(2);
for (int i = 0; i < lst.Count; i++)
{
dic_projectile.Add(lst[i].s_EffectPrefab, new List<ProjectileBase>());
for (int j = 0; j < lst[i].n_PreLoadCount; j++)
Load_Projectile(true, lst[i].s_EffectPrefab, null);
}
}
void Load_Projectile(bool loadFirst, string projectile, Action<ProjectileBase> act)
{
AddrResourceMgr.Ins.LoadObject<GameObject>($"Assets/Res_Addr/Projectile/{projectile}.prefab", handle =>
{
var temp = DSUtil.Get_Clone<ProjectileBase>(handle.Result, transform);
if (!loadFirst) temp.Off_FisrLoad();
dic_projectile[projectile].Add(temp);
act?.Invoke(temp);
});
}
void Get_Projectile(string projectile, Action<ProjectileBase> act)
{
if (!dic_projectile.ContainsKey(projectile))
dic_projectile.Add(projectile, new List<ProjectileBase>());
for (int i = 0; i < dic_projectile[projectile].Count; i++)
{
if (!dic_projectile[projectile][i].gameObject.activeInHierarchy)
{
act?.Invoke(dic_projectile[projectile][i]);
return;
}
}
Load_Projectile(true, projectile, act);
}
public void Shoot_Projectile(string projectile, Actor shooter, Actor target, float adddmgrate = 1f, Vector3? startpos = null, float liftTime = 4f, float skilldmg = 1f)
{
Get_Projectile(projectile, proj =>
{
if (!DSUtil.CheckNull(startpos))
proj.Set(new ProjectileData { shooter = shooter, target = target, HitDamage = adddmgrate, eStartPos = eProjectileStartPos.Custom, v3_StartPos = startpos.Value, LifeTime = liftTime, LookTarget = true });
else
proj.Set(new ProjectileData { shooter = shooter, target = target, HitDamage = adddmgrate, eStartPos = eProjectileStartPos.ShooterCenter, LifeTime = liftTime });
});
}
public void Shoot_Projectile(string projectile, ProjectileData pd, Action<ProjectileBase> act = null)
{
Get_Projectile(projectile, proj =>
{
if (!DSUtil.CheckNull(proj))
{
proj.Set(pd);
act?.Invoke(proj);
}
});
}
}