예제 #1
0
 public void RemoveWifiPoint(WifiPoint wifiPoint)
 {
     if (mWifiPoints.Contains(wifiPoint))
     {
         mWifiPoints.Remove(wifiPoint);
     }
 }
예제 #2
0
 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;
         }
     }
 }
예제 #3
0
 /// <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);
 }
예제 #4
0
    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);
            }
        };
    }
예제 #5
0
    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
    }