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

693 lines
21 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 UnityEngine;
using UnityEngine.Playables;
2024-10-15 13:53:47 +08:00
using Cysharp.Threading.Tasks;
using System.Collections.Generic;
2025-04-28 20:04:57 +08:00
using System.Linq;
using Framework;
using Random = UnityEngine.Random;
2025-04-28 20:04:57 +08:00
using GameWrapper.Team;
using PhxhSDK;
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";
2025-04-28 20:04:57 +08:00
private const string DEFAULT_SKINID_KEY = "DefaultSkinID";
private const int DEFAULT_SKIN_ID = 1;
2024-10-15 13:53:47 +08:00
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 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>();
2025-04-28 20:04:57 +08:00
private List<object> _emojiMgrList = new List<object>();
2024-02-23 14:24:57 +08:00
2024-10-11 15:22:03 +08:00
#region Static
2023-10-19 15:00:19 +08:00
public static async UniTask<TeamPreviewNode> LoadNode()
{
2025-04-28 20:04:57 +08:00
var prefab = await AssetManager.Instance.LoadAssetAsync<GameObject>(Framework.Constants.TEAM_EDIT_PREFAB_PATH);
2023-10-19 15:00:19 +08:00
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();
2025-03-20 19:34:04 +08:00
node.RestoreOriginalShaders();
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);
EventManager.Instance.Register<ValueTuple<int, bool>>(EventManager.EventName.TeamEditModelUpdate, RefreshNode);
EventManager.Instance.Register(EventManager.EventName.TeamCameraSet, _OnTeamEditCameraSet);
2024-10-11 15:22:03 +08:00
}
2025-04-28 20:04:57 +08:00
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);
2025-03-20 19:34:04 +08:00
EventManager.Instance.Unregister<ValueTuple<int, bool>>(EventManager.EventName.TeamEditModelUpdate,
RefreshNode);
EventManager.Instance.Unregister(EventManager.EventName.TeamCameraSet, _OnTeamEditCameraSet);
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)
{
2025-04-28 20:04:57 +08:00
TeamServiceHandle.CharacterService.DisposeEmojiManager(emojiMgr);
2024-02-23 14:24:57 +08:00
}
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()
{
2025-04-28 20:04:57 +08:00
foreach (Transform child in cRoot)
{
Destroy(child.gameObject);
}
foreach (Transform child in vRoot)
{
Destroy(child.gameObject);
}
_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();
2025-03-20 19:34:04 +08:00
2025-04-28 20:04:57 +08:00
var teamCamera = TeamServiceHandle.TeamEditCameraObj.teamEditCamera;
2024-10-11 15:22:03 +08:00
teamCamera.targetTexture = _rTexture;
2025-03-20 19:34:04 +08:00
2024-10-11 15:22:03 +08:00
for (var i = 0; i < _charIDs.Length; i++)
2023-10-19 15:00:19 +08:00
{
2024-10-11 15:22:03 +08:00
var id = _charIDs[i];
2025-04-28 20:04:57 +08:00
var isValid = TeamServiceHandle.CharacterService.CharacterDataDicContainsKey(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 id = _vehicleIDs[i];
2025-04-28 20:04:57 +08:00
var isValid = TeamServiceHandle.VehicleService.VehicleDataDicContainsKey(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)
{
2025-04-28 20:04:57 +08:00
_rTexture = RenderTexturePool.Instance.Create("TeamPreviewNode", Screen.width,
Screen.height);
}
}
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)
{
2025-04-28 20:04:57 +08:00
var charData = TeamServiceHandle.CharacterService.GetCharacterData(id);
// 获取角色配置信息
var charCfg = GetField<object>(charData, "Cfg");
var skinID = GetField<uint>(charData, "SkinID") > 0
? (int)GetField<uint>(charData, "SkinID")
: GetDefaultSkinId();
var roleID = GetField<int>(charCfg, "RoleID");
var data = TeamServiceHandle.TableService.GetSkinConfig(skinID, roleID);
2023-10-19 15:00:19 +08:00
if (data != null)
{
2025-04-28 20:04:57 +08:00
var nameID = GetField<string>(data, "NameID");
var prefabPath = TeamServiceHandle.CharacterService.GetCharacterDisplayModelPath(nameID);
2024-01-15 12:39:20 +08:00
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;
2025-04-28 20:04:57 +08:00
// TODO 层级优化
go.SetLayerEx(9);
var anim = go.GetComponentInChildren<Animator>();
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);
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
}
}
2025-04-28 20:04:57 +08:00
// 处理角色表情
object charSingleData = null;
if (TeamServiceHandle.TableService.TryGetCharacterAttriData((int)id, out var data2))
{
2025-04-28 20:04:57 +08:00
charSingleData = data2;
var eyesColor = GetField<string>(charSingleData, "EmojiEyesColor");
var eyeBrowsType = GetField<string>(charSingleData, "EmojiEyeBowsType");
var eyeBrowsColor = GetField<string>(charSingleData, "EmojiEyeBowsColor");
var defaultEmojiId = GetField<int>(charSingleData, "DefaultDisplayEmojiId");
var emojiMgr = TeamServiceHandle.CharacterService.CreateEmojiManager(
go, eyesColor, eyeBrowsType, eyeBrowsColor, true);
TeamServiceHandle.CharacterService.SwitchEmoji(emojiMgr, defaultEmojiId);
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
{
2025-04-28 20:04:57 +08:00
var vehicleData = TeamServiceHandle.VehicleService.GetVehicleData(id);
if (vehicleData != null)
2023-10-19 15:00:19 +08:00
{
2025-04-28 20:04:57 +08:00
var vehicleCfg = GetField<object>(vehicleData, "Cfg");
var vehicleId = GetField<int>(vehicleCfg, "ID");
2025-03-20 19:34:04 +08:00
2025-04-28 20:04:57 +08:00
var prefabPath = TeamServiceHandle.VehicleService.GetVehicleGameModelPath(vehicleId);
var prefab = await AssetManager.Instance.LoadAssetAsync<GameObject>(prefabPath);
ApplyVehicleShader(prefab);
2024-10-11 15:22:03 +08:00
2025-04-28 20:04:57 +08:00
_assetsLoadDic.TryAdd(prefabPath, (int)id);
if (!trans) return;
2024-10-08 18:55:13 +08:00
2025-04-28 20:04:57 +08:00
var go = Instantiate(prefab, trans.position, trans.rotation, vRoot.transform);
if (go)
{
_vehicleDic[idx] = go;
// TODO 层级优化
go.SetLayerEx(9);
go.transform.localScale = new Vector3(1.5f, 1.5f, 1.5f);
// 炮台部分
var config = TeamServiceHandle.VehicleService.CombineConfigData(vehicleData);
// 获取武器ID
var weaponId = GetField<long>(config, "weaponId");
// 炮台挂点
var allTrans = go.GetComponentsInChildren<Transform>();
var fireTrans = allTrans.First(t => t.name == VehicleBatteryPointName);
var rawConfig = TeamServiceHandle.TableService.GetBatteryConfig(weaponId);
var modelPath = GetField<string>(rawConfig, "ModelPath");
var batteryPath = TeamServiceHandle.VehicleService.GetBatteryModelPath(modelPath);
var sampleObj = await AssetManager.Instance.LoadAssetAsync<GameObject>(batteryPath);
if (sampleObj != null)
2023-10-19 15:00:19 +08:00
{
2025-04-28 20:04:57 +08:00
var rootObj = UnityEngine.Object.Instantiate(sampleObj, fireTrans);
// TODO 层级优化
go.SetLayerEx(9);
rootObj.transform.localPosition = Vector3.zero;
rootObj.transform.localRotation = Quaternion.identity;
rootObj.transform.localScale = Vector3.one;
}
else
{
Debug.LogError($"加载炮台失败: {batteryPath}");
}
2024-10-15 13:53:47 +08:00
2025-04-28 20:04:57 +08:00
//设置涂装
var vehicleDev = TeamServiceHandle.VehicleService.GetVehicleDevelopment(id);
var paintCfg = GetField<int[]>(vehicleDev, "paint_set");
2025-04-28 20:04:57 +08:00
if (paintCfg != null)
{
for (int i = 1; i < (int)TeamPaintType.Max; i++)
2024-10-15 13:53:47 +08:00
{
2025-04-28 20:04:57 +08:00
var paintID = paintCfg[i];
if (paintID == 0)
continue;
2024-12-26 13:24:22 +08:00
2025-04-28 20:04:57 +08:00
var paintPath = TeamServiceHandle.VehicleService.GetVehiclePaintPath((int)id, paintID);
//加载涂装材质球
var material = await TeamServiceHandle.VehicleService.GetVehiclePaintMaterial(paintPath);
var root = TeamServiceHandle.VehicleService.FindVehiclePartRoot(go, (int)id, (TeamPaintType)i);
if (material != null && root != null)
2024-12-26 13:24:22 +08:00
{
2025-04-28 20:04:57 +08:00
var instanceMaterial = new Material(material);
var renderers = root.GetComponent<SkinnedMeshRenderer>();
renderers.materials = new Material[] { instanceMaterial };
2024-12-26 13:24:22 +08:00
}
}
2023-10-19 15:00:19 +08:00
}
2025-04-28 20:04:57 +08:00
else
Debug.LogError("载具涂装配置为空!");
2023-10-19 15:00:19 +08:00
}
}
_isLoading = false;
}
2025-04-28 20:04:57 +08:00
/// <summary>
/// 设置游戏对象及其子对象的层级
/// </summary>
private void SetLayerRecursively(GameObject obj, int layer)
{
obj.layer = layer;
foreach (Transform child in obj.transform)
{
SetLayerRecursively(child.gameObject, layer);
}
}
2025-03-20 19:34:04 +08:00
/// <summary>
/// 更换模型shader
/// </summary>
private void ChangeModelShader(GameObject prefab)
{
2025-04-28 20:04:57 +08:00
var vehicleShader = TeamServiceHandle.TeamService.GetVehicleShader();
2025-03-20 19:34:04 +08:00
var vehicleRenderers = prefab.GetComponentsInChildren<Renderer>(true);
2025-04-28 20:04:57 +08:00
if (vehicleShader != null)
2025-03-20 19:34:04 +08:00
{
foreach (var vehicleRenderer in vehicleRenderers)
{
foreach (var material in vehicleRenderer.sharedMaterials)
{
2025-04-28 20:04:57 +08:00
material.shader = vehicleShader;
2025-03-20 19:34:04 +08:00
}
}
}
}
private Dictionary<Renderer, Shader[]> originalShaderDic = new Dictionary<Renderer, Shader[]>();
/// <summary>
/// 替换Shader,并缓存原始Shader 用于解决场景切换后模型蒙上未知来源阴影
/// </summary>
private void ApplyVehicleShader(GameObject prefab)
{
2025-04-28 20:04:57 +08:00
var vehicleShader = TeamServiceHandle.TeamService.GetVehicleShader();
if (vehicleShader == null) return;
2025-03-20 19:34:04 +08:00
var vehicleRenderers = prefab.GetComponentsInChildren<Renderer>(true);
foreach (var vehicleRenderer in vehicleRenderers)
{
if (!originalShaderDic.ContainsKey(vehicleRenderer))
{
var originalShaders = new Shader[vehicleRenderer.sharedMaterials.Length];
for (int i = 0; i < vehicleRenderer.sharedMaterials.Length; i++)
{
originalShaders[i] = vehicleRenderer.sharedMaterials[i].shader;
}
originalShaderDic[vehicleRenderer] = originalShaders;
}
// 替换 Shader
foreach (var mat in vehicleRenderer.sharedMaterials)
{
2025-04-28 20:04:57 +08:00
mat.shader = vehicleShader;
2025-03-20 19:34:04 +08:00
}
}
}
/// <summary>
/// 还原Shader
/// </summary>
private void RestoreOriginalShaders()
{
foreach (var kvp in originalShaderDic)
{
var origRenderer = kvp.Key;
var originalShaders = kvp.Value;
var materials = origRenderer.sharedMaterials;
for (int i = 0; i < materials.Length && i < originalShaders.Length; i++)
{
materials[i].shader = originalShaders[i];
}
}
originalShaderDic.Clear();
}
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-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)
{
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-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);
2025-04-28 20:04:57 +08:00
_charIDs[idx] = TeamServiceHandle.TeamService.GetTeamNoneID();
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);
2025-04-28 20:04:57 +08:00
_vehicleIDs[idx] = TeamServiceHandle.TeamService.GetTeamNoneID();
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(ValueTuple<int, bool> data)
{
2025-04-28 20:04:57 +08:00
var team = TeamServiceHandle.TeamService.GetTeamByIndex(data.Item1, data.Item2);
if (team == null) return;
2025-04-28 20:04:57 +08:00
var charIDs = TeamServiceHandle.TeamService.GetAllCharacters(team);
var vehicleIDs = TeamServiceHandle.TeamService.GetVehicleIDs(team);
SetData(data.Item1, 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
}
private void _OnTeamEditCameraSet()
{
2025-04-28 20:04:57 +08:00
if (TeamServiceHandle.TeamEditCameraObj != null && TeamServiceHandle.TeamEditCameraObj.teamEditCamera != null)
{
TeamServiceHandle.TeamEditCameraObj.SetCameraAntialiasing(
TeamServiceHandle.TeamEditCameraObj.teamEditCamera);
}
}
#endregion
#region Helpers
private int GetDefaultSkinId()
{
return DEFAULT_SKIN_ID;
}
// 通过反射获取对象字段值
// 通过反射获取对象字段值,添加更健壮的类型转换
private T GetField<T>(object obj, string fieldName)
{
if (obj == null) return default;
try
{
var field = obj.GetType().GetField(fieldName);
if (field != null)
{
var value = field.GetValue(obj);
if (value == null) return default;
// 尝试直接转换
if (value is T typedValue)
return typedValue;
// 尝试从其他类型转换
try
{
return (T)Convert.ChangeType(value, typeof(T));
}
catch
{
Debug.LogWarning($"无法将类型 {value.GetType()} 转换为 {typeof(T)} - 字段名: {fieldName}");
return default;
}
}
var property = obj.GetType().GetProperty(fieldName);
if (property != null)
{
var value = property.GetValue(obj);
if (value == null) return default;
// 尝试直接转换
if (value is T typedValue)
return typedValue;
// 尝试从其他类型转换
try
{
return (T)Convert.ChangeType(value, typeof(T));
}
catch
{
Debug.LogWarning($"无法将类型 {value.GetType()} 转换为 {typeof(T)} - 属性名: {fieldName}");
return default;
}
}
Debug.LogWarning($"对象 {obj.GetType()} 中未找到字段或属性: {fieldName}");
return default;
}
catch (Exception ex)
{
2025-04-28 20:04:57 +08:00
Debug.LogError($"从对象 {obj.GetType()} 获取字段 {fieldName} 时发生异常: {ex.Message}");
return default;
}
}
2024-10-08 18:55:13 +08:00
#endregion
2023-10-19 15:00:19 +08:00
}