public void RemoveWifiPoint(WifiPoint wifiPoint) { if (mWifiPoints.Contains(wifiPoint)) { mWifiPoints.Remove(wifiPoint); } }
private void Update() { if (!mFreeze) { transform.position += mCurrentDirection * mCurrentSpeed * Time.deltaTime; if (_CurrentDistance < mTriggerDistance) { WifiPoint intermediary = mWifiPointTarget; mWifiPointTarget = mWifiPointTarget.GetRandomNextWifiPoint(mOriginPoint); mOriginPoint = intermediary; mCurrentDirection = (mWifiPointTarget.transform.position - mOriginPoint.transform.position).normalized; } } }
/// <summary> /// Returns a random point among the next points available /// </summary> /// <returns></returns> public WifiPoint GetRandomNextWifiPoint(WifiPoint origin) { if (mWifiPoints.Count > 1) { bool mHasFoundNewPoint = false; while (!mHasFoundNewPoint) { int randomIndex = Random.Range(0, mWifiPoints.Count); if (mWifiPoints[randomIndex] != origin) { return(mWifiPoints[randomIndex]); } } } return(origin); }
private void Awake() { sInstance = this; GameManager.OnGameReady += delegate { mFreeze = false; transform.position = WifiManager.sClosestWifiPoint.transform.position; mOriginPoint = WifiManager.sClosestWifiPoint; mWifiPointTarget = mOriginPoint.GetRandomNextWifiPoint(mOriginPoint); mCurrentDirection = (mWifiPointTarget.transform.position - mOriginPoint.transform.position).normalized; SwitchSpeed(); }; SignalScanner.OnBigDisconnection += delegate { mFreeze = true; mCurrentSpeed = 0; CancelInvoke(nameof(SwitchSpeed)); Shader.SetGlobalVector("SignalInfo", new Vector4(transform.position.x, transform.position.z, SignalScanner.sDistanceToBigReconnect, 1)); if (mIndicatorVFX != null) { mIndicatorVFX.transform.position = transform.position; mIndicatorVFX.Play(); } }; SignalScanner.OnBigReconnection += delegate { mFreeze = false; SwitchSpeed(); Shader.SetGlobalVector("SignalInfo", Vector4.zero); if (mIndicatorVFX != null) { mIndicatorVFX.Stop(true, ParticleSystemStopBehavior.StopEmitting); } }; }
private void PlaceWifiPoints() { //Debug.Log("Starting placing wifi points"); int childCount = transform.childCount; for (int i = 1; i < childCount; i++) { DestroyImmediate(transform.GetChild(1).gameObject); } int totalAmount = mSquareAmount * mSquareAmount; //Random IDs for random masking float[] ids = new float[totalAmount]; List <float> test = new List <float>(5); float fraction = 1f / (totalAmount - 1); for (int i = 0; i < totalAmount; i++) { ids[i] = fraction * i; } System.Random rnd = new System.Random(); rnd.Shuffle <float>(ids); //Debug.Log("IDs after randomization:" + ids.ToString()); List <WifiPoint> wifiPoints = new List <WifiPoint>(totalAmount); #region Random Placing float singleDistance = 1f / (mSquareAmount - 1) * mDistance * 2; Vector3 startingPoint = transform.position - mDistance * Vector3.right - mDistance * Vector3.forward; for (int i = 0; i < mSquareAmount; i++) { for (int j = 0; j < mSquareAmount; j++) { float randomX = mOffsetIntensityCurve.Evaluate(Random.value) * mRandomMaxOffset * (Random.value < 0.5 ? -1 : 1); float randomZ = mOffsetIntensityCurve.Evaluate(Random.value) * mRandomMaxOffset * (Random.value < 0.5 ? -1 : 1); Vector3 actualPosition = startingPoint + Vector3.right * (singleDistance * (j + randomX)) + Vector3.forward * (singleDistance * (i + randomZ)); WifiPoint newPoint = Instantiate(mPrefab, actualPosition, Quaternion.identity, transform).GetComponent <WifiPoint>(); newPoint.mIDMask = ids[i * mSquareAmount + j]; newPoint.mIDCounter = i * mSquareAmount + j; wifiPoints.Add(newPoint); //Debug.LogFormat("Placed a new point at {0} with ID {1}, actual number {2}", actualPosition, newPoint.mIDMask, i * mSquareAmount + j); } } #endregion #region Random Masking for (int i = 0; i < wifiPoints.Count; i++) { if (wifiPoints[i].mIDMask < mRandomMask) { //Debug.LogFormat("Destroying the point number {0} with an ID of {1}", i, wifiPoints[i].mIDMask); DestroyImmediate(wifiPoints[i].gameObject); wifiPoints.RemoveAt(i); i--; } } #endregion #region Removing points too close one another RaycastHit[] hitInfos; for (int i = 0; i < wifiPoints.Count; i++) { hitInfos = Physics.SphereCastAll(wifiPoints[i].transform.position, mMinDistanceBetweenPoints, Vector3.up, 0.1f, _WifiLayerMask); foreach (RaycastHit hit in hitInfos) { WifiPoint wifiRef = hit.collider.GetComponent <WifiPoint>(); int ID = wifiRef.mIDCounter; //Debug.LogFormat("Point {0} was too close so it's been removed", ID); DestroyImmediate(hit.collider.gameObject); wifiPoints.Remove(wifiRef); } } #endregion #region Removing pounts out of range distance Vector2 maxXranges = Vector2.one * transform.position.x - Vector2.right * mDistance + Vector2.up * mDistance; Vector2 maxZranges = Vector2.one * transform.position.z - Vector2.right * mDistance + Vector2.up * mDistance; for (int i = 0; i < wifiPoints.Count; i++) { if (!maxXranges.WithinRange(wifiPoints[i].transform.position.x) || !maxZranges.WithinRange(wifiPoints[i].transform.position.z)) { int ID = wifiPoints[i].mIDCounter; DestroyImmediate(wifiPoints[i].gameObject); wifiPoints.RemoveAt(i); i--; //Debug.LogFormat("Removed point {0} because it was out of range", ID); } } #endregion #region Link points float closestDistance = Vector3.Distance(wifiPoints[0].transform.position, transform.position); WifiPoint closestPoint = wifiPoints[0]; for (int i = 0; i < wifiPoints.Count; i++) { WifiPoint currentPoint = wifiPoints[i]; if (i != 0) { float currentDistance = Vector3.Distance(wifiPoints[i].transform.position, transform.position); if (currentDistance < closestDistance) { closestDistance = currentDistance; closestPoint = wifiPoints[i]; } } List <WifiPoint> currentLinkedPoints = new List <WifiPoint>(); for (int j = 0; j < wifiPoints.Count; j++) { WifiPoint currentSubPoint = wifiPoints[j]; if (j != i && Vector3.Distance(currentSubPoint.transform.position, currentPoint.transform.position) < mMaxDistanceLinkBetweenPoints) { currentLinkedPoints.Add(currentSubPoint); } } currentPoint.mWifiPoints = currentLinkedPoints; } sClosestWifiPoint = closestPoint; #endregion }