Files
SVSimServer/SVSim.BattleEngine/Engine/Effect3dInformation.cs
gamer147 957af3d1ec feat(battle-engine): full Unity/VFX/god-object shims + expanded copy closure (2570 files)
Authored Unity primitive/object-model shim, VFX layer (control-flow-preserving, InstantVfx never invokes its action -- headless suppression), god-object stubs (GameMgr/EffectMgr/UIManager with faithfully-extracted nested enums), View/UI/Touch tree, LitJson+BetterList+Tuple copied, third-party stubs. Discovered Roslyn header-error masking: fixing class-header type errors unmasks body references, so the true copy closure is ~2570 files (was 782 under masking). Errors: masked-25720 -> 268; our shim files compile clean. Remaining: ~50 residual shim/external types, 24 NGUI UI-base overrides, static-type fixes, plus likely 1-2 more unmask waves.
2026-06-05 17:22:20 -04:00

480 lines
13 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using Cute;
using UnityEngine;
using Wizard.Battle.View.Vfx;
public class Effect3dInformation : MonoBehaviour
{
public enum ModelBone
{
None = 1000,
Hip = 0,
Waist = 1,
Chest = 2,
Neck = 3,
Head = 4,
Shoulder_L = 5,
Arm_L = 6,
Elbow_L = 7,
Wrist_L = 8,
Shoulder_R = 9,
Arm_R = 10,
Elbow_R = 11,
Wrist_R = 12,
Eye_L = 13,
Eye_R = 14,
Mouth_Root = 15,
Prop_Under_Root = 16,
Prop_Top_Root = 17,
Bone_Max = 18
}
[Serializable]
public class EffectData
{
public GameObject Effect;
private GameObject _effectInstance;
private GameObject _attachRoot;
public ModelBone AttachBone = ModelBone.None;
private ModelBone _selectBone = ModelBone.None;
public Vector3 Offset;
public Vector3 RotateOffset;
public ClassCharaPrm.MotionType PlayMotionType = ClassCharaPrm.MotionType.extra;
private ClassCharaPrm.MotionType _nowMotionType = ClassCharaPrm.MotionType.idle;
public float DelayTime;
public float PlayTime;
private bool _isPlay;
public string EffectPath = "";
private bool _isLoad;
private bool _isSetShader;
private bool _isLoadMaterial;
private bool _isLoadingMaterial;
private string _testResoucePath = "Assets/_Wizard/Resources/";
private string _testEffectResoucePath = "Model/Effect/";
private string _resoucePath = "Assets/_WizardResources2/Resources/";
private string _effectResoucePath = "Jpn/Effect/Effects/";
public void UpdatePosition(Effect3dInformation info)
{
if (Effect != null)
{
if (_effectInstance == null)
{
LoadEffectInstance(info);
}
else
{
if (Effect.name != _effectInstance.name)
{
LoadEffectInstance(info);
}
if (!_isLoadingMaterial)
{
if (!info.IsTestScene)
{
LoadParticleMaterials(_effectInstance);
}
_isLoadingMaterial = true;
}
else if (_isLoadMaterial && !_isSetShader)
{
SetParticleShader(_effectInstance);
_isSetShader = true;
}
}
}
if (_effectInstance != null && _isPlay)
{
if (AttachBone != _selectBone || _attachRoot == null)
{
_attachRoot = info._boneList[AttachBone];
_selectBone = AttachBone;
}
Vector3 position = _attachRoot.transform.position;
Quaternion quaternion = Quaternion.Euler(RotateOffset);
_effectInstance.transform.localRotation = _attachRoot.transform.rotation * quaternion;
Vector3 vector = _effectInstance.transform.rotation * Offset;
_effectInstance.transform.localPosition = position + vector;
}
}
public void DestroyEffect()
{
if (_effectInstance != null)
{
UnityEngine.Object.Destroy(_effectInstance);
}
}
public void LoadEffectInstance(Effect3dInformation info)
{
SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create();
if (!(_effectInstance == null) || !(EffectPath != "") || _isLoad)
{
return;
}
if (EffectPath.Contains(_testResoucePath))
{
EffectPath = EffectPath.Replace(_testResoucePath, "");
}
if (EffectPath.Contains(_testEffectResoucePath))
{
EffectPath = EffectPath.Replace(_testEffectResoucePath, "");
}
if (EffectPath.Contains(_resoucePath))
{
EffectPath = EffectPath.Replace(_resoucePath, "");
}
if (EffectPath.Contains(_effectResoucePath))
{
EffectPath = EffectPath.Replace(_effectResoucePath, "");
}
if (EffectPath.Contains(".prefab"))
{
EffectPath = EffectPath.Replace(".prefab", "");
}
_ = _effectResoucePath + EffectPath;
Toolbox.ResourcesManager.GetAssetTypePath(EffectPath, ResourcesManager.AssetLoadPathType.Effect2D);
sequentialVfxPlayer.Register(InstantVfx.Create(delegate
{
if (info.IsLoad && !(_effectInstance != null))
{
string assetTypePath = Toolbox.ResourcesManager.GetAssetTypePath(EffectPath, ResourcesManager.AssetLoadPathType.Effect2D, isfetch: true);
UnityEngine.Object original = Toolbox.ResourcesManager.LoadObject(assetTypePath);
_effectInstance = UnityEngine.Object.Instantiate(original, info.transform.parent) as GameObject;
Effect = _effectInstance;
_effectInstance.SetLayer(0, isSetChildren: true);
_isPlay = true;
}
}));
sequentialVfxPlayer.Register(WaitVfx.Create(0.1f));
sequentialVfxPlayer.Register(InstantVfx.Create(delegate
{
if (!(_effectInstance == null))
{
_effectInstance.SetActive(value: false);
_isPlay = false;
_isLoad = true;
}
}));
BattleManagerBase.GetIns().VfxMgr.RegisterImmediateVfx(sequentialVfxPlayer);
}
public void SetParticleShader(GameObject effectObj)
{
if (!_isLoadMaterial)
{
return;
}
Renderer[] componentsInChildren = effectObj.transform.GetComponentsInChildren<Renderer>(includeInactive: true);
for (int i = 0; i < componentsInChildren.Length; i++)
{
if (componentsInChildren[i].name.Contains("skn_") || componentsInChildren[i].name.Contains("emitter") || componentsInChildren[i].name.Contains("null"))
{
continue;
}
ParticleSystemRenderer particleSystemRenderer = componentsInChildren[i] as ParticleSystemRenderer;
if (particleSystemRenderer != null)
{
string[] array = componentsInChildren[i].name.Split('&');
if (particleSystemRenderer.trailMaterial != null || array.Length > 1)
{
particleSystemRenderer.trailMaterial = Toolbox.ResourcesManager.LoadObject(Toolbox.ResourcesManager.GetAssetTypePath(array[1], ResourcesManager.AssetLoadPathType.Effect2DMaterials, isfetch: true)) as Material;
particleSystemRenderer.trailMaterial.shader = Shader.Find(particleSystemRenderer.trailMaterial.shader.name);
}
componentsInChildren[i].material = Toolbox.ResourcesManager.LoadObject(Toolbox.ResourcesManager.GetAssetTypePath(array[0], ResourcesManager.AssetLoadPathType.Effect2DMaterials, isfetch: true)) as Material;
componentsInChildren[i].material.shader = Shader.Find(componentsInChildren[i].material.shader.name);
}
else
{
componentsInChildren[i].material = Toolbox.ResourcesManager.LoadObject(Toolbox.ResourcesManager.GetAssetTypePath(componentsInChildren[i].name, ResourcesManager.AssetLoadPathType.Effect2DMaterials, isfetch: true)) as Material;
componentsInChildren[i].material.shader = Shader.Find(componentsInChildren[i].material.shader.name);
}
}
}
private void SetMaterial(Renderer renderer)
{
if (renderer.name.Contains("&"))
{
string[] array = renderer.name.Split('&');
for (int i = 0; i < array.Length; i++)
{
Toolbox.ResourcesManager.GetAssetTypePath(array[i], ResourcesManager.AssetLoadPathType.Effect2DMaterials);
renderer.material = Toolbox.ResourcesManager.LoadObject(Toolbox.ResourcesManager.GetAssetTypePath(renderer.name, ResourcesManager.AssetLoadPathType.Effect2DMaterials, isfetch: true)) as Material;
renderer.materials[i].shader = Shader.Find(renderer.materials[i].shader.name);
}
}
else
{
Toolbox.ResourcesManager.GetAssetTypePath(renderer.name, ResourcesManager.AssetLoadPathType.Effect2DMaterials);
renderer.material = Toolbox.ResourcesManager.LoadObject(Toolbox.ResourcesManager.GetAssetTypePath(renderer.name, ResourcesManager.AssetLoadPathType.Effect2DMaterials, isfetch: true)) as Material;
renderer.material.shader = Shader.Find(renderer.material.shader.name);
}
}
public void LoadParticleMaterials(GameObject effectObj)
{
List<string> list = new List<string>();
Renderer[] componentsInChildren = effectObj.transform.GetComponentsInChildren<Renderer>(includeInactive: true);
for (int i = 0; i < componentsInChildren.Length; i++)
{
if (componentsInChildren[i].name.Contains("skn_") || componentsInChildren[i].name.Contains("emitter") || componentsInChildren[i].name.Contains("null"))
{
continue;
}
if (componentsInChildren[i].name.Contains("&"))
{
string[] array = componentsInChildren[i].name.Split('&');
for (int j = 0; j < array.Length; j++)
{
string assetTypePath = Toolbox.ResourcesManager.GetAssetTypePath(array[j], ResourcesManager.AssetLoadPathType.Effect2DMaterials);
if (assetTypePath.IsNotNullOrEmpty() && !list.Contains(assetTypePath))
{
list.Add(assetTypePath);
}
}
}
else
{
string assetTypePath2 = Toolbox.ResourcesManager.GetAssetTypePath(componentsInChildren[i].name, ResourcesManager.AssetLoadPathType.Effect2DMaterials);
list.Add(assetTypePath2);
}
}
BattleCoroutine.GetInstance().StartCoroutine(Toolbox.ResourcesManager.LoadAssetGroupSync(list, delegate
{
_isLoadMaterial = true;
}));
}
public void UpdateInformation(ClassCharaPrm.MotionType type)
{
if (_effectInstance != null && PlayMotionType != type && _nowMotionType != type && _isPlay)
{
_effectInstance.SetActive(value: false);
}
_nowMotionType = type;
}
public void Play(Effect3dInformation info)
{
if (DelayTime > 0f)
{
if (_effectInstance == null)
{
Debug.LogError("Play effect play error! " + EffectPath);
}
else
{
info.StartCoroutine(PlayEffect(info));
}
}
else if (!(_effectInstance == null))
{
_effectInstance.SetActive(value: true);
_isPlay = true;
if (PlayTime > 0f)
{
info.StartCoroutine(StopEffect());
}
}
}
private IEnumerator PlayEffect(Effect3dInformation info)
{
yield return new WaitForSeconds(DelayTime);
_effectInstance.SetActive(value: true);
_isPlay = true;
if (PlayTime > 0f)
{
info.StartCoroutine(StopEffect());
}
}
private IEnumerator StopEffect()
{
yield return new WaitForSeconds(PlayTime);
_effectInstance.SetActive(value: false);
_isPlay = false;
}
}
[Serializable]
public class EffectList
{
public EffectData[] _effectData;
}
public GameObject ModelRoot;
public GameObject FaceRoot;
public GameObject PropRoot;
private Dictionary<ModelBone, GameObject> _boneList;
public EffectList EffectsList;
public bool FixedEffect;
public bool SaveButton;
public bool LoadButton;
private string _number = "";
public bool IsLoad;
public bool IsTestScene;
private void Start()
{
_boneList = new Dictionary<ModelBone, GameObject>();
_boneList.Add(ModelBone.None, ModelRoot);
for (int i = 0; i < 18; i++)
{
ModelBone key = (ModelBone)i;
string text = key.ToString();
GameObject children = GetChildren(ModelRoot.transform, text);
if (children == null)
{
children = GetChildren(FaceRoot.transform, text);
if (PropRoot != null && children == null)
{
string boneName = text.Replace("Prop_", "");
children = GetChildren(PropRoot.transform, boneName);
}
}
if (children != null)
{
_boneList.Add(key, children.gameObject);
}
}
if (IsTestScene)
{
IsLoad = true;
return;
}
List<string> list = new List<string>();
EffectData[] effectData = EffectsList._effectData;
foreach (EffectData effectData2 in effectData)
{
list.Add(Toolbox.ResourcesManager.GetAssetTypePath(effectData2.EffectPath, ResourcesManager.AssetLoadPathType.Effect2D));
}
StartCoroutine(Toolbox.ResourcesManager.LoadAssetGroupSync(list, delegate
{
IsLoad = true;
}));
}
public void UpdateInfo(ClassCharaPrm.MotionType type)
{
if (IsLoad && EffectsList._effectData.Length != 0)
{
EffectData[] effectData = EffectsList._effectData;
for (int i = 0; i < effectData.Length; i++)
{
effectData[i].UpdateInformation(type);
}
}
}
public void PlayEffect(ClassCharaPrm.MotionType type)
{
if (EffectsList._effectData.Length == 0)
{
return;
}
EffectData[] effectData = EffectsList._effectData;
foreach (EffectData effectData2 in effectData)
{
if (effectData2.PlayMotionType == type)
{
effectData2.Play(this);
}
}
}
private void LateUpdate()
{
if (EffectsList._effectData.Length != 0)
{
EffectData[] effectData = EffectsList._effectData;
for (int i = 0; i < effectData.Length; i++)
{
effectData[i].UpdatePosition(this);
}
}
}
public void DestroyEffect()
{
if (EffectsList._effectData != null)
{
EffectData[] effectData = EffectsList._effectData;
for (int i = 0; i < effectData.Length; i++)
{
effectData[i]?.DestroyEffect();
}
EffectsList._effectData = null;
}
}
private GameObject GetChildren(Transform t, string boneName)
{
if (t.gameObject.name.Contains(boneName))
{
return t.gameObject;
}
if (t.childCount == 0)
{
return null;
}
for (int i = 0; i < t.childCount; i++)
{
GameObject children = GetChildren(t.GetChild(i), boneName);
if (children != null)
{
return children;
}
}
return null;
}
public void SaveInfo()
{
}
public void LoadInfo(string number = "3604")
{
EffectData[] effectData = EffectsList._effectData;
for (int i = 0; i < effectData.Length; i++)
{
effectData[i].LoadEffectInstance(this);
}
_number = number;
}
}