public StickyCollisionsInfos(GameObject _Gobject, ISticky _GIStickyRef) { Gobject = _Gobject; GIStickyRef = _GIStickyRef; StickyRay = 0; Sticky = false; }
/// <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; } }