using UnityEngine;
|
|
public class Dead_4 : SMB_Base
|
{
|
public uint killServerInstID;
|
public Vector3 killerPos;
|
public byte killHurtType;
|
|
public int deadFlyId;
|
private float m_EnterGroundHeight;
|
|
private float m_FlyStartTime = 0;
|
private Vector3 m_EnterPosition;
|
private SoDeadFly m_SoDeadFly;
|
private byte m_Step;
|
private float m_WaittingFallTime;
|
private float m_Factor;
|
|
protected override void OnEnter(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
{
|
base.OnEnter(owner, animator, stateInfo, layerIndex);
|
|
#if UNITY_EDITOR
|
string _content = string.Format("Dead_4 => {0} 进入了Dead状态", owner.ServerInstID);
|
RuntimeLogUtility.AddLog_Red(_content, (uint)owner.ServerInstID);
|
#endif
|
owner.SetAnimatorSpeed(1);
|
//StatusManager.Instance.RemoveAll(owner.ServerInstID);
|
//owner.RecycleHeadUpName();
|
//owner.RecycleLifeBar();
|
//owner.RecyleCircleShadow();
|
|
if (killServerInstID != 0)
|
{
|
GActor _killer = GAMgr.Instance.GetBySID(killServerInstID);
|
if (_killer != null)
|
{
|
owner.Forward = MathUtility.ForwardXZ(killerPos, owner.Pos);
|
}
|
}
|
|
owner.needSyncGroundHeight = false;
|
|
m_Step = 99;
|
m_FlyStartTime = 0;
|
m_EnterPosition = owner.Pos;
|
m_WaittingFallTime = 0;
|
m_EnterGroundHeight = owner.Pos.y;
|
|
if (owner.ActorType == GameObjType.gotNPC)
|
{
|
GActorNpcFight _npc = owner as GActorNpcFight;
|
|
if (_npc == null)
|
{
|
return;
|
}
|
|
if (_npc.DeadFlyID >= 0)
|
{
|
m_SoDeadFly = ScriptableObjectLoader.LoadSoDeadFly(_npc.DeadFlyID);
|
}
|
|
if (_npc.NpcConfig.CanDeadFly != 0
|
&& m_SoDeadFly != null
|
&& m_SoDeadFly.hDuration > 0
|
&& m_SoDeadFly.curve != null
|
&& m_SoDeadFly.curve.length > 1)
|
{
|
m_Factor = m_SoDeadFly.curve.keys[m_SoDeadFly.curve.length - 1].time;
|
m_Factor = m_Factor / m_SoDeadFly.hDuration;
|
|
if (GeneralDefine.AtkTypeIncreasePushDis.ContainsKey(killHurtType))
|
{
|
m_Factor *= GeneralDefine.AtkTypeIncreasePushDis[killHurtType];
|
}
|
|
m_FlyStartTime = Time.time;
|
m_Step = 0;
|
}
|
else
|
{
|
m_Step = 1;
|
}
|
|
|
_npc.DeadFlyID = -1;
|
}
|
}
|
|
|
protected override void OnUpdate(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
{
|
base.OnUpdate(owner, animator, stateInfo, layerIndex);
|
|
if (owner.ActorType == GameObjType.gotPlayer)
|
{
|
return;
|
}
|
|
switch (m_Step)
|
{
|
case 0:
|
|
float _delta = (Time.time - m_FlyStartTime) * m_Factor;
|
|
Vector3 _h = -owner.Forward * _delta;
|
Vector3 _v = new Vector3(0, m_SoDeadFly.curve.Evaluate(_delta), 0);
|
owner.Pos = m_EnterPosition + _h + _v;
|
|
if (Time.time - m_FlyStartTime > m_SoDeadFly.hDuration)
|
{
|
m_Step = 1;
|
}
|
|
break;
|
case 1:
|
|
owner.ReleaseLifeBar();
|
if (owner.ActorType != GameObjType.gotPlayer)
|
{
|
owner.ReleaseName();
|
}
|
|
if (stateInfo.normalizedTime < .99f)
|
{
|
return;
|
}
|
|
if (m_WaittingFallTime > 0)
|
{
|
m_WaittingFallTime -= Time.deltaTime;
|
}
|
else
|
{
|
m_Step = 2;
|
m_WaittingFallTime = 0;
|
|
owner.ActorInfo.ResetHp(0, 0);
|
|
GA_Hero _hero = PlayerDatas.Instance.hero;
|
if (_hero != null)
|
{
|
if (_hero.LockTarget == owner)
|
{
|
_hero.LockTarget = null;
|
}
|
|
if (_hero.SelectTarget == owner)
|
{
|
_hero.SelectTarget = null;
|
}
|
}
|
}
|
break;
|
case 2:
|
|
owner.Pos += Vector3.down * Time.deltaTime * 2;
|
m_WaittingFallTime += Time.deltaTime;
|
|
if (owner.Pos.y - m_EnterGroundHeight < -4f
|
|| m_WaittingFallTime > 2f)
|
{
|
owner.IdleImmediate();
|
}
|
|
break;
|
}
|
}
|
|
protected override void OnExit(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
{
|
base.OnExit(owner, animator, stateInfo, layerIndex);
|
|
owner.needSyncGroundHeight = true;
|
|
if (owner is GA_NpcClientFightNorm)
|
{
|
GAMgr.Instance.Release(owner);
|
}
|
|
#if UNITY_EDITOR
|
string _content = string.Format("Dead_4 => {0} 退出了Dead状态", owner.ServerInstID);
|
RuntimeLogUtility.AddLog_Red(_content, (uint)owner.ServerInstID);
|
#endif
|
|
}
|
|
}
|