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(); }