예제 #1
0
 public StickyCollisionsInfos(GameObject _Gobject, ISticky _GIStickyRef)
 {
     Gobject     = _Gobject;
     GIStickyRef = _GIStickyRef;
     StickyRay   = 0;
     Sticky      = false;
 }
예제 #2
0
    /// <summary>
    /// Funzione che controlla e manda gli eventi di Sticky/StickyEnd
    /// </summary>
    public void StickyBehaviour()
    {
        //Calcolo lo spazio tra un ray e l'altro
        if (CurrentState == State.InPool)
        {
            return;
        }

        Direction hitDirection           = GetHitDirection();
        int       rayRequiredStuckObject = (hitDirection == Direction.Above || hitDirection == Direction.Below) ? horizontalRayRequiredStuckObject : verticalRayRequiredStuckObject;

        //Determina la lunghezza del raycast
        float rayLenght = 0.1f;

        //Ciclo tutti i ray
        for (int i = 0; i < checkStuckedObjectsRayCount; i++)
        {
            //Determina il punto da cui deve partire il ray
            Vector3 rayOrigin = leftPoint.position;
            rayOrigin += transform.right.normalized * (checkStuckedObjectsRaySpacing * i);

            //Imposto i parametri per il linecast
            RaycastHit hit;
            Ray        ray         = new Ray(rayOrigin, transform.up.normalized);
            Vector3    endPosition = rayOrigin + transform.up.normalized * rayLenght;

            //Eseguo il linecast
            if (Physics.Raycast(ray, out hit, rayLenght, layersWhichCanBeStucked))
            {
                Debug.DrawLine(rayOrigin, endPosition, Color.red);

                //Se colpisco qualcosa che rientra nei layer stuck
                GameObject objectHit = hit.transform.gameObject;

                if ((objectHit.layer == LayerMask.NameToLayer("Player") || objectHit.layer == LayerMask.NameToLayer("PlayerImmunity")) && objectHit.transform.parent != null)
                {
                    objectHit = objectHit.transform.parent.gameObject;
                }

                if (tempImmunityObjectList.Contains(objectHit))
                {
                    continue;
                }

                StickyCollisionsInfos stickyInfo = stickyList.FirstOrDefault(g => g.Gobject == objectHit);

                //Controllo se è presente nella lista
                if (stickyInfo == null)
                {
                    //Se non è presente controllo che sia un oggetto ISticky
                    ISticky stickyRef = objectHit.GetComponent <ISticky>();

                    if (stickyRef != null)
                    {
                        //Se lo è creo un nuovo StickyCollisionsInfos con i dati del GameObject e lo aggiunto alla lista
                        stickyInfo = new StickyCollisionsInfos(objectHit, stickyRef);
                        stickyInfo.StickyRay++;
                        stickyList.Add(stickyInfo);
                    }
                }
                else
                {
                    //Se è resente aumento i ray che lo colpiscono di uno
                    stickyInfo.StickyRay++;
                }
            }

            Debug.DrawLine(rayOrigin, endPosition, Color.blue);
        }

        //Calcolo la velocity
        CalculateVelocity();

        //Ciclo tutti gli oggetti con cui sono in collisione
        for (int i = stickyList.Count - 1; i >= 0; i--)
        {
            //Se i ray che colpiscono l'oggetto sono maggiori di quelli necessari e non è ancora incolllato
            if (stickyList[i].StickyRay >= rayRequiredStuckObject && !stickyList[i].Sticky)
            {
                //Lo incollo chiamo la callback comunicando la direzione in cui si è bloccati
                stickyList[i].Sticky = true;
                stickyList[i].GIStickyRef.OnSticky(GetHitDirection());
            }
            //Se i ray che colpiscono l'oggetto sono minori di quelli necessari e sono incollato
            else if (stickyList[i].StickyRay < rayRequiredStuckObject && stickyList[i].Sticky)
            {
                //Lo scollo chiamo la callback di fine sticky
                stickyList[i].Sticky = false;
                stickyList[i].GIStickyRef.OnStickyEnd();
                StartCoroutine(DelayTempListCoroutine(stickyList[i].Gobject));
            }
            //Se i ray che colpiscono l'oggetto sono 0
            else if (stickyList[i].StickyRay == 0)
            {
                //Rimuovo l'oggetto dalla lista
                stickyList.RemoveAt(i);
                continue;
            }

            //Muovo l'oggetto attaccato se velocity > 0
            if (!float.IsNaN(velocity.x) && velocity != Vector3.zero)
            {
                MovePassenger(stickyList[i].Gobject.transform, velocity * Time.deltaTime);
            }

            //Azzero i ray che colpiscono l'oggetto
            stickyList[i].StickyRay = 0;
        }
    }