hch
14 小时以前 2f844a7b0d694685557560e721eabd66ff830b7a
Main/System/Battle/RecordPlayer/RecordPlayer.cs
@@ -7,22 +7,39 @@
    protected BattleField battleField;
    private Queue<RecordAction> recordActionQueue = new Queue<RecordAction>();
    protected RecordAction currentRecordAction;
    protected List<RecordAction> immediatelyActionList = new List<RecordAction>();
    private bool isWaitingNextAction = false;
    private float waitTimer = 0f;
    private const float waitInterval = 0.2f;
    private float speedRatio = 1.5f;
    private bool isForceFinish = false;
    public void Init(BattleField _battleField)
    {
        Release();
        battleField = _battleField;
    }
    public bool IsPlaying()
    {
        return currentRecordAction != null || recordActionQueue.Count > 0;
        bool isPlaying = currentRecordAction != null || recordActionQueue.Count > 0 || immediatelyActionList.Count > 0;
        //BattleDebug.LogError("IsPlaying " + isPlaying + " currentRecordAction " + (currentRecordAction != null) + " recordActionQueue.Count " + recordActionQueue.Count + " immediatelyActionList.Count " + immediatelyActionList.Count);
        return isPlaying;
    }
    public void PlayRecord(RecordAction recordAction)
    {
        Debug.LogError("Enqueue record action " + recordAction.GetType());
        BattleDebug.LogError("Enqueue record action " + recordAction.GetType());
        if (isForceFinish)
        {
            recordAction.ForceFinish();
            return;
        }
        recordActionQueue.Enqueue(recordAction);
    }
@@ -34,8 +51,88 @@
        }
    }
    public void InsertRecord(RecordAction recordAction)
    {
        if (isForceFinish)
        {
            recordAction.ForceFinish();
            return;
        }
        BattleDebug.LogError("Insert record action " + recordAction.GetType());
        if (currentRecordAction != null)
        {
            Queue<RecordAction> tempQueue = new Queue<RecordAction>();
            tempQueue.Enqueue(recordAction);
            while (recordActionQueue.Count > 0)
            {
                tempQueue.Enqueue(recordActionQueue.Dequeue());
            }
            recordActionQueue = tempQueue;
        }
        else
        {
            recordActionQueue.Enqueue(recordAction);
        }
    }
    public void ImmediatelyPlay(RecordAction recordAction)
    {
        if (isForceFinish)
        {
            recordAction.ForceFinish();
            return;
        }
        immediatelyActionList.Add(recordAction);
    }
    protected void ImmediatelyPlayRun()
    {
        if (immediatelyActionList.Count > 0)
        {
            List<int> removeIndexList = new List<int>();
            for (int i = immediatelyActionList.Count - 1; i >= 0; i--)
            {
                var action = immediatelyActionList[i];
                if (!action.IsFinished())
                {
                    action.Run();
                    continue;
                }
                removeIndexList.Add(i);
            }
            for (int i = removeIndexList.Count - 1; i >= 0; i--)
            {
                int index = removeIndexList[i];
                if (index < 0 || index >= immediatelyActionList.Count)
                    continue;
                immediatelyActionList.RemoveAt(index);
            }
        }
    }
    public virtual void Run()
    {
        ImmediatelyPlayRun();
        // 等待下一个action
        if (isWaitingNextAction)
        {
            waitTimer += Time.deltaTime * speedRatio;
            if (waitTimer >= waitInterval)
            {
                isWaitingNextAction = false;
                waitTimer = 0f;
            }
            else
            {
                return;
            }
        }
        if (currentRecordAction == null)
        {
            if (recordActionQueue.Count <= 0)
@@ -52,7 +149,13 @@
        if (currentRecordAction != null && currentRecordAction.IsFinished())
        {
            var guid = currentRecordAction.GetBattleFieldGuid();
            BattleDebug.LogError("record action " + currentRecordAction.GetType() + " play finished");
            currentRecordAction = null;
            isWaitingNextAction = true;
            waitTimer = 0f;
            EventBroadcast.Instance.Broadcast<string>(EventName.RECORDPLAYER_END, guid);
            return;
        }
        if (currentRecordAction == null)
@@ -60,7 +163,7 @@
            if (recordActionQueue.Count > 0)
            {
                currentRecordAction = recordActionQueue.Dequeue();
                Debug.LogError("play record action " + currentRecordAction.GetType());
                BattleDebug.LogError("play record action " + currentRecordAction.GetType());
            }
        }
    }
@@ -76,15 +179,49 @@
    }
    public void HaveRest()
    {
        currentRecordAction = null;
        recordActionQueue.Clear();
        ForceFinish();
    }
    public void ForceFinish()
    {
        isForceFinish = true;
        for (int i = immediatelyActionList.Count - 1; i >= 0; i--)
        {
            var action = immediatelyActionList[i];
            action.ForceFinish();
            immediatelyActionList.Remove(action);
        }
        while (currentRecordAction != null)
        {
            var temp = currentRecordAction;
            currentRecordAction = null;
            temp.ForceFinish();
        }
        while (recordActionQueue.Count > 0)
        {
            recordActionQueue.Dequeue().ForceFinish();
        }
    }
    public void Release()
    {
        if (null != currentRecordAction)
        {
            currentRecordAction.ForceFinish();
        }
        currentRecordAction = null;
        recordActionQueue.Clear();
        immediatelyActionList.Clear();
        isForceFinish = false;
    }
    public void SetSpeedRatio(float ratio)
    {
        speedRatio = ratio;
    }
}