public void OnAddUnderAttackActor(CEventBaseArgs msg)
        {
            if (msg == null || msg.arg == null)
            {//取消选中目标
                return;
            }
            uint obj_idx         = (uint)msg.arg;
            bool need_reset_list = false;

            if (mDataArray.Count == 0)
            {
                need_reset_list = true;
            }

            HostileAttackData find_data = mDataArray.Find((a) => { return(a.obj_idx == obj_idx); });

            if (find_data == null)
            {
                HostileAttackData new_data = new HostileAttackData();
                new_data.obj_idx          = obj_idx;
                new_data.last_attack_time = Time.realtimeSinceStartup;
                mDataArray.Add(new_data);
            }
            else
            {
                find_data.last_attack_time = Time.realtimeSinceStartup;
            }
            if (need_reset_list)
            {
                ResetList();
            }
        }
        void ResetList()
        {
            mLastResetTime = Time.realtimeSinceStartup;
            Actor localPlayer = Game.GetInstance().GetLocalPlayer();

            if (localPlayer == null || localPlayer.transform == null || localPlayer.AttackCtrl == null)
            {
                mCurShowObjIdx = 0;
                return;
            }
            float max_target_range = AttackCtrl.MaxTargetRange;
            uint  perfect_actor_id = 0;

            //HostileAttackData perfect_data = null;
            if (mDataArray.Count > 0)
            {
                if (mCurShowObjIdx == mDataArray[0].obj_idx)
                {
                    HostileAttackData tmp_data = mDataArray[0];
                    mDataArray.RemoveAt(0);
                    mDataArray.Add(tmp_data);
                }
                float now_time = Time.realtimeSinceStartup;
                for (int index = mDataArray.Count - 1; index >= 0; --index)
                {
                    HostileAttackData tmp_data = mDataArray[index];
                    Actor             actor    = ActorManager.Instance.GetActor(mDataArray[index].obj_idx);
                    if (actor != null)
                    {
                        float dist = (actor.transform.position - localPlayer.transform.position).magnitude;
                        if (dist > max_target_range)
                        {
                            mDataArray.RemoveAt(index);
                            continue;
                        }
                        float pass_time = now_time - tmp_data.last_attack_time;
                        if (pass_time > mNoAttackInterval)
                        {
                            mDataArray.RemoveAt(index);
                            continue;
                        }

                        perfect_actor_id = actor.UID.obj_idx;
                        //perfect_data = mDataArray[index];
                    }
                    else
                    {
                        mDataArray.RemoveAt(index);
                    }
                }
            }
            mCurShowObjIdx = perfect_actor_id;
            ClientEventMgr.Instance.FireEvent((int)ClientEvent.EC_ACTOR_UNDER_ATTACK_CHANGE, new CEventBaseArgs(mCurShowObjIdx));
        }
        void CheckActorPosAndNoAttack()
        {
            Actor localPlayer = Game.GetInstance().GetLocalPlayer();

            if (localPlayer == null || localPlayer.transform == null || localPlayer.AttackCtrl == null)
            {
                return;
            }
            float max_target_range = AttackCtrl.MaxTargetRange;

            if (mDataArray.Count > 0)
            {
                float now_time = Time.realtimeSinceStartup;
                for (int index = mDataArray.Count - 1; index >= 0; --index)
                {
                    HostileAttackData tmp_data = mDataArray[index];
                    Actor             actor    = ActorManager.Instance.GetActor(mDataArray[index].obj_idx);
                    if (actor != null)
                    {
                        float dist = (actor.transform.position - localPlayer.transform.position).magnitude;
                        if (dist > max_target_range)
                        {
                            mDataArray.RemoveAt(index);
                            continue;
                        }
                        float pass_time = now_time - tmp_data.last_attack_time;
                        if (pass_time > mNoAttackInterval)
                        {
                            mDataArray.RemoveAt(index);
                            continue;
                        }
                    }
                    else
                    {
                        mDataArray.RemoveAt(index);
                    }
                }
            }
            if (mDataArray.Count == 0 || mCurShowObjIdx != mDataArray[0].obj_idx)
            {//最优的目标被删除了,应该重置列表
                ResetList();
            }
        }