} // public void Update_objWalk(float fTimeDelta)


    //@ collect collide objects to sorteddictionary
    protected override void OnTriggerEnter(Collider colliderOther)
    {
        UnitWalking unitwalkingColliderOther = colliderOther.gameObject.GetComponentInChildren<UnitWalking>();
        if (null == unitwalkingColliderOther)
        {
            return;
        }

        lock (_lock)
        {
            m_listCollides.Add(unitwalkingColliderOther.id, Time.time);
        }
    }
    protected override void OnTriggerExit(Collider colliderOther)
    {
        base.OnTriggerExit(colliderOther);
        UnitWalking unitwalkingColliderOther = colliderOther.gameObject.GetComponentInChildren<UnitWalking>();
        if (null == unitwalkingColliderOther)
        {
            return;
        }

        lock (_lock)
        {
            m_listCollides.Remove(unitwalkingColliderOther.id);
        }
    }
    void OnTriggerEnter(Collider other)
    {
        UnitRange range = other.GetComponent <UnitRange>();

        if (range != null)
        {
            if (m_CoreType == 1)    //  maincore는 모든유닛들이 공격
            {
                UnitBase unit = range.transform.root.GetComponentInChildren <UnitBase>();
                unit.AddDestroyTarget(m_CoreID);
            }
            else                    // subcore는 지상유닛만 공격함
            {
                UnitWalking unit = range.transform.root.GetComponentInChildren <UnitWalking>();
                if (unit != null)
                {
                    unit.AddDestroyTarget(m_CoreID);
                }
            }
        }
    }
    } // protected void loadingProcess_Binary

    //@ Initialize managements.
    public void Initialize(processResource resources)
    {
        if (null == resources)
        {
            Debug.Log("ERROR(critical) all gameobjectProcessResource is null.");
            return;
        }

        _modeTool = true;

        //@ re-link resource all.
        m_datanavimeshs         = resources._navimeshResource;
        m_unitFactory_          = resources._unitfactory;
        m_processInput          = resources._processInput;
        m_curvePathUnit_src     = resources._curvePathUnit_src;
        m_curvePathLineDraw_src = resources._curvePathLineDraw_src;
        m_drawText3D_src        = resources._drawText3D_src;
        m_unitFlying_src        = resources._unitFlying_src;
        m_unitWalking_src       = resources._unitWalking_src;
        m_selectBox_src         = resources._selectBox_src;
        m_combo_src             = resources._combo_src;

        _IdxKeyNavi = m_datanavimeshs.StartNaviMesh;

        m_speedmove_unitwalking = m_processInput.velocity_unitwalking;
        m_speedmove_unitflying  = m_processInput.velocity_unitflying;

        //@ Construct
        m_baseTowerCollector   = new CBaseTowerCollector();
        m_baseCoreCollector    = new CBaseCoreCollector();
        m_baseCoresubCollector = new CBaseCoreSubCollector();
        m_baseStartCollector   = new CBaseStartCollector();
        m_baseBlockCollector   = new CBaseBlockCollector();

        m_toolmoduleNavimesh  = new CToolModuleNavimesh();
        m_intervalUnitWalking = new IntervalUnitWalking();

        //@ Initialize
        m_processInput.InitProcessInput(this);
        m_toolmoduleNavimesh.InitNaviMeshTool();
        m_baseTowerCollector.InitBaseCollector();
        m_baseCoreCollector.InitBaseCollector();
        m_baseCoresubCollector.InitBaseCollector();
        m_baseStartCollector.InitBaseCollector();
        m_baseBlockCollector.InitBaseBlockCollector(m_processInput._blockbasetypes.Length);

        //@ Initialize all managers
        bool bResult = false;

        bResult = resetGlobal(_IdxKeyNavi, m_processInput._loadfrom_geometry);
        if (false == bResult)
        {
            Debug.Log("ERROR. resetGlobal().//");
        }

        //@ Application execute mode, which is naviscene or gamescene
        processCycle.APPLICATION_MODE_NAVITOOL = true;

        GameContext gamecontext = GameContext.GetInstance;

        gamecontext.ShowDebugInfo = false;
    } // void Initialize
    } // public void resetGlobal

    //@ Loading All Navi Process From script data.
    protected bool loadingProcess_Binary(int iIdxKeyNavi)
    {
        bool bResultProcess = false;

        m_stageMap.m_Filename = m_datanavimeshs.getNaviMeshName(iIdxKeyNavi);
        bool IsLoadMap = m_stageMap.LoadStage();

        {
            //@ Construct All Triangle
            bResultProcess = resetGlobal_TrianglesAll_LoadBinaryFile(m_meshNavigation_global);
            if (false == bResultProcess)
            {
                Debug.Log("Error. false == bResultProcess.//");
            }

            //@ Set constant objects to start position
            bResultProcess = resetGlobal_constantObjects(m_triCollector, false);
            if (false == bResultProcess)
            {
                Debug.Log("Notice. false==resetGlobal_constantObjects().//");
            }

            //@ Intiailzie basemanets
            {
                LinkTriCollectorToAllBase(ref m_baseTowerCollector,
                                          ref m_baseCoreCollector,
                                          ref m_baseCoresubCollector,
                                          ref m_baseStartCollector,
                                          ref m_baseBlockCollector,
                                          m_triCollector);
            }

            if (true == IsLoadMap)
            {
                //@ BaseTower,BaseCore-Sub,BaseCore
                Load_BaseTower_Binary(ref m_baseTowerCollector);
                Load_BaseCore_Binary(ref m_baseCoreCollector);
                Load_BaseCoreSub_Binary(ref m_baseCoresubCollector);
                Load_BaseStart_Binary(ref m_baseStartCollector);
                Load_BaseBlock_Binary(ref m_baseBlockCollector);

                //@ Load Curve Path through script
                bResultProcess = Load_CurvePath_Binary(ref m_SplineCurve);
                if (false == bResultProcess)
                {
                    Debug.Log("loadingProcess_Binary Load_CurvePath_Binary_error. //");
                }
            }



            //@ Construct Navigation
            bResultProcess = resetGlobal_NavigationCells(m_triCollector, ref m_meshNavigation_global);
            if (false == bResultProcess)
            {
                Debug.Log("Notice. false==resetGlobal_NavigationCells().//");
            }

            //@Initialze UnitWalking
            UnitWalking.SetStatusCellToCell();
        }

        return(true);
    } // protected void loadingProcess_Binary
    public bool resetGlobal(int iIdxKeyNavi, bool bInitFromGeometry)
    {
        if (iIdxKeyNavi < 0)
        {
            return(false);
        }

        _IdxKeyNavi = iIdxKeyNavi;

        bool bResultProcess = false;

        //@ Clear all managers
        bResultProcess = clearGLOBAL(true);
        if (false == bResultProcess)
        {
            Debug.Log("Error. clearGLOBAL()!/////");
        }

        //@ Instantiate NaviMesh
        m_meshNavigation_global = m_datanavimeshs.getNavigationMesh(iIdxKeyNavi);
        m_meshNavigation_global.InitializeNaviMesh();

        m_triCollector = m_meshNavigation_global.triCollector;
        m_SplineCurve  = m_meshNavigation_global.splinecurve;

        if (true == bInitFromGeometry)
        {
            //@ Construct All Triangle
            bResultProcess = resetGlobal_TrianglesAll(m_meshNavigation_global);
            if (false == bResultProcess)
            {
                Debug.Log("Error!.//");
            }

            //@ Set constant objects to start position
            bResultProcess = resetGlobal_constantObjects(m_triCollector, false);
            if (false == bResultProcess)
            {
                Debug.Log("Error!.//");
            }

            //@ Intiailzie basemanets
            LinkTriCollectorToAllBase(ref m_baseTowerCollector,
                                      ref m_baseCoreCollector,
                                      ref m_baseCoresubCollector,
                                      ref m_baseStartCollector,
                                      ref m_baseBlockCollector,
                                      m_triCollector);

            //@ Re-load navi cells from template pre-loads.
            LoadNaviFromTemplate();

            //@ Load bases.
            Load_BaseTower_Binary(ref m_baseTowerCollector);
            Load_BaseCore_Binary(ref m_baseCoreCollector);
            Load_BaseCoreSub_Binary(ref m_baseCoresubCollector);
            Load_BaseStart_Binary(ref m_baseStartCollector);
            Load_BaseBlock_Binary(ref m_baseBlockCollector);

            //@ Load Curve Path through script
            bResultProcess = Load_CurvePath_Binary(ref m_SplineCurve);
            if (false == bResultProcess)
            {
                Debug.Log("loadingProcess_Binary Load_CurvePath_Binary_error. //");
            }

            //@ Construct Navigation
            bResultProcess = resetGlobal_NavigationCells(m_triCollector, ref m_meshNavigation_global);
            if (false == bResultProcess)
            {
                Debug.Log("Error!.//");
            }

            //@Initialze UnitWalking
            UnitWalking.SetStatusCellToCell();
        } // if (true == bInitFromGeometry)
        else
        {
            //@ Load using script.
            loadingProcess_Binary(iIdxKeyNavi);
        } // if (false == bInitFromGeometry)

        //@ Input Process Initialize
        m_processInput.resetInput(this);
        m_intervalUnitWalking.InitIntervalUnitWalking(m_triCollector);

        return(true);
    } // public void resetGlobal
    } // void calculatePosCollision(Vector3 v3DirForceCollide, float fTimeDelta, Vector3 v3PosObject, CNaviMesh meshNavi)

    bool Update_Collision_sameforce(float fTimeDelta, CNaviMesh meshNavi, ref SortedDictionary<int, float> listCollider)
    {
        //@1.Forced setting, Cell wasn't prepared go to way to goal.
        if (false == _bProcessWalking_Static)
        {
            return false;
        }
        //@2.No landing mesh.
        if (null == meshNavi)
        {
            return false;
        }

        UnitPool unitpool = UnitPool.GetInstance;

        //@ 1 more colliders 
        if (listCollider.Count > 0)
        {
            //@ If unit is null, Delete unit from collideList.
            List<UnitWalking> listCollideCollect = new List<UnitWalking>();
            ICollection<int> collectionID = listCollider.Keys;
            List<int> listcollideremove = new List<int>();

            foreach (int idunit in collectionID)
            {
                UnitWalking unitWalking = unitpool[idunit] as UnitWalking;
                if (null == unitWalking)
                {
                    listcollideremove.Add(idunit);
                }
                else
                {
                    if (true == unitWalking.IsUnitDie())
                    {
                        listcollideremove.Add(idunit);
                    }
                    else
                    {
                        float fdistInterEstimate = (unitWalking.m_fRadius_aabb * unitWalking.m_fRadius_aabb + m_fRadius_aabb * m_fRadius_aabb);
                        float fdistInterCurr = (positionUnit - unitWalking.positionUnit).sqrMagnitude;

                        if (fdistInterEstimate > fdistInterCurr)
                        {
                            listCollideCollect.Add(unitWalking);
                        }
                    }
                }
            } // foreach (int idunit in collectionID)

            //@ for safety elimination
            foreach (int idunitremove in listcollideremove)
            {
                listCollider.Remove(idunitremove);
            }

            if (listCollideCollect.Count == 0)
            {
                return false;
            }

            Vector3 v3DirForceCollide = Vector3.zero;
            Vector3 v3PosCurrent = positionUnit, v3PosOther, v3DistanceOther;

            int iCntActualCollide = 0;
            foreach (UnitWalking colliderUnitWalking in listCollideCollect)
            {
                v3PosOther = colliderUnitWalking.positionUnit;
                v3DistanceOther = (positionUnit - v3PosOther).normalized;

                if (colliderUnitWalking.IsUnitAttack())
                {
                    v3DistanceOther = v3DistanceOther.normalized * spdcollision_unit;
                }

                v3DirForceCollide = v3DirForceCollide + v3DistanceOther;
                iCntActualCollide++;
            }

            v3DirForceCollide = v3DirForceCollide.normalized;

            if (Vector3.zero != v3DirForceCollide)
            {
                calculatePosCollision(v3DirForceCollide, fTimeDelta, v3PosCurrent, meshNavi);
            }
        } // if (listCollider.Count > 0)

        return true;
    } // void Update_Collision_sameforce()