123 lines
5.0 KiB
C#
123 lines
5.0 KiB
C#
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
using RuntimeData;
|
||
using Logic;
|
||
using TMPro;
|
||
using Unity.Collections;
|
||
|
||
namespace TH1Renderer
|
||
{
|
||
|
||
public enum ProjectileType { Arrow, Bomb, MagicFireBall,CityExp,Coin, Faith}
|
||
public enum ProjectileMoveType { Straight, Parabola,HighParabola,CityExpHighParabola, CoinParabola,Spin, Curved,Bounce,SpecialAnimation}
|
||
|
||
public class ProjectileData
|
||
{
|
||
public MapData MapData;
|
||
public uint Id;
|
||
public ProjectileType ProjectileType;
|
||
public ProjectileMoveType ProjectileMoveType;
|
||
public Vector3 StartPos;
|
||
public Vector3 EndPos;
|
||
|
||
public ProjectileData(MapData mapData,uint id,ProjectileType projectileType,ProjectileMoveType moveType,Vector3 startPos,Vector3 endPos)
|
||
{
|
||
MapData = mapData;
|
||
Id = id;
|
||
ProjectileType = projectileType;
|
||
ProjectileMoveType = moveType;
|
||
StartPos = startPos;
|
||
EndPos = endPos;
|
||
}
|
||
}
|
||
|
||
public class ProjectileManager
|
||
{
|
||
|
||
public uint IdCalculater;
|
||
public Dictionary<uint, ProjectileData> ProjectileDataDict;
|
||
public Dictionary<uint, ProjectileRenderer> ROProjectileMap;
|
||
|
||
|
||
//存储的projectileRenderMap对象(在主界面挂在谁下面)和projectilePrefab对象(用来实例化)
|
||
private GameObject _projectilePrefab;
|
||
private Transform _projectileRenderMap;
|
||
public void Init(GameObject rootObject)
|
||
{
|
||
IdCalculater = 0;
|
||
ProjectileDataDict = new Dictionary<uint, ProjectileData>();
|
||
ROProjectileMap = new Dictionary<uint, ProjectileRenderer>();
|
||
_projectileRenderMap = rootObject.transform.Find("ProjectileMap");
|
||
_projectilePrefab = Resources.Load<GameObject>($"Prefab/projectilePrefab");
|
||
|
||
}
|
||
|
||
public void Update()
|
||
{
|
||
foreach(var t in ROProjectileMap)
|
||
t.Value.Update();
|
||
}
|
||
//创建一个飞行道具,要传入起始位置和结束位置,然后传入飞行道具类型,飞行方式
|
||
public void CreateProjectile(Main main,MapData mapData, Vector3 startPos, Vector3 endPos,
|
||
ProjectileType projectileType, ProjectileMoveType moveType, int para = -1)
|
||
{
|
||
//如果不在视野,不处理
|
||
mapData.GridMap.GetGridDataByVector3Pos(startPos, out var g1);
|
||
mapData.GridMap.GetGridDataByVector3Pos(endPos,out var g2);
|
||
if (!mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(g1.Id)
|
||
&& mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(g2.Id))
|
||
return;
|
||
|
||
|
||
//先创建新的projectileData数据
|
||
var t = new ProjectileData(mapData, IdCalculater++, projectileType, moveType, startPos, endPos);
|
||
ProjectileDataDict[t.Id] = t;
|
||
|
||
//再创建对应projectileRender对象,以及绑定的prefab
|
||
ROProjectileMap[t.Id] = new ProjectileRenderer(_projectilePrefab, _projectileRenderMap, t, mapData, main);
|
||
if (projectileType == ProjectileType.Faith)
|
||
ROProjectileMap[t.Id].GetROProjectile().transform.Find("Faith/Text").GetComponent<TextMeshPro>().text = "+" + para;
|
||
}
|
||
|
||
public void CreateProjectileMulti(Main main,MapData mapData, Vector3 startPos, Vector3 endPos,
|
||
ProjectileType projectileType, ProjectileMoveType moveType,int count, float interval = 0.1f)
|
||
{
|
||
if (count == 0)
|
||
return;
|
||
//如果不在视野,不处理
|
||
if(mapData.GridMap.GetGridDataByVector3Pos(startPos, out var g1)
|
||
&& mapData.GridMap.GetGridDataByVector3Pos(endPos,out var g2))
|
||
if (!mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(g1.Id)
|
||
&& mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(g2.Id))
|
||
return;
|
||
|
||
count--;
|
||
//先创建新的projectileData数据
|
||
var t = new ProjectileData(mapData, IdCalculater++, projectileType, moveType, startPos, endPos);
|
||
ProjectileDataDict[t.Id] = t;
|
||
|
||
//再创建对应projectileRender对象,以及绑定的prefab
|
||
ROProjectileMap[t.Id] = new ProjectileRenderer(_projectilePrefab, _projectileRenderMap, t, mapData, main);
|
||
float tt = 0f;
|
||
while (count > 0)
|
||
{
|
||
count--;
|
||
tt += interval;
|
||
Timer.Instance.TimerRegister(this, () => {
|
||
var ttt = new ProjectileData(mapData, IdCalculater++, projectileType, moveType, startPos, endPos);
|
||
ProjectileDataDict[t.Id] = t;
|
||
|
||
//再创建对应projectileRender对象,以及绑定的prefab
|
||
ROProjectileMap[ttt.Id] = new ProjectileRenderer(_projectilePrefab, _projectileRenderMap, t, mapData, main);
|
||
|
||
}
|
||
,tt);
|
||
//先创建新的projectileData数据
|
||
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
} |