using UnityEngine; using System.Collections.Generic; public class TransferGroup { private H2Engine.MapTrasfer m_Data; private int m_CurrentIndex; private byte m_Step; private int targetPoint; private List m_EffectList = new List(); public TransferGroup(H2Engine.MapTrasfer data) { m_Data = data; m_CurrentIndex = -1; targetPoint = -1; if (m_Data.transferPoints != null && m_Data.transferPoints.Length > 0) { foreach (var _p in m_Data.transferPoints) { if (_p.effectID > 0) { var _effect = SFXPlayUtility.Instance.PlayBattleEffect(_p.effectID, _p.position, Vector3.forward); m_EffectList.Add(_effect); } } } } private float m_InCreaseTime; private Vector3 m_StartPos; private bool isPositive = true; public void Update() { if (m_Data.transferPoints == null || m_Data.transferPoints.Length == 0) { return; } var _hero = PlayerDatas.Instance.hero; if (_hero == null) { return; } float _distance = 0; H2Engine.MapTransferPoint _p; switch (m_Step) { case 0:// 等待第一次进入某个传送点 for (int i = 0; i < m_Data.transferPoints.Length; ++i) { _p = m_Data.transferPoints[i]; _distance = MathUtility.DistanceSqrtXZ(_hero.Pos, _p.position); if (_distance < _p.radius * _p.radius) { m_Step = 1; m_InCreaseTime = 0; GA_Hero.s_MapSwitching = true; _hero.Pos = m_StartPos = m_Data.transferPoints[i].position; _hero.StopPathFind(); if (i == 0) { isPositive = true; targetPoint = i + 1; } else { targetPoint = i - 1; isPositive = false; } break; } } break; case 1: if (m_Data.transferType == H2Engine.MapTrasfer.E_TransferType.Current) { if (targetPoint < 0 || targetPoint > m_Data.transferPoints.Length - 1) { Debug.LogFormat("数据异常: (m_Data.transferPoints.Length = {0}, index = {1})", m_Data.transferPoints.Length, targetPoint); m_Step = 0; GA_Hero.s_MapSwitching = false; } else { _p = m_Data.transferPoints[targetPoint]; var _pkg = new CB40B_tagCMMoveByType(); _pkg.PosX = (ushort)(_p.position.x * 2 + GA_Hero.MapOffset.x); _pkg.PosY = (ushort)(_p.position.z * 2 + GA_Hero.MapOffset.z); _pkg.MoveType = 0; GameNetSystem.Instance.SendInfo(_pkg); GA_Hero.s_MapSwitching = true; m_Step = 2; _hero.OnHorse(0); DTC0428_tagPlayerRideHorse.Send_tagPlayerRideHorse(false); _hero.Play(GAStaticDefine.State_Fly); _hero.Idle(); } } else { // 打开地图 / 直接传送 } break; case 2:// 执行坐标改变 _p = m_Data.transferPoints[targetPoint]; _hero.Forward = MathUtility.ForwardXZ(_p.position, _hero.Pos); m_InCreaseTime += .5f * Time.deltaTime; _hero.Pos = Vector3.Lerp(m_StartPos, _p.position, m_InCreaseTime); _distance = MathUtility.DistanceSqrtXZ(_hero.Pos, _p.position); if (_distance < 0.05f) { _hero.PrevPos = _hero.Pos = _p.position; _hero.IdleImmediate(); _hero.StopPathFind(); int _nextIndex = -1; if (isPositive) { _nextIndex = targetPoint + 1; } else { _nextIndex = targetPoint - 1; } if (_nextIndex >= 0 && _nextIndex < m_Data.transferPoints.Length) { _hero.Pos = m_StartPos = m_Data.transferPoints[targetPoint].position; targetPoint = _nextIndex; m_InCreaseTime = 0; _hero.StopPathFind(); m_Step = 1; } else { m_Step = 3; GA_Hero.s_MapSwitching = false; } } break; case 3: _p = m_Data.transferPoints[targetPoint]; _distance = MathUtility.DistanceSqrtXZ(_hero.Pos, _p.position); if (_distance > _p.radius * _p.radius) { m_Step = 0; m_InCreaseTime = 0; targetPoint = -1; _hero.StopPathFind(); _hero.Behaviour.StopHandupAI(true); } break; } } public void UnInit() { foreach (var _effect in m_EffectList) { SFXPlayUtility.Instance.Release(_effect); } m_EffectList.Clear(); m_Data = null; } }