| | |
| | | m_Owner.OnAttacked -= OnAttacked; |
| | | } |
| | | |
| | | private float m_LastBeAtkedTime = 0; |
| | | |
| | | public void OnAttacked() |
| | | { |
| | | |
| | | if (m_AIStatus != E_AIStatus.RunAway) |
| | | { |
| | | m_AIStatus = E_AIStatus.RunAway; |
| | | m_RunAwayStep = 0; |
| | | } |
| | | m_LastBeAtkedTime = Time.realtimeSinceStartup; |
| | | } |
| | | |
| | | public override void Update() |
| | |
| | | switch (m_AIStatus) |
| | | { |
| | | case E_AIStatus.Patrol: |
| | | _Patrol(); |
| | | break; |
| | | case E_AIStatus.MoveToBornPos: |
| | | MoveToBornPos(); |
| | | break; |
| | | case E_AIStatus.RunAway: |
| | | _RunAway(); |
| | | break; |
| | | } |
| | | } |
| | |
| | | { |
| | | case 0: |
| | | // 选择一个逃跑点 |
| | | var _nextForawrd = Random.rotation * m_Owner.Forward; |
| | | var _randomDis = Random.Range(0, m_Owner.NpcConfig.Sight * .5f); |
| | | m_Dest = m_Owner.BornPos + _nextForawrd * _randomDis; |
| | | m_RunAwayStep = 1; |
| | | break; |
| | | case 1: |
| | | var _conmareDis = MathUtility.DistanceSqrtXZ(m_Owner.Pos, m_Dest); |
| | | if (_conmareDis > .5f) |
| | | { |
| | | m_Owner.MoveToPosition(m_Dest); |
| | | } |
| | | else |
| | | { |
| | | m_RunAwayStep = 0; |
| | | m_AIStatus = E_AIStatus.Idle; |
| | | } |
| | | break; |
| | | } |
| | | } |
| | |
| | | else |
| | | { |
| | | _compareDis = MathUtility.DistanceSqrtXZ(m_Owner.Pos, BornPos); |
| | | if (_compareDis > m_KeepBornDistSqrt) |
| | | { |
| | | m_AIStatus = E_AIStatus.MoveToBornPos; |
| | | } |
| | | else |
| | | { |
| | | if (m_AIStatus != E_AIStatus.RunAway |
| | | && m_AIStatus != E_AIStatus.Idle) |
| | | { |
| | | m_AIStatus = E_AIStatus.Patrol; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (m_AIStatus == E_AIStatus.Idle) |
| | | { |
| | | if (Time.realtimeSinceStartup - m_LastBeAtkedTime > 5) |
| | | { |
| | | m_AIStatus = E_AIStatus.Patrol; |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void MoveToBornPos() |
| | | { |
| | | var _dis = MathUtility.DistanceSqrtXZ(m_Owner.Pos, BornPos); |
| | | if (_dis > 0.1f) |
| | | { |
| | | m_Owner.MoveToPosition(BornPos); |
| | | } |
| | | else |
| | | { |
| | | m_AIStatus = E_AIStatus.Patrol; |
| | | } |
| | | } |
| | | |
| | | private byte patrolStep; |
| | | private float patrolWaitTime; |
| | | private float patrolWaitRandomTime; |
| | | private Vector3 randomPos; |
| | | private void _Patrol() |
| | | { |
| | | if (m_AIStatus == E_AIStatus.MoveToBornPos) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | switch (patrolStep) |
| | | { |
| | | case 0: |
| | | patrolWaitRandomTime = Random.Range(2f, 4f); |
| | | patrolWaitTime = Time.realtimeSinceStartup; |
| | | patrolStep = 1; |
| | | break; |
| | | case 1: |
| | | if (Time.realtimeSinceStartup - patrolWaitTime > patrolWaitRandomTime) |
| | | { |
| | | patrolStep = 2; |
| | | patrolWaitTime = Time.realtimeSinceStartup; |
| | | randomPos = BornPos + new Vector3(Random.Range(-2f, 2f), 0, Random.Range(-2f, 2f)); |
| | | GActor.TryGetValidPos(randomPos, ref randomPos); |
| | | m_Owner.MoveToPosition(randomPos); |
| | | } |
| | | break; |
| | | case 2: |
| | | if (Time.realtimeSinceStartup - patrolWaitTime > 2) |
| | | { |
| | | patrolStep = 1; |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | } |
| | |
| | | { |
| | | protected enum E_AIStatus |
| | | { |
| | | Idle, |
| | | Patrol,// 巡逻 |
| | | MoveToTarget,// 向目标移动 |
| | | Attack,// 攻击 |
| | |
| | | { |
| | | m_Owner = owner; |
| | | BornPos = bornPosition; |
| | | |
| | | m_KeepBornDistSqrt = 5 * 5; |
| | | |
| | | // NPC类型的视野读取配置 |
| | | m_KeepBornDistSqrt = m_Owner.NpcConfig.Sight * .5f; |
| | |
| | | { |
| | | m_AIHandler = new AI_Npc_200(this, BornPos); |
| | | } |
| | | else if (NpcConfig.AIType == 198) |
| | | { |
| | | m_AIHandler = new AI_Npc_198(this, BornPos); |
| | | } |
| | | |
| | | heroAttacked = false; |
| | | } |
| | |
| | |
|
| | | if (GUILayout.Button("创建PVP敌方"))
|
| | | {
|
| | | // var _npc = GAMgr.Instance.ReqClntFightNpc<GA_NpcClientFightBoss>(30902001, E_ActorGroup.Enemy);
|
| | | // _npc.BornPos = _npc.Pos = PlayerDatas.Instance.hero.Pos;
|
| | | // _npc.ActorInfo.ResetHp(200, -1, 200);
|
| | | var _npc = GAMgr.Instance.ReqClntFightNpc<GA_NpcClientFightNorm>(30102003, E_ActorGroup.Enemy);
|
| | | _npc.BornPos = _npc.Pos = PlayerDatas.Instance.hero.Pos;
|
| | | _npc.ActorInfo.ResetHp(9999999, -1, 9999999);
|
| | |
|
| | | ClientDropItemUtility.Instance.Drop(PlayerDatas.Instance.hero.Pos,
|
| | | new int[] { 5006, 5301, 5410, 5505, 10543, 1043050,
|
| | | 5301, 5410, 5505, 10543, 1043050,
|
| | | 5301, 5410, 5505, 10543, 1043050,
|
| | | 5301, 5410, 5505, 10543, 1043050,
|
| | | 5301, 5410, 5505, 10543, 1043050 });
|
| | | // ClientDropItemUtility.Instance.Drop(PlayerDatas.Instance.hero.Pos,
|
| | | // new int[] { 5006, 5301, 5410, 5505, 10543, 1043050,
|
| | | // 5301, 5410, 5505, 10543, 1043050,
|
| | | // 5301, 5410, 5505, 10543, 1043050,
|
| | | // 5301, 5410, 5505, 10543, 1043050,
|
| | | // 5301, 5410, 5505, 10543, 1043050 });
|
| | |
|
| | | // var _npc = GAMgr.Instance.ReqClntFightNpc<GA_NpcClientFightBoss>(10103001, E_ActorGroup.Enemy);
|
| | |
|