95 lines
3.2 KiB
C#
95 lines
3.2 KiB
C#
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;
|
||
} |