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.
This commit is contained in:
479
SVSim.BattleEngine/Engine/Effect3dInformation.cs
Normal file
479
SVSim.BattleEngine/Engine/Effect3dInformation.cs
Normal file
@@ -0,0 +1,479 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user