95 lines
3.1 KiB
C#
95 lines
3.1 KiB
C#
using Cysharp.Threading.Tasks;
|
|
using Framework;
|
|
using Gameplay.Area;
|
|
using Gameplay.Bullet;
|
|
using Gameplay.Effect;
|
|
using Gameplay.PlayerSkill.Cmp;
|
|
using UnityEngine;
|
|
using UnityEngine.Playables;
|
|
namespace Gameplay.PlayerSkill.Logic
|
|
{
|
|
/// <summary>
|
|
/// 逻辑:
|
|
/// 在指定格子位置创建一个带timeline的特效
|
|
/// 等待timeline触发事件,接收到该事件后像该位置发射一发子弹
|
|
/// 逻辑参数 [特效id, 子弹id]
|
|
/// </summary>
|
|
public class PlayerSkillLogic03 : BasePlayerSkillLogic
|
|
{
|
|
|
|
private int _cacheBulletId;
|
|
private int _cacheReleaseCellIndex;
|
|
private EffectPlayingData _cacheEffectData;
|
|
|
|
protected override void _OnInit()
|
|
{
|
|
base._OnInit();
|
|
|
|
var effectId = owner.ReadParamInt(0);
|
|
var bulletId = owner.ReadParamInt(1);
|
|
_cacheBulletId = bulletId;
|
|
|
|
var releaseCellIndex = owner.selectedCellIndex;
|
|
_cacheReleaseCellIndex = releaseCellIndex;
|
|
var releasePos = AreaManager.instance.GetCellPosByIndex(releaseCellIndex);
|
|
_InitEffect(effectId, releasePos);
|
|
|
|
EventManager.Instance.Register(EventManager.EventName.INFIGHT_PLAYER_SKILL_VIEW_TRIGGER, _OnEffectEvent);
|
|
}
|
|
|
|
|
|
protected override void _OnDispose()
|
|
{
|
|
base._OnDispose();
|
|
|
|
_cacheEffectData.onLoaded = null;
|
|
|
|
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_PLAYER_SKILL_VIEW_TRIGGER, _OnEffectEvent);
|
|
}
|
|
|
|
private void _InitEffect(int effectId, Vector3 releasePos)
|
|
{
|
|
_cacheEffectData = EffectManager.instance.PlayEffectById(effectId, releasePos);
|
|
_cacheEffectData.onLoaded = _OnEffectLoaded;
|
|
}
|
|
|
|
private void _OnEffectLoaded()
|
|
{
|
|
var effectObj = _cacheEffectData.rootObj;
|
|
var timeLine = effectObj.GetComponentInChildren<PlayableDirector>();
|
|
if (timeLine == null)
|
|
{
|
|
DebugUtil.LogError("该模式下的特效必须包含timeline");
|
|
isFinished = true;
|
|
return;
|
|
}
|
|
// 设置timeline的signal receiver
|
|
// 获取bindings
|
|
var isSet = false;
|
|
var bindings = timeLine.playableAsset.outputs;
|
|
foreach (var binding in bindings)
|
|
{
|
|
if (binding.streamName == "Signal Track")
|
|
{
|
|
timeLine.SetGenericBinding(binding.sourceObject, CmpPlayerSkillEventWrapper.instance.m_SignalReceiver);
|
|
isSet = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!isSet)
|
|
{
|
|
DebugUtil.LogError("该模式下的timeline必须包含signal track");
|
|
isFinished = true;
|
|
return;
|
|
}
|
|
timeLine.Play();
|
|
}
|
|
|
|
private void _OnEffectEvent()
|
|
{
|
|
BulletManager.instance.EmitBullet(_cacheBulletId, _cacheReleaseCellIndex, owner.playerUnit);
|
|
isFinished = true;
|
|
}
|
|
}
|
|
}
|