using Games.GlobeDefine; using Games.LogicObj; using Games.Scene; using GCGame.Table; using Module.Log; using UnityEngine; // 融合效果的控制器 - 切换场景需要删除。逻辑也独立于其他模块,因此单独开EffectController public class FusionEffectController : MonoBehaviour { private const string _handleHeader = "FusionModel_"; private const int _defaultAnimId = 0; private FusionEffectData _data; private int _serverId0; private int _serverId1; private float _startTime; private void Start() { _serverId0 = Animator.StringToHash(_handleHeader + _data.modelId0 + "_" + Time.realtimeSinceStartup + "_0"); _serverId1 = Animator.StringToHash(_handleHeader + _data.modelId1 + "_" + Time.realtimeSinceStartup + "_1"); _startTime = Time.unscaledTime; var animData0 = GetAnimationData(_data.animId0); var animData1 = GetAnimationData(_data.animId1); CreateCloneObj(_serverId0, _data.modelId0, animData0.AnimName.ToLower(), _data.endPos); CreateCloneObj(_serverId1, _data.modelId1, animData1.AnimName.ToLower(), _data.endPos); } private Tab_Animation GetAnimationData(int index) { var result = TableManager.GetAnimationByID(index, 0); if (result == null) { LogModule.ErrorLog(string.Format("无法获得id = {0}的动画!", index)); result = TableManager.GetAnimationByID(_defaultAnimId, 0); } return result; } private void Update() { if (Time.unscaledTime > _startTime + _data.duration) { Destroy(gameObject); if (IndependentEffectManager.Instance != null) { IndependentEffectManager.Instance.RemoveCharacterClone(_serverId0); IndependentEffectManager.Instance.RemoveCharacterClone(_serverId1); } } } private Obj_CharacterClone CreateCloneObj(int serverId, int modelId, string animName, Vector2 startPos) { var result = IndependentEffectManager.Instance.ShowCharacterClone(serverId, startPos, Quaternion.identity, CreateInitData(modelId, startPos, animName)).cloneObj; result.ObjTransform.localRotation = _data.rotation; return result; } private static Obj_Character_Clone_Init_Data CreateInitData(int modelId, Vector2 position, string animName) { var initData = new Obj_Character_Clone_Init_Data { m_nProfession = GlobeVar.INVALID_ID, m_ModelVisualID = modelId, m_WeaponDataID = GlobeVar.INVALID_ID, m_fX = position.x, m_fZ = position.y, animData = new CharacterCloneAnimData { animName = animName } }; return initData; } public static void CreateFusionEffect(FusionEffectData data) { var gameObject = new GameObject("FusionEffectController"); var component = gameObject.AddComponent(); component._data = data; } } public class FusionEffectData { public int modelId0; public int modelId1; public int animId0; public int animId1; public Vector2 endPos; public Quaternion rotation; public float duration; }