Files
5.24BuYu/Assets/MyGame/Scripts/Manager/CreateFishManager.cs
T

902 lines
32 KiB
C#
Raw Normal View History

2026-03-27 15:18:35 +08:00
using Assets.MyGame.Scripts.Characters.Monster;
using Assets.MyGame.Scripts.Net;
2026-02-03 11:35:19 +08:00
using Assets.MyGame.Scripts.Net.API;
using Assets.MyGame.Scripts.Net.API.GameConfig_SubClass;
using Assets.MyGame.Scripts.Net.APIResponses.Enum;
using Assets.MyGame.Scripts.Net.WebResponses;
2026-02-09 10:44:38 +08:00
using cfg;
2026-02-03 11:35:19 +08:00
using Newtonsoft.Json;
using System;
2026-02-09 10:44:38 +08:00
using System.Collections;
2026-02-03 11:35:19 +08:00
using System.Collections.Generic;
using System.Drawing;
2026-03-27 15:18:35 +08:00
using System.Linq;
2026-02-03 11:35:19 +08:00
using System.Threading;
using Unity.Collections;
using Unity.Jobs;
using UnityEditor;
using UnityEngine;
using Random = UnityEngine.Random;
public class CreateFishManager : MonoSingleton<CreateFishManager>
{
#region //这里不用了 但是留着
/*public CreateFishData createFishData;
public async void InitCreateFishData(string path)
{
createFishData = await Addressables.LoadAssetAsync<CreateFishData>(path).Task;
}
public string path;*/
/// <summary>
/// 全局配置(外部初始化)
/// </summary>
//public GameConfig M_GameConfig { get { return GameManager.Instance.gameConfig; } }
#endregion
public GameConfig M_GameConfig => GameManager.Instance.gameConfig;
2026-03-27 15:18:35 +08:00
2026-02-03 11:35:19 +08:00
// 缓存字段
private Dictionary<GameTypeEnum, RoomFishConfig> roomFishConfig;
private Dictionary<GameTypeEnum, Dictionary<string, RoomFishDetailConfig>> createDic;
private Dictionary<string, FishTypeConfig> fishDatas;
2026-03-27 15:18:35 +08:00
public Dictionary<string, MonsterContral> fishDatas_hashCodekey = new Dictionary<string, MonsterContral>();
2026-04-03 18:32:19 +08:00
// ================= 新增缓存字典 =================
private Dictionary<string, FishArrayConfig> fishArrayConfigDic;
private Dictionary<string, FishTypeConfig> fishTypeConfigDic;
private void BuildConfigCache()
{
// 构建 fishArrayConfigs 字典缓存
fishArrayConfigDic = GameManager.Instance.gameConfig.fishArrayConfigs
.ToDictionary(a => a.fishArrayNumber, a => a);
// 构建 fishTypeConfigs 字典缓存
fishTypeConfigDic = GameManager.Instance.gameConfig.fishTypeConfigs
.ToDictionary(f => f.fishNumber, f => f);
}
///// <summary>
///// 懒加载初始化(只执行一次)
///// </summary>
//private void EnsureInit()
//{
// if (roomFishConfig != null)
// return;
// FishYZ.Init();
// roomFishConfig = new Dictionary<GameTypeEnum, RoomFishConfig>();
// createDic = new Dictionary<GameTypeEnum, Dictionary<string, RoomFishDetailConfig>>();
// var list = GameManager.Instance.gameConfig.roomFishConfigs;
// if (list == null || list.Count == 0)
// return;
// foreach (var item in list)
// {
// GameTypeEnum gameType = (GameTypeEnum)item.gameType;
// // 安全添加(避免重复 key 抛异常)
// roomFishConfig[gameType] = item;
// // 初始化子字典
// var fishDic = new Dictionary<string, RoomFishDetailConfig>();
// createDic[gameType] = fishDic;
// // 普通鱼
// if (item.normalFishList != null)
// {
// foreach (var fish in item.normalFishList)
// fishDic[fish.fishNumber] = fish;
// }
// // 等级鱼(若与基础鱼相同素材替换基础的)
// if (item.roomFishLevelList != null)
// {
// foreach (var fish in item.roomFishLevelList)
// fishDic[fish.fishNumber] = fish;
// }
// }
//}
private void EnsureInit()
{
if (roomFishConfig != null)
return;
FishYZ.Init();
roomFishConfig = new Dictionary<GameTypeEnum, RoomFishConfig>();
createDic = new Dictionary<GameTypeEnum, Dictionary<string, RoomFishDetailConfig>>();
var list = GameManager.Instance.gameConfig.roomFishConfigs;
if (list == null || list.Count == 0)
return;
// 初始化缓存字典
BuildConfigCache();
foreach (var item in list)
{
GameTypeEnum gameType = (GameTypeEnum)item.gameType;
roomFishConfig[gameType] = item;
var fishDic = new Dictionary<string, RoomFishDetailConfig>();
createDic[gameType] = fishDic;
if (item.normalFishList != null)
{
foreach (var fish in item.normalFishList)
fishDic[fish.fishNumber] = fish;
}
if (item.roomFishLevelList != null)
{
foreach (var fish in item.roomFishLevelList)
fishDic[fish.fishNumber] = fish;
}
}
}
2026-03-27 15:18:35 +08:00
public Dictionary<string, FishTypeConfig> FishDatas
{
get
{
2026-02-03 11:35:19 +08:00
if (fishDatas != null)
return fishDatas;
2026-03-27 15:18:35 +08:00
fishDatas = new Dictionary<string, FishTypeConfig>();
2026-02-03 11:35:19 +08:00
foreach (var item in M_GameConfig.fishTypeConfigs)
{
fishDatas.Add(item.fishNumber, item);
}
return fishDatas;
2026-03-27 15:18:35 +08:00
}
}
2026-02-03 11:35:19 +08:00
#region 初始化鱼生成配置
/// <summary>
/// 房间鱼配置(按游戏类型)
/// </summary>
public Dictionary<GameTypeEnum, RoomFishConfig> RoomFishConfig
{
get
{
EnsureInit();
return roomFishConfig;
}
}
/// <summary>
/// 鱼号 → 鱼配置(按游戏类型)
/// </summary>
public Dictionary<GameTypeEnum, Dictionary<string, RoomFishDetailConfig>> CreateDic
{
get
{
EnsureInit();
return createDic;
}
}
2026-03-27 15:18:35 +08:00
2026-02-03 11:35:19 +08:00
#endregion
#region // 鱼生成计时器相关
private NativeArray<float> timers;
private NativeArray<float> frequencies;
private NativeArray<int> shouldSpawn;
public GameObject dieFXPrefab;
private List<RoomFishDetailConfig> spawnList; // 当前房间的鱼配置
2026-03-18 17:26:14 +08:00
private Dictionary<string, RoomFishDetailConfig> spawnDic; // 当前房间的鱼配置
2026-03-27 15:18:35 +08:00
Dictionary<FishTypeEnum, List<RoomFishDetailConfig>> fishTypeConfig;//当前房间鱼类型配置列表
Dictionary<string, List<RoomFishDetailConfig>> yz_FishConfig_Line;//当前房间鱼路线列表
Dictionary<string, List<RoomFishDetailConfig>> yz_FishConfig_LineTree;//当前房间鱼路线列表
Dictionary<string, List<RoomFishDetailConfig>> yz_FishConfig_LineFalse;//当前房间鱼路线列表
2026-02-03 11:35:19 +08:00
public void InitSpawnSystem(GameTypeEnum gameType)
{
EnsureInit();
2026-03-27 15:18:35 +08:00
fishTypeConfig = new Dictionary<FishTypeEnum, List<RoomFishDetailConfig>>();
yz_FishConfig_Line = new Dictionary<string, List<RoomFishDetailConfig>>();
2026-02-03 11:35:19 +08:00
var config = RoomFishConfig[gameType];
spawnList = new List<RoomFishDetailConfig>();
2026-03-18 17:26:14 +08:00
spawnDic = new Dictionary<string, RoomFishDetailConfig>();
2026-02-03 11:35:19 +08:00
// 合并普通鱼 + 等级鱼
2026-03-18 17:26:14 +08:00
//spawnList.AddRange(config.normalFishList);
//spawnList.AddRange(config.roomFishLevelList);
2026-03-27 15:18:35 +08:00
GameConfig gameConfig = GameManager.Instance.gameConfig;
2026-03-18 17:26:14 +08:00
foreach (var item in config.normalFishList)
{
2026-03-27 15:18:35 +08:00
2026-03-18 17:26:14 +08:00
spawnDic.Add(item.fishNumber, item);
spawnDic[item.fishNumber] = item;
spawnList.Add(item);
2026-03-27 15:18:35 +08:00
if (item.type == 1)
{
FishTypeEnum typeEnum = (FishTypeEnum)FishDatas[item.fishNumber].fishType;
if (!fishTypeConfig.ContainsKey(typeEnum))
{
fishTypeConfig[typeEnum] = new List<RoomFishDetailConfig>();
}
fishTypeConfig[typeEnum].Add(item);
// yz_FishTypeConfig.Add
}
if (item.type == 2)
{
2026-04-03 18:32:19 +08:00
//var yz = GameManager.Instance.gameConfig.fishArrayConfigs.Find(a => a.fishArrayNumber == item.fishNumber);
//if (!yz_FishConfig_Line.ContainsKey(yz.arrayNumber))
//{
// yz_FishConfig_Line[yz.arrayNumber] = new List<RoomFishDetailConfig>();
//}
//yz_FishConfig_Line[yz.arrayNumber].Add(item);
// ====== 修改点:用字典替代 List.Find ======
if (fishArrayConfigDic.TryGetValue(item.fishNumber, out var yz))
2026-03-27 15:18:35 +08:00
{
2026-04-03 18:32:19 +08:00
if (!yz_FishConfig_Line.ContainsKey(yz.arrayNumber))
{
yz_FishConfig_Line[yz.arrayNumber] = new List<RoomFishDetailConfig>();
}
yz_FishConfig_Line[yz.arrayNumber].Add(item);
2026-03-27 15:18:35 +08:00
}
}
2026-03-18 17:26:14 +08:00
}
foreach (var item in config.roomFishLevelList)
{
2026-03-27 15:18:35 +08:00
if (item.roomLevel == GameManager.Instance.gameData.currRoomData.roomLevel)
2026-03-18 17:26:14 +08:00
{
2026-03-27 15:18:35 +08:00
if (item.type == 2)
2026-03-18 17:26:14 +08:00
{
2026-03-27 15:18:35 +08:00
spawnDic.Add(item.fishNumber, item);
spawnList.Add(item);
2026-04-03 18:32:19 +08:00
//var yz = GameManager.Instance.gameConfig.fishArrayConfigs.Find(a => a.fishArrayNumber == item.fishNumber);
//if (!yz_FishConfig_Line.ContainsKey(yz.arrayNumber))
//{
// yz_FishConfig_Line[yz.arrayNumber] = new List<RoomFishDetailConfig>();
//}
//yz_FishConfig_Line[yz.arrayNumber].Add(item);
// ====== 修改点:用字典替代 List.Find ======
if (fishArrayConfigDic.TryGetValue(item.fishNumber, out var yz))
2026-03-27 15:18:35 +08:00
{
2026-04-03 18:32:19 +08:00
if (!yz_FishConfig_Line.ContainsKey(yz.arrayNumber))
{
yz_FishConfig_Line[yz.arrayNumber] = new List<RoomFishDetailConfig>();
}
yz_FishConfig_Line[yz.arrayNumber].Add(item);
2026-03-27 15:18:35 +08:00
}
}
else
{
var typeEnum = (FishTypeEnum)FishDatas[item.fishNumber].fishType;
if (!fishTypeConfig.ContainsKey(typeEnum))
{
fishTypeConfig[typeEnum] = new List<RoomFishDetailConfig>();
}
fishTypeConfig[typeEnum].Add(item);
if (item.roomLevel == GameManager.Instance.gameData.currRoomData.roomLevel)
{
spawnDic.Add(item.fishNumber, item);
spawnList.Add(item);
}
}
}
2026-03-18 17:26:14 +08:00
}
2026-02-03 11:35:19 +08:00
int count = spawnList.Count;
timers = new NativeArray<float>(count, Allocator.Persistent);
frequencies = new NativeArray<float>(count, Allocator.Persistent);
shouldSpawn = new NativeArray<int>(count, Allocator.Persistent);
for (int i = 0; i < count; i++)
{
timers[i] = 0;
frequencies[i] = spawnList[i].fishFrequency;
2026-03-27 15:18:35 +08:00
shouldSpawn[i] = 1;
//shouldSpawn[i] = spawnList[i].isCreate;
2026-02-03 11:35:19 +08:00
}
2026-03-27 15:18:35 +08:00
yz_FishConfig_LineTree = yz_FishConfig_Line;
yz_FishConfig_LineFalse = new Dictionary<string, List<RoomFishDetailConfig>>();
foreach (var item in MonsterMoveLine.dic_BezierCurveDatas.Keys)
{
if (item.Substring(0, 2) == "鱼阵")
{
yz_LineCount++;
}
}
2026-02-03 11:35:19 +08:00
}
2026-03-27 15:18:35 +08:00
int yz_LineCount = 0;
2026-02-03 11:35:19 +08:00
public void CloseSpawnSystem()
{
spawnList = null;
2026-04-03 09:28:13 +08:00
for (int i = 0; i < fishRoot.childCount; i++)
{
2026-04-03 18:32:19 +08:00
Destroy(fishRoot.GetChild(i).gameObject);
2026-04-03 09:28:13 +08:00
}
2026-02-03 11:35:19 +08:00
}
#endregion
/// <summary>
/// 鱼的父节点(用于层级管理)
/// </summary>
public Transform fishRoot;
2026-03-27 15:18:35 +08:00
protected override void Awake()
2026-02-03 11:35:19 +08:00
{
2026-03-27 15:18:35 +08:00
base.Awake();
2026-02-03 11:35:19 +08:00
if (fishRoot == null)
{
fishRoot = new GameObject("FishRoot").transform;
}
// CreateSingleFish();
2026-03-09 09:25:01 +08:00
EventCenter.Instance.AddEventListener<SyncGameData>(ConstEventString.SyncGameData_CreateFish, CreateFish);
2026-03-27 15:18:35 +08:00
yz_Time = (int)Random.Range(2, 6);//2-4鱼阵
yzCount = Random.Range(2, 5);//2-4鱼阵
ptCount = Random.Range(1, 4);//1-3个
2026-02-03 11:35:19 +08:00
}
2026-03-09 09:25:01 +08:00
private void OnDestroy()
{
EventCenter.Instance.RemoveEventListener<SyncGameData>(ConstEventString.SyncGameData_CreateFish, CreateFish);
}
public bool fangzhu;
2026-02-03 11:35:19 +08:00
2026-04-03 09:28:13 +08:00
float boss = 1;
//float boss = 25;
2026-04-03 18:32:19 +08:00
float yz_Time;
int yzCount;
2026-03-27 15:18:35 +08:00
Dictionary<RoomFishDetailConfig, bool> isyzCreate = new Dictionary<RoomFishDetailConfig, bool>();
float pt = 3;//1-3个
int ptCount;
2026-04-03 18:32:19 +08:00
2026-03-27 15:18:35 +08:00
public static List<int> RandomUniqueNumbers(int count, int min, int max)
{
HashSet<int> result = new HashSet<int>();
System.Random rand = new System.Random();
while (result.Count < count)
{
result.Add(rand.Next(min, max)); // max 是开区间
}
return result.ToList();
}
2026-02-03 11:35:19 +08:00
private void Update()
{
if (spawnList == null)
return;
2026-03-09 09:25:01 +08:00
if (!fangzhu)
{
return;
}
2026-02-03 11:35:19 +08:00
var job = new FishSpawnTimerJob
{
deltaTime = Time.deltaTime,
timers = timers,
frequencies = frequencies,
2026-03-27 15:18:35 +08:00
shouldSpawn = shouldSpawn,
//keyValues
2026-02-03 11:35:19 +08:00
};
JobHandle handle = job.Schedule();
handle.Complete();
2026-04-03 18:32:19 +08:00
float deltatime = Time.deltaTime;
boss -= deltatime;
yz_Time -= deltatime;
pt -= deltatime;
2026-03-27 15:18:35 +08:00
if (boss <= 0)
{
if (fishTypeConfig.ContainsKey(FishTypeEnum.Boss鱼))
{
List<RoomFishDetailConfig> list = new List<RoomFishDetailConfig>();
foreach (var item in fishTypeConfig[FishTypeEnum.Boss鱼])
{
list.Add(item);
}
2026-04-03 09:28:13 +08:00
//list[Random.Range(0, c.Count)].isCreate = 2;
foreach (var item in list)
{
2026-04-22 00:15:53 +08:00
if (item.fishNumber == 13033.ToString())
2026-04-03 09:28:13 +08:00
{
item.isCreate = 2;
}
}
2026-03-27 15:18:35 +08:00
}
boss = 25;
}
if (yz_Time <= 0)
{
var list = RandomUniqueNumbers(yzCount, 0, FishYZ.dicfishYZ.Count);
for (int i = 0; i < yzCount; i++)
{
string str = FishYZ.dicfishYZ_list[list[i]].ToString();
if (yz_FishConfig_LineTree.ContainsKey(str))
{
//yz_FishConfig_LineTree[str] = new List<RoomFishDetailConfig>();
if (yz_FishConfig_LineTree[str].Count > 0)
{
var va = yz_FishConfig_LineTree[str][Random.Range(0, yz_FishConfig_LineTree[str].Count)];
va.isCreate = 2;
//yz_FishConfig_LineTree[str].Remove(va);
if (!yz_FishConfig_LineFalse.ContainsKey(str))
{
yz_FishConfig_LineFalse[str] = new List<RoomFishDetailConfig>();
}
yz_FishConfig_LineFalse[str].Add(va);
}
}
2026-04-03 18:32:19 +08:00
2026-03-27 15:18:35 +08:00
}
yz_Time = Random.Range(1, 6);
yzCount = Random.Range(1, 5);
}
if (pt <= 0)
{
List<RoomFishDetailConfig> list = new List<RoomFishDetailConfig>();
foreach (var item in fishTypeConfig[FishTypeEnum.普通鱼])
{
list.Add(item);
}
var va = RandomUniqueNumbers(ptCount, 0, fishTypeConfig[FishTypeEnum.普通鱼].Count);
foreach (var item in va)
{
list[item].isCreate = 2;
}
pt = 3;
ptCount = Random.Range(1, 4);
}
2026-02-03 11:35:19 +08:00
// 主线程执行生成
for (int i = 0; i < spawnList.Count; i++)
{
2026-03-27 15:18:35 +08:00
2026-02-03 11:35:19 +08:00
if (shouldSpawn[i] == 1)
{
2026-03-27 15:18:35 +08:00
2026-02-03 11:35:19 +08:00
var fish = spawnList[i];
2026-03-27 15:18:35 +08:00
if (fish.isCreate == 0)
2026-03-09 09:25:01 +08:00
{
2026-03-27 15:18:35 +08:00
fish.isCreate = 1;
if (fish.type == 2)
2026-03-18 17:26:14 +08:00
{
2026-03-27 15:18:35 +08:00
var yz = GameManager.Instance.gameConfig.fishArrayConfigs.Find(a => a.fishArrayNumber == fish.fishNumber);
2026-03-18 17:26:14 +08:00
2026-03-27 15:18:35 +08:00
yz_FishConfig_LineFalse[yz.arrayNumber].Remove(fish);
yz_FishConfig_LineTree[yz.arrayNumber].Add(fish);
}
}
if (fish.isCreate == 2)
{
2026-03-09 09:25:01 +08:00
{
2026-03-27 15:18:35 +08:00
List<int> list;
int pathId;
if (fish.type == 2)
2026-03-09 09:25:01 +08:00
{
2026-03-27 15:18:35 +08:00
//list = FishYZ.dicfishYZ[GameManager.Instance.gameConfig.fishArrayConfigs. fish.fishNumber];
pathId = 0;
2026-03-09 09:25:01 +08:00
}
2026-03-27 15:18:35 +08:00
else
{
list = FishDatas[fish.fishNumber].pathList;
2026-03-09 09:25:01 +08:00
2026-03-27 15:18:35 +08:00
pathId = list[Random.Range(0, list.Count)];
}
SyncGameData sgd = new SyncGameData
{
sitPos = GameManager.Instance.gameData.roomJoinNotice.position,
frameType = FrameDataType.createFish,
time = BeijingTimeManager.Instance.CurrentTimestampMs,
frameData = new FrameData_CreateFish
{
fishNumber = fish.fishNumber,
guid = Guid.NewGuid().ToString(),
moveLineId = pathId.ToString()
}
};
WebSocketSendList.SyncGameData(sgd);
}
fish.isCreate = 0;
shouldSpawn[i] = 0;
2026-03-09 09:25:01 +08:00
}
2026-03-27 15:18:35 +08:00
2026-03-09 09:25:01 +08:00
//SpawnFishMainThread(fish);
2026-02-03 11:35:19 +08:00
}
}
}
2026-03-09 09:25:01 +08:00
public void CreateFish(SyncGameData syncGameData)
{
//if (syncGameData.sitPos == GameManager.Instance.gameData.roomJoinNotice.position)
{
var rotateData = JsonConvert.DeserializeObject<FrameData_CreateFish>(syncGameData.frameData.ToString());
2026-03-18 17:26:14 +08:00
SpawnFishMainThread(rotateData, syncGameData.time);
2026-03-09 09:25:01 +08:00
}
}
2026-03-27 15:18:35 +08:00
private async void SpawnFishMainThread(FrameData_CreateFish createFishData, long time)
2026-02-03 11:35:19 +08:00
{
2026-03-27 15:18:35 +08:00
RoomFishDetailConfig cfg = spawnDic[createFishData.fishNumber];
if (cfg.type == 1)
2026-02-03 11:35:19 +08:00
{
2026-03-27 15:18:35 +08:00
bool flowControl = OnlyFish(createFishData, time);
2026-02-03 11:35:19 +08:00
if (!flowControl)
{
return;
}
}
2026-03-27 15:18:35 +08:00
else if (cfg.type == 2)
2026-02-03 11:35:19 +08:00
{
//cfg.fishNumber;3
2026-04-03 18:32:19 +08:00
if (fishArrayConfigDic.TryGetValue(cfg.fishNumber, out var yz))
2026-02-09 10:44:38 +08:00
{
2026-04-03 18:32:19 +08:00
2026-02-09 10:44:38 +08:00
}
FishTypeConfig fishType = null;
2026-04-03 18:32:19 +08:00
if (fishTypeConfigDic.TryGetValue(yz.fishNumber, out var ft))
2026-02-09 10:44:38 +08:00
{
2026-04-03 18:32:19 +08:00
fishType = ft;
2026-02-09 10:44:38 +08:00
}
2026-02-03 11:35:19 +08:00
// 3. 出生点
Vector3 pos = new Vector3(
9999, 9999, 0
);
2026-03-27 15:18:35 +08:00
var prefab = FishResourcesData.GetFishPrefab(int.Parse(fishType.fishNumber));
2026-02-03 11:35:19 +08:00
2026-02-09 10:44:38 +08:00
int pathId = 0;
int count = 0;
2026-04-03 18:32:19 +08:00
count = yz.fishCount;
2026-02-09 10:44:38 +08:00
List<int> list = new List<int>();
switch (yz.arrayNumber.Substring(0, 3))
2026-02-03 11:35:19 +08:00
{
2026-02-09 10:44:38 +08:00
case "700":
list = FishYZ.dicfishYZ[yz.arrayNumber];
2026-04-03 18:32:19 +08:00
StartCoroutine(IeShanXing(createFishData, yz, pos, prefab, list, time, count));
2026-02-09 10:44:38 +08:00
break;
case "701":
list = FishYZ.dicfishYZ[yz.arrayNumber];
foreach (var item in list)
2026-03-27 15:18:35 +08:00
Quan(createFishData, yz, pos, prefab, item, count, time);
2026-02-09 10:44:38 +08:00
break;
case "702":
list = FishYZ.dicfishYZ[yz.arrayNumber];
foreach (var item in list)
2026-02-03 11:35:19 +08:00
{
2026-04-03 18:32:19 +08:00
StartCoroutine(YZ7007(createFishData, yz, pos, prefab, item, time, count));
2026-02-09 10:44:38 +08:00
}
break;
2026-03-27 15:18:35 +08:00
2026-02-09 10:44:38 +08:00
case "7007":
list = FishYZ.dicfishYZ[yz.arrayNumber];
foreach (var item in list)
{
2026-04-03 18:32:19 +08:00
StartCoroutine(YZ7007(createFishData, yz, pos, prefab, item, time, count));
2026-02-03 11:35:19 +08:00
}
break;
2026-03-27 15:18:35 +08:00
case "710":
list = FishYZ.dicfishYZ[yz.arrayNumber];
2026-04-03 18:32:19 +08:00
StartCoroutine(YZ7007(createFishData, yz, pos, prefab, list[Random.Range(0, list.Count)], time, count));
2026-03-27 15:18:35 +08:00
break;
2026-02-03 11:35:19 +08:00
default:
break;
}
2026-03-27 15:18:35 +08:00
2026-02-03 11:35:19 +08:00
//// 4. 实例化
//GameObject fish = Instantiate(prefab, pos, Quaternion.identity, fishRoot);
//var v = fish.GetComponent<MonsterContral>();
}
2026-03-27 15:18:35 +08:00
2026-02-03 11:35:19 +08:00
}
2026-04-03 18:32:19 +08:00
IEnumerator IeShanXing(FrameData_CreateFish createFishData, FishArrayConfig yz, Vector3 pos, GameObject prefab, List<int> list, long time, int count)
2026-02-09 10:44:38 +08:00
{
2026-03-18 17:26:14 +08:00
RoomFishDetailConfig cfg = spawnDic[createFishData.fishNumber];
2026-02-09 10:44:38 +08:00
foreach (var item in list)
{
2026-03-27 15:18:35 +08:00
ShanXing(createFishData, yz, pos, prefab, item, count, time);
2026-02-09 10:44:38 +08:00
yield return new WaitForSeconds(0.8f);
}
}
2026-03-27 15:18:35 +08:00
private void ShanXing(FrameData_CreateFish createFishData, FishArrayConfig yz, Vector3 pos, GameObject prefab, int pathId, int count, long time)
2026-02-09 10:44:38 +08:00
{
2026-03-18 17:26:14 +08:00
RoomFishDetailConfig cfg = spawnDic[createFishData.fishNumber];
2026-02-09 10:44:38 +08:00
for (int i = 1; i <= 16; i++)
{
2026-03-27 15:18:35 +08:00
2026-02-09 10:44:38 +08:00
// 4. 实例化
2026-03-27 15:18:35 +08:00
GameObject fish = Instantiate(prefab, pos, Quaternion.Euler((i * 5 * (i % 2 == 0 ? -1 : 1)) * Vector3.forward + prefab.transform.eulerAngles), fishRoot);
2026-02-09 10:44:38 +08:00
var v = fish.GetComponent<MonsterContral>();
v.monsterData.fishTypeConfig = FishDatas[yz.fishNumber];
2026-03-27 15:18:35 +08:00
v.guid = createFishData.guid + i;
2026-03-09 09:25:01 +08:00
fishDatas_hashCodekey[v.guid] = v;
2026-03-27 15:18:35 +08:00
v.moveTime = (BeijingTimeManager.Instance.CurrentTimestampMs - time) / 1000;
2026-02-09 10:44:38 +08:00
//int pathId = list[Random.Range(0, list.Count)];
2026-03-18 17:26:14 +08:00
v.Init(pathId.ToString(), cfg.times, true, yz.arrayNumber);
2026-02-09 10:44:38 +08:00
}
}
2026-03-27 15:18:35 +08:00
private void Quan(FrameData_CreateFish createFishData, FishArrayConfig yz, Vector3 pos, GameObject prefab, int pathId, int count, long time)
2026-02-09 10:44:38 +08:00
{
2026-03-18 17:26:14 +08:00
RoomFishDetailConfig cfg = spawnDic[createFishData.fishNumber];
2026-02-09 10:44:38 +08:00
for (int i = 0; i < count; i++)
{
// 4. 实例化
2026-03-12 10:48:53 +08:00
GameObject fish = Instantiate(prefab, pos, Quaternion.Euler((360 / count) * i * Vector3.forward + prefab.transform.eulerAngles), fishRoot);
2026-02-09 10:44:38 +08:00
var v = fish.GetComponent<MonsterContral>();
v.monsterData.fishTypeConfig = FishDatas[yz.fishNumber];
2026-03-10 15:36:10 +08:00
v.guid = createFishData.guid + i;
2026-03-09 09:25:01 +08:00
fishDatas_hashCodekey[v.guid] = v;
2026-03-18 17:26:14 +08:00
v.moveTime = (BeijingTimeManager.Instance.CurrentTimestampMs - time) / 1000;
2026-02-09 10:44:38 +08:00
//int pathId = list[Random.Range(0, list.Count)];
2026-03-18 17:26:14 +08:00
v.Init(pathId.ToString(), cfg.times, true, yz.arrayNumber);
2026-02-09 10:44:38 +08:00
}
}
//顺序出
2026-04-03 18:32:19 +08:00
IEnumerator YZ7007(FrameData_CreateFish createFishData, FishArrayConfig yz, Vector3 pos, GameObject prefab, int pathId, long time, int count)
2026-02-09 10:44:38 +08:00
{
2026-03-18 17:26:14 +08:00
RoomFishDetailConfig cfg = spawnDic[createFishData.fishNumber];
2026-02-09 10:44:38 +08:00
List<int> list = FishDatas[yz.fishNumber].pathList;
2026-03-27 15:18:35 +08:00
for (int i = 0; i < count; i++)
2026-02-09 10:44:38 +08:00
{
2026-03-27 15:18:35 +08:00
2026-02-09 10:44:38 +08:00
//// 4. 实例化
//GameObject fish = Instantiate(prefab, pos, Quaternion.Euler((360 / 20) * i * Vector3.forward), fishRoot);
//var v = fish.GetComponent<MonsterContral>();
//v.monsterData.roomFishDetailConfig = cfg;
//v.hashCode = v.gameObject.GetHashCode().ToString();
//fishDatas_hashCodekey[v.hashCode] = v;
////int pathId = list[Random.Range(0, list.Count)];
//v.Init(MonsterMoveLine.dic_BezierCurveDatas["鱼阵" + (pathId + 1)], 15, true, cfg.fishNumber);
//v.fishType = (FishTypeEnum)FishDatas[yz.fishNumber].fishType;
2026-03-27 15:18:35 +08:00
2026-02-09 10:44:38 +08:00
// 4. 实例化
2026-03-12 10:48:53 +08:00
GameObject fish = Instantiate(prefab, pos, prefab.transform.rotation, fishRoot);
2026-02-09 10:44:38 +08:00
var v = fish.GetComponent<MonsterContral>();
// 5. 初始化路径
if (v == null)
{
v = fish.AddComponent<MonsterContral>();
}
v.monsterData.fishTypeConfig = FishDatas[yz.fishNumber];
2026-03-27 15:18:35 +08:00
v.guid = createFishData.guid + i;
v.moveTime = ((BeijingTimeManager.Instance.CurrentTimestampMs - time) / 1000) - i;
2026-03-18 17:26:14 +08:00
2026-03-09 09:25:01 +08:00
fishDatas_hashCodekey[v.guid] = v;
2026-03-27 15:18:35 +08:00
v.Init(pathId.ToString(), cfg.times, true, yz.arrayNumber);
yield return new WaitForSeconds(1f);
2026-02-09 10:44:38 +08:00
}
}
2026-03-27 15:18:35 +08:00
private bool OnlyFish(FrameData_CreateFish createFishData, long time)
2026-02-03 11:35:19 +08:00
{
2026-03-18 17:26:14 +08:00
RoomFishDetailConfig cfg = spawnDic[createFishData.fishNumber];
2026-02-03 11:35:19 +08:00
// 1. 找到鱼的基础配置
2026-04-03 18:32:19 +08:00
//FishTypeConfig fishType = M_GameConfig.fishTypeConfigs
// .Find(f => f.fishNumber == cfg.fishNumber);
// ====== 修改点:用字典替代 List.Find ======
if (!fishTypeConfigDic.TryGetValue(cfg.fishNumber, out var fishType))
2026-02-03 11:35:19 +08:00
{
Debug.LogError($"找不到鱼配置:{cfg.fishNumber}");
return false;
}
2026-04-03 18:32:19 +08:00
//if (fishType == null)
//{
// Debug.LogError($"找不到鱼配置:{cfg.fishNumber}");
// return false;
//}
2026-02-03 11:35:19 +08:00
// 2. 加载 Prefab(imageUrl 你可以换成自己的字段)
//var prefab = await Addressables.LoadAssetAsync<GameObject>(fishType.imageUrl).Task;
2026-03-27 15:18:35 +08:00
var prefab = FishResourcesData.GetFishPrefab(int.Parse(fishType.fishNumber));
2026-02-03 11:35:19 +08:00
// 3. 出生点
Vector3 pos = new Vector3(
9999, 9999, 0
);
// 4. 实例化
2026-03-12 10:48:53 +08:00
GameObject fish = Instantiate(prefab, pos, prefab.transform.rotation, fishRoot);
2026-02-03 11:35:19 +08:00
var v = fish.GetComponent<MonsterContral>();
// 5. 初始化路径
if (v == null)
{
v = fish.AddComponent<MonsterContral>();
}
2026-02-09 10:44:38 +08:00
v.monsterData.fishTypeConfig = FishDatas[cfg.fishNumber];
2026-03-10 15:36:10 +08:00
v.guid = createFishData.guid;
2026-03-18 17:26:14 +08:00
v.moveTime = (BeijingTimeManager.Instance.CurrentTimestampMs - time) / 1000;
2026-03-10 15:36:10 +08:00
2026-03-09 09:25:01 +08:00
fishDatas_hashCodekey[v.guid] = v;
2026-02-03 11:35:19 +08:00
var list = FishDatas[cfg.fishNumber].pathList;
2026-03-18 17:26:14 +08:00
string pathId = createFishData.moveLineId;
2026-03-27 15:18:35 +08:00
v.Init(pathId, cfg.times);
2026-02-03 11:35:19 +08:00
//v.monsterData.moveLine.Init(MonsterMoveLine.dic_BezierCurveDatas["曲线" + Random.Range(1, 4).ToString()], 10);
////初始化
//GameObject obj = Instantiate(prefab, Vector3.one * 999, Quaternion.identity);
//var v = obj.GetComponent<MonsterControl>();
////v.dic_AnimKeyAnimName.Add(CharacterAnimationType.move, "stand2");
//v.monsterData.moveLine.Init(MonsterMoveLine.dic_BezierCurveDatas["曲线" + Random.Range(1, 4).ToString()], 10);
Debug.Log($"生成鱼:{fishType.fishName}");
return true;
}
public void CreateFishArray(string arrayNumber)
{
var array = M_GameConfig.fishArrayConfigs
.Find(a => a.fishArrayNumber == arrayNumber);
if (array == null)
{
Debug.LogError($"找不到鱼阵:{arrayNumber}");
return;
}
// 未来扩展:阵型、路径、Boss、普通鱼
2026-03-27 15:18:35 +08:00
//// array.ty.fishNumber
2026-02-03 11:35:19 +08:00
2026-03-27 15:18:35 +08:00
// // 2. 加载 Prefab(imageUrl 你可以换成自己的字段)
// //var prefab = await Addressables.LoadAssetAsync<GameObject>(fishType.imageUrl).Task;
// var prefab = FishResourcesData.CreateFishPrefab(fishType.fishNumber);
2026-02-03 11:35:19 +08:00
2026-03-27 15:18:35 +08:00
// // 3. 随机出生点
// Vector3 pos = new Vector3(
// Random.Range(-8f, 8f),
// Random.Range(-5f, 5f),
// 0
// );
2026-02-03 11:35:19 +08:00
2026-03-27 15:18:35 +08:00
// // 4. 实例化
// GameObject fish = Instantiate(prefab, pos, Quaternion.identity, fishRoot);
// var v = fish.GetComponent<MonsterContral>();
// // 5. 初始化路径
// if (v == null)
// {
// v = fish.
//
//
// <MonsterContral>();
// }
// v.monsterData.roomFishDetailConfig = cfg;
// v.hashCode = v.gameObject.GetHashCode().ToString();
// fishDatas_hashCodekey[v.hashCode] = v;
// var list = FishDatas[cfg.fishNumber].pathList;
// int pathId = list[Random.Range(0, list.Count)];
// v.monsterData.moveLine.Init(MonsterMoveLine.dic_BezierCurveDatas["曲线" + pathId], 10);
// v.fishType = (FishTypeEnum)FishDatas[cfg.fishNumber].fishType;
// //v.monsterData.moveLine.Init(MonsterMoveLine.dic_BezierCurveDatas["曲线" + Random.Range(1, 4).ToString()], 10);
// ////初始化
// //GameObject obj = Instantiate(prefab, Vector3.one * 999, Quaternion.identity);
// //var v = obj.GetComponent<MonsterControl>();
// ////v.dic_AnimKeyAnimName.Add(CharacterAnimationType.move, "stand2");
2026-02-03 11:35:19 +08:00
2026-03-27 15:18:35 +08:00
// //v.monsterData.moveLine.Init(MonsterMoveLine.dic_BezierCurveDatas["曲线" + Random.Range(1, 4).ToString()], 10);
// Debug.Log($"生成鱼:{fishType.fishName}");
2026-02-03 11:35:19 +08:00
}
public void EnterRoom(GameTypeEnum gameType)
{
InitSpawnSystem(gameType);
}
public void ExitRoom()
{
CloseSpawnSystem();
}
// ============================================================
// 1. 生成单条鱼
// ============================================================
public async void CreateSingleFish(string fishNumber, int pathId)
{
switch ((GameTypeEnum)GameManager.Instance.gameData.currGameType)
{
case GameTypeEnum.风雷之渊:
break;
case GameTypeEnum.太古仙墟:
break;
case GameTypeEnum.中国象棋:
break;
case GameTypeEnum.星际迷航:
break;
case GameTypeEnum.黑神话悟空:
break;
default:
break;
}
}
2026-03-31 17:00:05 +08:00
public void Id_DieFish(string fishId)
{
if (fishDatas_hashCodekey.ContainsKey(fishId))
{
var monster = fishDatas_hashCodekey[fishId];
2026-04-03 09:28:13 +08:00
monster.DieFish();
//Destroy(monster.gameObject);
2026-03-31 17:00:05 +08:00
fishDatas_hashCodekey.Remove(fishId);
}
2026-04-03 18:32:19 +08:00
}
2026-03-31 17:00:05 +08:00
public void Ws_DieFish(string msg)
2026-02-03 11:35:19 +08:00
{
var killFish = JsonConvert.DeserializeObject<WebSocketResponseBase<RoomKillNotice>>(msg).arguments[0];
2026-02-09 10:44:38 +08:00
Debug.Log("时间123:" + (DateTimeOffset.Now.ToUnixTimeSeconds() - killFish.timespan) + "秒");
2026-02-03 11:35:19 +08:00
if (fishDatas_hashCodekey.ContainsKey(killFish.fishId))
{
2026-03-27 15:18:35 +08:00
AudioManager.Instance.PlayerFX(60004);
2026-02-03 11:35:19 +08:00
var monster = fishDatas_hashCodekey[killFish.fishId];
Instantiate(monster.effect_Die == null ? dieFXPrefab : monster.effect_Die, monster.transform.position, Quaternion.identity, transform.parent);
2026-03-27 15:18:35 +08:00
MonsterDieList.Instance.SmallHuangYiHuang(monster.transform.position, monster.monsterData.fishTypeConfig.fishNumber, 1000);
2026-04-03 09:28:13 +08:00
//Destroy(monster.gameObject);
monster.DieFish();
2026-02-03 11:35:19 +08:00
fishDatas_hashCodekey.Remove(killFish.fishId);
2026-03-27 15:18:35 +08:00
2026-02-09 10:44:38 +08:00
//GameManager.Instance.gameData.roomJoinNotice.gold += killFish.gold;
var list = UIManager.Instance.Get<GameMainPanel_XJMH>(UIPanel.MainGamePanelXJMH).list_Sits;
foreach (var item in list)
{
2026-03-27 15:18:35 +08:00
if (item.user != null)
2026-02-09 10:44:38 +08:00
{
2026-03-27 15:18:35 +08:00
if (item.user == killFish.userId)
2026-02-09 10:44:38 +08:00
{
2026-03-27 15:18:35 +08:00
item.goldNum += killFish.gold;
2026-02-09 10:44:38 +08:00
}
}
}
2026-02-03 11:35:19 +08:00
}
}
2026-03-27 15:18:35 +08:00
2026-02-03 11:35:19 +08:00
}