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 int startPoint;
|
private List<SFXController> m_EffectList = new List<SFXController>();
|
|
public void StartMoveTo()
|
{
|
if (m_Step == 3)
|
{
|
m_Step = 0;
|
m_InCreaseTime = 0;
|
targetPoint = -1;
|
}
|
}
|
|
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;
|
|
private SFXController m_FlyingEffect;
|
|
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 = 11;
|
GA_Hero.s_MapSwitching = true;
|
_hero.StopPathFind();
|
_hero.Behaviour.StopHandupAI(true);
|
startPoint = i;
|
if (i == 0)
|
{
|
isPositive = true;
|
targetPoint = i + 1;
|
}
|
else
|
{
|
targetPoint = i - 1;
|
isPositive = false;
|
}
|
if (!_hero.IsRun())
|
{
|
_hero.RunImmediate();
|
}
|
GA_Hero.s_Flying = true;
|
break;
|
}
|
}
|
break;
|
case 11:
|
_p = m_Data.transferPoints[startPoint];
|
var _dir = MathUtility.ForwardXZ(_p.position, _hero.Pos);
|
_hero.Pos += _hero.ActorInfo.moveSpeed * Time.deltaTime * _dir;
|
_hero.destForward = _hero.Forward = _dir;
|
_distance = MathUtility.DistanceSqrtXZ(_p.position, _hero.Pos);
|
_hero.Run();
|
if (_distance < 0.01f)
|
{
|
_hero.Pos = m_StartPos = m_Data.transferPoints[startPoint].position;
|
m_Step = 1;
|
m_InCreaseTime = 0;
|
DTC0428_tagPlayerRideHorse.Send_tagPlayerRideHorse(false);
|
_hero.OnHorse(0);
|
SFXPlayUtility.Instance.PlayBattleEffect(1181, _p.position, Vector3.forward);
|
_hero.Idle();
|
_hero.SwitchHeadNameBindNode(true);
|
_hero.needSyncGroundHeight = false;
|
}
|
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);
|
m_FlyingEffect = SFXPlayUtility.Instance.PlayBattleEffect(1180, _hero);
|
var _scaleTime = 1f;
|
if (isPositive)
|
{
|
_scaleTime = m_Data.transferPoints[targetPoint - 1].flyTimeFront / 2;
|
}
|
else
|
{
|
_scaleTime = m_Data.transferPoints[targetPoint + 1].flyTimeBack / 2;
|
}
|
m_FlyingEffect.SetAnimatorSpeed(1 / _scaleTime);
|
m_FlyingEffect.SetPaticleSystemSpeed(_scaleTime);
|
GA_Hero.s_MapSwitching = true;
|
m_Step = 2;
|
if (isPositive)
|
{
|
_hero.Play(Animator.StringToHash(m_Data.transferPoints[targetPoint - 1].stateNameFront));
|
}
|
else
|
{
|
_hero.Play(Animator.StringToHash(m_Data.transferPoints[targetPoint + 1].stateNameBack));
|
}
|
_hero.SetAnimatorSpeed(1 / _scaleTime);
|
_hero.Idle();
|
CameraController.Instance.LookAtTarget = _hero.Root.GetChildTransformDeeply("Bip001");
|
}
|
}
|
else
|
{
|
// 打开地图 / 直接传送
|
}
|
break;
|
case 2:// 执行坐标改变
|
_p = m_Data.transferPoints[targetPoint];
|
_hero.destForward = _hero.Forward = MathUtility.ForwardXZ(_p.position, _hero.Pos);
|
if (isPositive)
|
{
|
m_InCreaseTime += (Time.deltaTime / m_Data.transferPoints[targetPoint - 1].flyTimeFront);
|
}
|
else
|
{
|
m_InCreaseTime += (Time.deltaTime / m_Data.transferPoints[targetPoint + 1].flyTimeBack);
|
}
|
float _y = 0;
|
if (m_StartPos.y > _p.position.y)
|
{
|
var _offset = m_StartPos.y - _p.position.y;
|
_y = Constants.hurtAniCurve.animationCurve.Evaluate(m_InCreaseTime) * _offset + (1 - m_InCreaseTime) * _offset;
|
}
|
else
|
{
|
_y = Constants.hurtAniCurve.animationCurve.Evaluate(m_InCreaseTime) * (_p.position.y - m_StartPos.y);
|
}
|
Vector3 _p1 = _p.position + new Vector3(0, _y, 0);
|
_hero.Pos = Vector3.Lerp(m_StartPos, _p1, m_InCreaseTime);
|
CameraController.Instance.MoveDamping = Mathf.Lerp(CameraController.Instance.MoveDamping, 0, 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;
|
_hero.needSyncGroundHeight = true;
|
_hero.SetAnimatorSpeed(1);
|
if (m_FlyingEffect)
|
{
|
SFXPlayUtility.Instance.Release(m_FlyingEffect);
|
m_FlyingEffect = null;
|
}
|
_hero.SwitchHeadNameBindNode(false);
|
_hero.StopPathFind();
|
CameraController.Instance.LookAtTarget = _hero.Root;
|
GA_Hero.s_Flying = false;
|
CameraController.Instance.MoveDamping = 0.1f;
|
}
|
}
|
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;
|
}
|
break;
|
}
|
}
|
|
public void UnInit()
|
{
|
foreach (var _effect in m_EffectList)
|
{
|
SFXPlayUtility.Instance.Release(_effect);
|
}
|
m_EffectList.Clear();
|
|
if (m_FlyingEffect)
|
{
|
SFXPlayUtility.Instance.Release(m_FlyingEffect);
|
m_FlyingEffect = null;
|
}
|
|
m_Data = null;
|
}
|
}
|