NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Team/TeamPreviewNode.cs

494 lines
14 KiB
C#
Raw Normal View History

2023-10-19 15:00:19 +08:00
using System;
2024-10-15 13:53:47 +08:00
using PhxhSDK;
using Gameplay;
2024-10-15 13:53:47 +08:00
using Framework;
using System.Linq;
using UnityEngine;
using Gameplay.Emoji;
using Gameplay.Utils;
2024-10-15 13:53:47 +08:00
using Gameplay.Common;
using Gameplay.Performance;
using UnityEngine.Playables;
2024-10-15 13:53:47 +08:00
using Cysharp.Threading.Tasks;
using System.Collections.Generic;
using Random = UnityEngine.Random;
2024-10-15 13:53:47 +08:00
using Constants = Framework.Constants;
2023-10-19 15:00:19 +08:00
2024-10-08 18:55:13 +08:00
public class TeamPreviewNode : MonoBehaviour
2023-10-19 15:00:19 +08:00
{
2024-10-15 13:53:47 +08:00
private const string VehicleBatteryPointName = "Battery_point01";
2023-10-19 15:00:19 +08:00
public Transform[] characterPos;
2024-10-11 15:22:03 +08:00
public Transform[] vehiclesPos;
2023-10-19 15:00:19 +08:00
public Transform cRoot;
public Transform vRoot;
public struct CharAddData
{
public uint ID;
public int Idx;
}
2024-10-11 15:22:03 +08:00
public struct VehicleAddData
{
public uint ID;
public int Idx;
}
2023-10-19 15:00:19 +08:00
public RenderTexture RTexture => _rTexture;
2024-10-11 15:22:03 +08:00
private Dictionary<int, GameObject> _vehicleDic;
2023-10-19 15:00:19 +08:00
private Dictionary<int, GameObject> _characterDic;
2024-10-11 15:22:03 +08:00
private uint[] _vehicleIDs;
2023-10-19 15:00:19 +08:00
private uint[] _charIDs;
private bool _isLoading;
private int _teamIdx;
private bool _isReleasing;
2023-10-19 15:00:19 +08:00
private RenderTexture _rTexture;
2024-02-23 14:24:57 +08:00
private Dictionary<string, int> _assetsLoadDic = new Dictionary<string, int>();
private List<UnitEmojiManager> _emojiMgrList = new List<UnitEmojiManager>();
2024-10-11 15:22:03 +08:00
#region Static
2023-10-19 15:00:19 +08:00
public static async UniTask<TeamPreviewNode> LoadNode()
{
var prefab = await AssetManager.Instance.LoadAssetAsync<GameObject>(Constants.TEAM_EDIT_PREFAB_PATH);
var go = Instantiate(prefab, Vector3.up, Quaternion.identity);
var component = go.GetComponent<TeamPreviewNode>();
2024-10-08 18:55:13 +08:00
2023-10-19 15:00:19 +08:00
return component;
}
public static void ReleaseNode(TeamPreviewNode node)
{
node.ReleaseRt();
2023-10-19 15:00:19 +08:00
Destroy(node.gameObject);
}
2024-10-11 15:22:03 +08:00
private void ReleaseRt()
{
if (_rTexture)
{
RenderTexturePool.Instance.Destroy(_rTexture);
_rTexture = null;
}
}
#endregion
#region MainLife
private void Awake()
{
_characterDic = new Dictionary<int, GameObject>();
_vehicleDic = new Dictionary<int, GameObject>();
2024-10-11 15:22:03 +08:00
EventManager.Instance.Register(EventManager.EventName.TeamEditCharacterModelCreate,
(Action<CharAddData>)OnCharModelCreate);
EventManager.Instance.Register(EventManager.EventName.TeamEditCharacterModelClear,
(Action<int>)OnCharModelClear);
EventManager.Instance.Register(EventManager.EventName.TeamEditVehicleModelCreate,
(Action<VehicleAddData>)OnVehicleModelCreate);
EventManager.Instance.Register(EventManager.EventName.TeamEditVehicleModelClear,
(Action<int>)OnVehicleModelClear);
EventManager.Instance.Register(EventManager.EventName.TeamEditAllModelClear, ClearAllGo);
2024-10-12 18:29:02 +08:00
EventManager.Instance.Register<int>(EventManager.EventName.TeamEditModelUpdate, RefreshNode);
2024-10-11 15:22:03 +08:00
}
private void OnDestroy()
{
EventManager.Instance.Unregister(EventManager.EventName.TeamEditCharacterModelCreate,
(Action<CharAddData>)OnCharModelCreate);
EventManager.Instance.Unregister(EventManager.EventName.TeamEditCharacterModelClear,
(Action<int>)OnCharModelClear);
EventManager.Instance.Unregister(EventManager.EventName.TeamEditVehicleModelCreate,
(Action<VehicleAddData>)OnVehicleModelCreate);
EventManager.Instance.Unregister(EventManager.EventName.TeamEditVehicleModelClear,
(Action<int>)OnVehicleModelClear);
EventManager.Instance.Unregister(EventManager.EventName.TeamEditAllModelClear, ClearAllGo);
2024-10-12 18:29:02 +08:00
EventManager.Instance.Unregister<int>(EventManager.EventName.TeamEditModelUpdate, RefreshNode);
2024-10-11 15:22:03 +08:00
UnLoad();
AssetManager.Instance.Unload(Constants.TEAM_EDIT_PREFAB_PATH);
}
2024-02-23 14:24:57 +08:00
private void UnLoad()
{
foreach (var kv in _assetsLoadDic)
{
var path = kv.Key;
AssetManager.Instance.Unload(path);
}
foreach (var emojiMgr in _emojiMgrList)
{
emojiMgr.Dispose();
}
2024-10-08 18:55:13 +08:00
2024-02-23 14:24:57 +08:00
_emojiMgrList.Clear();
_characterDic.Clear();
_vehicleDic.Clear();
}
private void ClearObjs()
{
cRoot.transform.ClearChilds(true);
vRoot.transform.ClearChilds(true);
_characterDic.Clear();
_vehicleDic.Clear();
2024-02-23 14:24:57 +08:00
}
2024-10-11 15:22:03 +08:00
#endregion
#region 对外方法
2024-10-08 18:55:13 +08:00
/// <summary>
/// 刷新节点
/// </summary>
public async UniTask Refresh()
2023-10-19 15:00:19 +08:00
{
ClearObjs();
2024-10-11 15:22:03 +08:00
var teamCamera = TeamEditCameraObj.Instance.teamEditCamera;
teamCamera.targetTexture = _rTexture;
2024-10-11 15:22:03 +08:00
for (var i = 0; i < _charIDs.Length; i++)
2023-10-19 15:00:19 +08:00
{
var dataDic = CharacterDataInfoManager.Instance.DataDic;
2024-10-11 15:22:03 +08:00
var id = _charIDs[i];
var isValid = dataDic.ContainsKey(id);
2023-10-19 15:00:19 +08:00
if (isValid)
{
var trans = characterPos[i];
if (!_isLoading)
{
_isLoading = true;
await AddCharacterGo(trans, id, i);
}
}
}
2024-10-08 18:55:13 +08:00
2024-10-11 15:22:03 +08:00
for (var i = 0; i < _vehicleIDs.Length; i++)
2023-10-19 15:00:19 +08:00
{
2024-10-11 15:22:03 +08:00
var dataDic = VehicleCultivateDataManager.Instance.DataDic;
var id = _vehicleIDs[i];
var isValid = dataDic.ContainsKey(id);
2023-10-19 15:00:19 +08:00
if (isValid)
{
2024-10-11 15:22:03 +08:00
var trans = vehiclesPos[i];
2023-10-19 15:00:19 +08:00
if (!_isLoading)
{
_isLoading = true;
2024-10-11 15:22:03 +08:00
await AddVehicleGo(trans, id, i);
2023-10-19 15:00:19 +08:00
}
}
}
2024-10-08 18:55:13 +08:00
2024-10-11 15:22:03 +08:00
_isLoading = false;
2023-10-19 15:00:19 +08:00
}
public void SetData(int teamIdx, uint[] charIDs, uint[] vehicleIDs)
{
_teamIdx = teamIdx;
_charIDs = (uint[])charIDs.Clone();
_vehicleIDs = vehicleIDs;
}
public void CreateRt()
{
if (!_rTexture)
{
2024-10-08 18:55:13 +08:00
_rTexture = RenderTexturePool.Instance.Create("TeamPreviewNode",
PerformanceManager.instance.fullScreenWidth,
PerformanceManager.instance.fullScreenHeight);
}
}
2024-10-11 15:22:03 +08:00
public void Clear()
2023-10-19 15:00:19 +08:00
{
2024-10-11 15:22:03 +08:00
ClearAllGo();
_rTexture.Release();
2023-10-19 15:00:19 +08:00
}
2024-10-08 18:55:13 +08:00
2024-10-11 15:22:03 +08:00
#endregion
2024-10-08 18:55:13 +08:00
2024-10-11 15:22:03 +08:00
#region 加载模型
2024-10-08 18:55:13 +08:00
2023-10-19 15:00:19 +08:00
/// <summary>
/// 添加角色模型
/// </summary>
async UniTask AddCharacterGo(Transform trans, uint id, int idx)
{
var charData = CharacterDataInfoManager.Instance.DataDic[id];
var charCfg = charData.Cfg;
var skinID = charData.SkinID > 0 ? (int)charData.SkinID : Constants.DEFULT_SKINID;
var data = TableManager.Instance.Tables.SkinCfg.Get(skinID, charCfg.RoleID);
2023-10-19 15:00:19 +08:00
if (data != null)
{
2024-01-15 12:39:20 +08:00
var prefabPath = PathEx.GetCharacterDisplayModelPath(data.NameID);
var prefab = await AssetManager.Instance.LoadAssetAsync<GameObject>(prefabPath);
2024-02-23 14:24:57 +08:00
_assetsLoadDic.TryAdd(prefabPath, (int)id);
if (!trans)
{
return;
}
2024-10-08 18:55:13 +08:00
2023-10-19 15:00:19 +08:00
var go = Instantiate(prefab, trans.position, trans.rotation, cRoot.transform);
if (go)
{
2024-10-11 15:22:03 +08:00
_characterDic[idx] = go;
2023-10-19 15:00:19 +08:00
go.SetLayerEx(LayerDefine.TeamEdit);
var anim = CommonUtils.GetChildComponent<Animator>(go);
var playableDir = go.GetComponent<PlayableDirector>();
if (playableDir)
{
playableDir.enabled = false;
}
2024-10-08 18:55:13 +08:00
2023-10-19 15:00:19 +08:00
if (anim)
{
int randomIdx = Random.Range(0, 3);
// if (idx < 2 || idx > 4)
// {
// anim.Play("standready001");
// }
// else
// {
// anim.Play("squatready001");
// }
switch (randomIdx)
2023-10-19 15:00:19 +08:00
{
case 1:
{
anim.Play("standready001");
break;
}
case 2:
{
anim.Play("standready001");
break;
}
default:
{
anim.Play("squatready001");
break;
}
2023-10-19 15:00:19 +08:00
}
}
var charDataCfg = TableManager.Instance.Tables.CharacterAttri;
if (charDataCfg.DataMap.TryGetValue((int)id, out var charSingleData))
{
var emojiMgr = new UnitEmojiManager(go, charSingleData.EmojiEyesColor,
2024-06-18 16:52:21 +08:00
charSingleData.EmojiEyeBowsType, charSingleData.EmojiEyeBowsColor);
emojiMgr.SwitchEmoji(charSingleData.DefaultDisplayEmojiId);
2024-02-23 14:24:57 +08:00
_emojiMgrList.Add(emojiMgr);
}
2023-10-19 15:00:19 +08:00
}
}
_isLoading = false;
}
/// <summary>
2024-10-11 15:22:03 +08:00
/// 添加载具模型
2023-10-19 15:00:19 +08:00
/// </summary>
2024-10-11 15:22:03 +08:00
async UniTask AddVehicleGo(Transform trans, uint id, int idx)
2023-10-19 15:00:19 +08:00
{
var vehicleDataDic = VehicleCultivateDataManager.Instance.DataDic;
if (vehicleDataDic.TryGetValue(id, out var vehicleData))
{
if (vehicleData != null)
{
var prefabPath = PathEx.GetVehicleGameModelPath(vehicleData.Cfg.ID);
var prefab = await AssetManager.Instance.LoadAssetAsync<GameObject>(prefabPath);
2024-02-23 14:24:57 +08:00
_assetsLoadDic.TryAdd(prefabPath, (int)id);
2024-10-11 15:22:03 +08:00
if (!trans) return;
2024-10-08 18:55:13 +08:00
2023-10-19 15:00:19 +08:00
var go = Instantiate(prefab, trans.position, trans.rotation, vRoot.transform);
if (go)
{
2024-10-11 15:22:03 +08:00
_vehicleDic[idx] = go;
2023-10-19 15:00:19 +08:00
go.SetLayerEx(LayerDefine.TeamEdit);
go.transform.localScale = new Vector3(1.5f, 1.5f, 1.5f);
2024-10-15 13:53:47 +08:00
// 炮台部分
var config = VehicleDataHelper.CombineConfigData(vehicleData);
// 炮台挂点
var allTrans = go.GetComponentsInChildren<Transform>();
var fireTrans = allTrans.First(t => t.name == VehicleBatteryPointName);
2024-10-15 13:53:47 +08:00
var rawConfig = TableManager.Instance.Tables.BatteryConfig.GetOrDefault(config.weaponId);
var batteryPath = PathEx.GetBatteryModelPath(rawConfig.ModelPath);
2024-10-15 13:53:47 +08:00
var sampleObj = await AssetManager.Instance.LoadAssetAsync<GameObject>(batteryPath);
if (sampleObj != null)
{
sampleObj.SetLayerEx(LayerDefine.TeamEdit);
var rootObj = Instantiate(sampleObj, fireTrans);
rootObj.transform.ResetLocals();
}
else
{
DebugUtil.LogError("加载炮台失败: {0}", batteryPath);
}
2023-10-19 15:00:19 +08:00
}
}
}
_isLoading = false;
}
2024-10-11 15:22:03 +08:00
/// <summary>
/// 根据索引加载角色模型
/// </summary>
private async UniTask LoadCharacterModel(uint id, int idx)
2023-10-19 15:00:19 +08:00
{
2024-10-12 18:29:02 +08:00
// DebugUtil.LogError("需要在:{0}加上{1}角色", idx, id);
2024-10-11 15:22:03 +08:00
if (idx < 0) return;
2024-10-12 11:49:08 +08:00
if (_isLoading) return;
2024-10-11 15:22:03 +08:00
if (_charIDs[idx] != id)
2023-10-19 15:00:19 +08:00
{
2024-10-11 15:22:03 +08:00
ClearCharacterGo(idx);
_charIDs[idx] = id;
2024-10-12 11:49:08 +08:00
_isLoading = true;
2024-10-11 15:22:03 +08:00
await AddCharacterGo(characterPos[idx], id, idx);
2023-10-19 15:00:19 +08:00
}
2024-10-11 15:22:03 +08:00
}
2023-10-19 15:00:19 +08:00
2024-10-11 15:22:03 +08:00
/// <summary>
/// 根据索引加载载具模型
/// </summary>
private async UniTask LoadVehicleModel(uint id, int idx)
{
//DebugUtil.LogError("需要在:{0}加上{1}载具", idx, id);
if (idx < 0) return;
2024-10-12 11:49:08 +08:00
if (_isLoading) return;
2024-10-11 15:22:03 +08:00
if (_vehicleIDs[idx] != id)
{
ClearVehicleGo(idx);
_vehicleIDs[idx] = id;
2024-10-12 11:49:08 +08:00
_isLoading = true;
2024-10-11 15:22:03 +08:00
await AddVehicleGo(vehiclesPos[idx], id, idx);
}
2023-10-19 15:00:19 +08:00
2024-10-11 15:22:03 +08:00
/*DebugUtil.LogError("添加完{0}位置,载具的关系:-------", idx);
for (int i = 0; i < _vehicleIDs.Length; i++)
{
DebugUtil.LogError("{0}位置是{1}", i, _vehicleIDs[i]);
}
DebugUtil.LogError("-----------------------");*/
2023-10-19 15:00:19 +08:00
}
2024-10-08 18:55:13 +08:00
2024-10-11 15:22:03 +08:00
#endregion
2024-10-08 18:55:13 +08:00
2024-10-11 15:22:03 +08:00
#region 清除模型
2024-10-08 18:55:13 +08:00
/// <summary>
2024-10-11 15:22:03 +08:00
/// 指挥官清空后使用
2024-10-08 18:55:13 +08:00
/// </summary>
2024-10-11 15:22:03 +08:00
private void ClearAllGo()
2024-10-08 18:55:13 +08:00
{
2024-10-11 15:22:03 +08:00
for (int i = 0; i < characterPos.Length; i++)
2024-10-08 18:55:13 +08:00
{
2024-10-11 15:22:03 +08:00
ClearCharacterGo(i);
}
for (int i = 0; i < vehiclesPos.Length; i++)
{
ClearVehicleGo(i);
}
}
private void ClearCharacterGo(int idx)
{
if (_isLoading)
{
return;
}
_isLoading = true;
if (_characterDic.TryGetValue(idx, out var go))
{
if (go)
2024-10-08 18:55:13 +08:00
{
2024-10-11 15:22:03 +08:00
DestroyImmediate(go);
2024-10-15 16:30:20 +08:00
_charIDs[idx] = Team.NoneID;
2024-10-11 15:22:03 +08:00
_characterDic.Remove(idx);
2024-10-08 18:55:13 +08:00
}
}
2024-10-11 15:22:03 +08:00
_isLoading = false;
}
private void ClearVehicleGo(int idx)
{
if (_isLoading)
2024-10-08 18:55:13 +08:00
{
2024-10-11 15:22:03 +08:00
return;
}
_isLoading = true;
if (_vehicleDic.TryGetValue(idx, out var go))
{
if (go)
2024-10-08 18:55:13 +08:00
{
2024-10-11 15:22:03 +08:00
DestroyImmediate(go);
2024-10-15 16:30:20 +08:00
_vehicleIDs[idx] = Team.NoneID;
2024-10-11 15:22:03 +08:00
_vehicleDic.Remove(idx);
2024-10-08 18:55:13 +08:00
}
}
2024-10-11 15:22:03 +08:00
_isLoading = false;
2024-10-08 18:55:13 +08:00
}
2024-10-11 15:22:03 +08:00
#endregion
#region 事件监听
private async void RefreshNode(int teamIdx)
{
var team = TeamEditManager.Instance.GetTeamByIndex(teamIdx);
if (team == null) return;
var charIDs = team.GetAllCharacters().ToArray();
var vehicleIDs = team.GetVehicleIDs().ToArray();
SetData(teamIdx, charIDs, vehicleIDs);
await Refresh();
}
2024-10-11 15:22:03 +08:00
private async void OnCharModelCreate(CharAddData charAddData)
2024-10-08 18:55:13 +08:00
{
2024-10-11 15:22:03 +08:00
await LoadCharacterModel(charAddData.ID, charAddData.Idx);
2024-10-08 18:55:13 +08:00
}
2024-10-11 15:22:03 +08:00
private void OnCharModelClear(int idx)
2024-10-08 18:55:13 +08:00
{
2024-10-11 15:22:03 +08:00
if (idx >= 0)
{
ClearCharacterGo(idx);
}
2024-10-08 18:55:13 +08:00
}
2024-10-11 15:22:03 +08:00
private async void OnVehicleModelCreate(VehicleAddData vehicleAddData)
{
await LoadVehicleModel(vehicleAddData.ID, vehicleAddData.Idx);
}
private void OnVehicleModelClear(int idx)
{
if (idx >= 0)
{
ClearVehicleGo(idx);
}
2024-10-08 18:55:13 +08:00
}
#endregion
2023-10-19 15:00:19 +08:00
}