Files
JJBB/Assets/Project/Script/Scene/SceneLogic/FusionEffectController.cs

95 lines
3.2 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
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<FusionEffectController>();
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;
}