少年修仙传客户端代码仓库
client_Wu Xijin
2019-04-16 f34adc1afc7771602f14d6cd1182e7ca2244e0ce
Fight/Actor/AI/AI_Npc_198.cs
@@ -16,9 +16,16 @@
        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()
@@ -32,10 +39,13 @@
        switch (m_AIStatus)
        {
            case E_AIStatus.Patrol:
                _Patrol();
                break;
            case E_AIStatus.MoveToBornPos:
                MoveToBornPos();
                break;
            case E_AIStatus.RunAway:
                _RunAway();
                break;
        }
    }
@@ -49,8 +59,22 @@
        {
            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;
        }
    }
@@ -79,6 +103,76 @@
        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;
        }
    }
}