Vector3 CheckNavPathAndTarget(Vector3 target, Vector3 current, float size, TargetState state, long uid, ref NavPathData path)
        {
            if (pointsDic.ContainsKey(uid) == false)
            {
                pointsDic[uid] = new Vector3[256];
            }

            var points = pointsDic[uid];

            if (path.IsSetData == false || (target - path.target).sqrMagnitude > checkRange * checkRange)
            {
                NavMeshUtils.GetNavPoint(current, target, size, WalkableNavArea, out var count, points);
                if (count > 0)
                {
                    path.count   = count;
                    path.current = 0;
                    path.target  = target;
                    return(path.GetCurrentCorner(points));
                }
            }
            else
            {
                if ((path.GetCurrentCorner(points) - current).sqrMagnitude < size * size)
                {
                    path.Next();
                }

                return(path.GetCurrentCorner(points));
            }

            return(target);
        }
        private void SyncTroop(Dictionary <EntityId, SimpleUnit> simpleUnits, Transform trans)
        {
            UnityEngine.Profiling.Profiler.BeginSample("SyncTroop");
            var pos = trans.position;
            var rot = trans.rotation;

            var posDiff = MovementDictionary.SleepPosDiff;
            var rotDiff = MovementDictionary.SleepRotDiff;

            foreach (var kvp in simpleUnits)
            {
                UnitTransform unit = null;
                if (TryGetComponentObject(kvp.Key, out unit) == false)
                {
                    continue;
                }

                var t      = unit.transform.parent;
                var buffer = unit.BufferVector.magnitude;

                var p      = GetGrounded(pos + rot * kvp.Value.RelativePos.ToUnityVector(), buffer);
                var p_diff = p - t.position;
                if (p_diff.sqrMagnitude >= posDiff * posDiff)
                {
                    t.position = NavMeshUtils.GetNavPoint(t.position, p, unit.Bounds.size.magnitude, WalkableNavArea);
                }

                var r      = kvp.Value.RelativeRot.ToUnityQuaternion() * rot;
                var r_diff = Vector3.Angle(t.forward, r * Vector3.forward);
                if (r_diff > rotDiff)
                {
                    t.rotation = r;
                }
            }

            UnityEngine.Profiling.Profiler.EndSample();
        }