private void adjustPositionOverlap()
    {
        ContactFilter2D filter = new ContactFilter2D();

        filter.layerMask    = LayerMask.GetMask("Enemies");
        filter.useLayerMask = true;
        Collider2D[] results = new Collider2D[10];
        bodyCollider.OverlapCollider(filter, results);
        foreach (var result in results)
        {
            if (result)
            {
                if (result.tag.Contains("Skeleton"))
                {
                    if (Math.Sign(transform.localScale.x) == Math.Sign(result.gameObject.transform.localScale.x))
                    {
                        float rand = UnityEngine.Random.value;
                        if (rand <= 0.5)
                        {
                            MoveBackward();

                            if (isAlerted && canSeePlayer())
                            {
                                FacePlayer();
                            }
                        }
                    }
                }
            }
        }
    }
Exemple #2
0
    void Fight()
    {
        ContactFilter2D contactFilter = new ContactFilter2D();

        contactFilter.SetLayerMask(LayerMask.GetMask("Enemy"));

        int numColliders = 10;

        Collider2D[] colliders = new Collider2D[numColliders];
        playerCC.OverlapCollider(contactFilter, colliders);

        timeLeft -= Time.deltaTime;
        if (!timerOn)
        {
            timerOn = true; timeLeft = .3f; animator.SetTrigger("Fight");
        }
        if (timerOn && timeLeft <= 0)
        {
            timerOn = false;
        }

        if (colliders[0] != null)
        {
            if (colliders.Any(x => x.GetComponent <Monster>()))
            {
                Monster monster; monster = colliders[0].GetComponent <Monster>(); monster.ReceiveDamage();
            }
        }

        attack = false;
    }
Exemple #3
0
        private void HandleTriggers()
        {
            //set up the filter.
            ContactFilter2D filter = new ContactFilter2D();

            filter.useTriggers = true;
            filter.layerMask   = groundMask;
            Collider2D[] results = new Collider2D[5];
            //get the overlap of this collider with others.
            Physics2D.queriesHitTriggers = true;
            int c = collider.OverlapCollider(filter, results);

            //reset the verify buffer
            triggerVerifyBuffer.Clear();

            for (int i = 0; i < c; i++)
            {
                var col = results[i];
                //handle trigger colliders.
                if (col.isTrigger)
                {
                    int triggerID = col.GetInstanceID();
                    triggerVerifyBuffer.Add(triggerID);
                    //trigger not yet registered?
                    if (!knownTriggers.Contains(triggerID))
                    {
                        //a benefit of writing our own "custom physics" is that we can exchange this for, or just add entirely new messages or events.
                        col.SendMessage("OnTriggerEnter2D", collider, SendMessageOptions.DontRequireReceiver);
                        instanceIDToCollider.Add(triggerID, col);
                        //print("found trigger");
                        knownTriggers.Add(triggerID);
                    }
                }
            }

            //verify knownTriggers with the buffer.
            //I know linq ew, but its much simpler rn, not too concerned with optimization, this game is super small.
            //knownTriggers = new List<int>(knownTriggers.Where(item => triggerVerifyBuffer.Contains(item)));
            //Send OnTriggerExit2D to any objects required.
            List <int> verifiedTriggers = new List <int>(5);

            int triggerCount = knownTriggers.Count;

            for (int i = 0; i < triggerCount; i++)
            {
                int id = knownTriggers[i];
                if (triggerVerifyBuffer.Contains(id))
                {
                    verifiedTriggers.Add(id);
                }
                else
                {
                    instanceIDToCollider[id].SendMessage("OnTriggerExit2D", collider, SendMessageOptions.DontRequireReceiver);
                    instanceIDToCollider.Remove(id);
                }
            }
            knownTriggers = verifiedTriggers;
        }
Exemple #4
0
    // Path points

    void LoadPoints(PathTemplate template)
    {
        points.Clear();

        // Create a lookup table of all points, indexed by local position.
        foreach (Transform point in template.transform)
        {
            if (point.CompareTag("Point"))
            {
                points[point.localPosition] = new Point()
                {
                    position    = point.position,
                    connections = new List <Point>(),
                };
            }
        }

        // For each line, find and connect the points touching its collider.
        LayerMask       pointMask   = LayerMask.GetMask("Points");
        ContactFilter2D pointFilter = new ContactFilter2D();

        pointFilter.SetLayerMask(pointMask);

        foreach (Transform line in template.transform)
        {
            if (line.CompareTag("Line"))
            {
                Vector2           lineVector   = line.localRotation * line.localScale;
                CapsuleCollider2D lineCollider = line.GetComponent <CapsuleCollider2D>();
                lineCollider.size = new Vector2(1, 1 + 1 / line.localScale.y);

                // Find all point colliders touching the line.
                Collider2D[] pointColls = new Collider2D[10];
                lineCollider.OverlapCollider(pointFilter, pointColls);

                // Convert to a list of points touching the line, ordered by their position along the line.
                Point[] linePoints = pointColls
                                     .Where(coll => coll != null && coll.transform.parent == template.transform)
                                     .Select(coll => points[coll.transform.localPosition])
                                     .OrderBy(point => Vector2.Dot(point.position - line.position, lineVector))
                                     .ToArray();

                // Connect each point to its adjacent points.
                for (int i = 0; i < linePoints.Length; i++)
                {
                    if (i > 0)
                    {
                        linePoints[i].connections.Add(linePoints[i - 1]);
                    }
                    if (i < linePoints.Length - 1)
                    {
                        linePoints[i].connections.Add(linePoints[i + 1]);
                    }
                }
            }
        }
    }
Exemple #5
0
 public void Attack()
 {
     Collider2D[] colliders = new Collider2D[1];
     if (capsuleCollider.OverlapCollider(filter, colliders) > 0)
     {
         PlayerController player = colliders[0].GetComponent <PlayerController>();
         if (player != null)
         {
             player.GetDamage(damage);
         }
     }
 }
Exemple #6
0
    // Update is called once per frame
    protected virtual void Update()
    {
        // rilevo collisioni
        capsuleCollider.OverlapCollider(filter, hits);
        // itero le collisioni rilevate, applico l'azione in base alla collisione e pulisco l'array delle collisioni
        for (int i = 0; i < hits.Length; i++)
        {
            if (hits[i] == null)
            {
                continue;
            }

            OnCollide(hits[i]);

            hits[i] = null;
        }
    }
Exemple #7
0
    private void Update()
    {
        results = new Collider2D[20];
        check.OverlapCollider(filter, results);

        for (int i = 0; i < results.Length; i++)
        {
            if (results[i] != null)
            {
                if (results[i].gameObject.tag == "interactable")
                {
                    if (results[i].gameObject.GetComponent <Door>() != null)
                    {
                        if (!in_proximity.Contains(results[i].gameObject))
                        {
                            results[i].gameObject.GetComponent <Door>().showArrow(true);
                            in_proximity.Add(results[i].gameObject);
                        }
                    }
                }
            }
        }

        prox = false;

        if (in_proximity.Count > 0)
        {
            for (int j = 0; j < results.Length; j++)
            {
                if (results[j] != null)
                {
                    if (in_proximity[0] == results[j].gameObject)
                    {
                        prox = true;
                    }
                }
            }

            if (!prox)
            {
                in_proximity[0].gameObject.GetComponent <Door>().showArrow(false);
                in_proximity.Remove(in_proximity[0]);
            }
        }
    }
Exemple #8
0
    private void HandleJumping()
    {
        if (isJumping)
        {
            // If we're already jumping, see if we need to continue
            isJumpingHitsCount = _c.OverlapCollider(isJumpingFilter, isJumpingHits);
            isForcedJumping    = false;
            for (int i = 0; i < isJumpingHitsCount; i++)
            {
                if (isJumpingHits[0].gameObject.layer == LayerManager.Water)
                {
                    isForcedJumping = true;
                    break;
                }
            }

            if (!isForcedJumping)
            {
                isJumping = Input.GetButton(JUMP_BUTTON);
            }
        }
        else
        {
            isJumping = Input.GetButton(JUMP_BUTTON);
        }

        if (isJumping)
        {
            GameState.SpendFuel(JumpFuelCost * Time.deltaTime);
        }

        gameObject.layer = isJumping ? LayerManager.PlayerJumping : LayerManager.Player;

        if (isJumping)
        {
            Soundboard.PlayThrusters(Time.deltaTime, 0.25f);
        }
        else
        {
            Soundboard.ResetThrusters();
        }
    }
Exemple #9
0
    public List <GameObject> interaction()
    {
        results = new Collider2D[30];
        check.OverlapCollider(filter, results);
        return_objects = new List <GameObject>();

        for (int i = 0; i < results.Length; i++)
        {
            if (results[i] != null)
            {
                if (results[i].gameObject.tag == "interactable")
                {
                    if (results[i].gameObject.GetComponent <Interactable>() != null)
                    {
                        return_objects.Add(results[i].gameObject);
                    }
                }
            }
        }
        return(return_objects);
    }
Exemple #10
0
    // --------------------------------------
    #region Collision Avoidance - both TCAS and MTCD
    void TCASCollisionCheck()
    {
        // Debug.Log("Check called");

        TCASThreatList.Clear();

        ContactFilter2D filter = new ContactFilter2D();

        filter.SetLayerMask(TCASLayerMask);
        Collider2D[] contacts = new Collider2D[10];

        int tcasObjects = tcas.OverlapCollider(filter, contacts);


        if (tcasObjects <= 1)
        {
            rightTCASThrust     = 0f;
            leftTCASThrust      = 0f;
            forwardTCASThrust   = 0f;
            backwardsTCASThrust = 0f;
            return;
        }
        // Debug.Log("TCAS contacts " + (tcasObjects - 1) + " " + contacts.Length);
        // Put all valid threats into CollisionThreat list

        for (int i = 0; i < tcasObjects; i++)
        {
            if (contacts[i] && contacts[i].gameObject.name != gameObject.name)
            {
                // Debug.Log("TCAS contact: " + contacts[i].name);
                TCASthreatPosition.x = gameObject.transform.InverseTransformPoint(contacts[i].transform.position).x;
                TCASthreatPosition.y = gameObject.transform.InverseTransformPoint(contacts[i].transform.position).y;
                // threatVelocity.x = gameObject.transform.InverseTransformDirection(contacts[i].GetComponent<Rigidbody2D>().velocity).x;
                // threatVelocity.y = gameObject.transform.InverseTransformDirection(contacts[i].GetComponent<Rigidbody2D>().velocity).y;
                TCASThreatList.Add(new NTools.CollisionThreat(TCASthreatPosition, TCASthreatPosition, TCASthreatVelocity, 0f, 0f));
            }
        }
        // Work through CollisonThreat list and produce TCASThrusts
        if (TCASThreatList.Count != 0)
        {
            // zeroing the previous avoiding values
            rightTCASThrust     = 0f;
            leftTCASThrust      = 0f;
            forwardTCASThrust   = 0f;
            backwardsTCASThrust = 0f;

            for (int i = 0; i < TCASThreatList.Count; i++)
            {
                // Debug.Log("In the TCAS final loop");
                // get inline avoidance thrust
                if (TCASThreatList[i].threatCoordinates.y > 0f)
                {
                    backwardsTCASThrust += (5 - TCASThreatList[i].threatCoordinates.y) / 3f;
                }
                else if (TCASThreatList[i].threatCoordinates.y < 0f)
                {
                    forwardTCASThrust += (5 + TCASThreatList[i].threatCoordinates.y) / 4f;
                }

                // get lateral avoidance thrust
                if (TCASThreatList[i].threatCoordinates.x > 0f)
                {
                    leftTCASThrust += (5 - TCASThreatList[i].threatCoordinates.x) / 2f;
                }
                else if (TCASThreatList[i].threatCoordinates.x < 0f)
                {
                    rightTCASThrust += (5 + TCASThreatList[i].threatCoordinates.x) / 2f;
                }
            }
        }
    }
Exemple #11
0
    // Update is called once per frame
    void Update()
    {
        horizontalMove = Input.GetAxisRaw("Horizontal");

        if (horizontalMove < 0)
        {
            spriteRenderer.flipX = true;
        }
        else if (horizontalMove > 0)
        {
            spriteRenderer.flipX = false;
        }

        animator.SetFloat("Speed", Mathf.Abs(horizontalMove));

        verticalMove = Input.GetAxisRaw("Vertical");

        if (verticalMove < 0)
        {
            animator.SetBool("IsCrouching", true);
            capsuleCollider.offset = new Vector2(capsuleCollider.offset.x, startColliderOffsetY + 0.3f);
        }
        else
        {
            animator.SetBool("IsCrouching", false);
            capsuleCollider.offset = new Vector2(capsuleCollider.offset.x, startColliderOffsetY);

            if (verticalMove > 0)
            {
                if (canClimb)
                {
                    climb = true;
                    animator.SetBool("IsClimbing", true);
                }
                else
                {
                    capsuleCollider.OverlapCollider(new ContactFilter2D().NoFilter(), overlapColliders);

                    foreach (Collider2D col in overlapColliders)
                    {
                        if (col != null && col.tag == "Lever")
                        {
                            col.SendMessage("Pull");
                        }
                    }
                }
            }
            else
            {
                climb = false;
                animator.SetBool("IsClimbing", false);
            }
        }

        if (Input.GetButtonDown("Jump") && (jumpCount < 2))
        {
            jump = true;
            animator.SetBool("IsJumping", true);
            jumpCount++;
        }

        timeLeft -= Time.deltaTime;
        int timeLeftInt = (int)timeLeft;

        timeText.text = timeLeftInt.ToString();

        if (timeLeft <= 0)
        {
            timeLeft = levelTime;

            if (livesCount > 0)
            {
                LoseALife();
            }
            else
            {
                Debug.Log("Lost the game");
            }
        }
    }
    void Update()
    {
        if (!hasAuthority)
        {
            return;
        }

        //Attack
        if (Input.GetKeyDown(KeyCode.X))
        {
            if (flower)
            {
                int horizontal = (int)Input.GetAxisRaw("Horizontal");
                if (Input.GetKey(KeyCode.UpArrow))
                {
                    switch (horizontal)
                    {
                    case -1:
                        CmdFireBall(150);
                        break;

                    case 0:
                        CmdFireBall(90);
                        break;

                    case 1:
                        CmdFireBall(30);
                        break;
                    }
                }
                else
                {
                    switch (horizontal)
                    {
                    case -1:
                        CmdFireBall(180);
                        break;

                    case 0:
                        CmdFireBall(spriteRenderer.flipX ? 180 : 0);
                        break;

                    case 1:
                        CmdFireBall(0);
                        break;
                    }
                }
            }
            else
            {
                //Play an attack animation
                anim.SetTrigger("Attack");
                anim.animator.SetTrigger("Attack");

                CmdAttack();
            }
        }

        //Stop Speed
        if (Input.GetButtonUp("Horizontal"))
        {
            rigid.velocity = new Vector2(rigid.velocity.normalized.x * 0.5f, rigid.velocity.y);
        }

        //Direction Sprite
        if (Input.GetButton("Horizontal"))
        {
            bool newFlipX = Input.GetAxisRaw("Horizontal") == -1;
            if (spriteRenderer.flipX != newFlipX)
            {
                CmdFlipX(newFlipX);
            }
        }

        //Animation
        if (Mathf.Abs(rigid.velocity.x) < 0.3)
        {
            anim.animator.SetBool("isWalking", false);
        }
        else
        {
            anim.animator.SetBool("isWalking", true);
        }

        if (isJumping && !isPassing)
        {
            ContactFilter2D contactFilter = new ContactFilter2D();
            contactFilter.SetLayerMask(LayerMask.GetMask("Platform"));
            Collider2D[] results = new Collider2D[9];

            if (capsuleCollider.OverlapCollider(contactFilter, results) != 0)
            {
                if (gameObject.layer == 10) // Player
                {
                    gameObject.layer = 13;  // PlayerPassing
                }
                else
                {
                    gameObject.layer = 14; // PlayerPassingDamaged
                }
                isPassing = true;
            }
        }
        else if (isPassing)
        {
            ContactFilter2D contactFilter = new ContactFilter2D();
            contactFilter.SetLayerMask(LayerMask.GetMask("Platform"));
            Collider2D[] results = new Collider2D[9];

            if (capsuleCollider.OverlapCollider(contactFilter, results) == 0)
            {
                if (gameObject.layer == 13) // PlayerPassing
                {
                    gameObject.layer = 10;  // Player
                }
                else
                {
                    gameObject.layer = 11; // PlayerDamaged
                }
                isPassing = false;
            }
        }

        //Jump
        if (Input.GetButtonDown("Jump") && !isJumping)
        {
            rigid.position += Vector2.up * 0.2f;
            rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
            isJumping = true;
            anim.animator.SetBool("isJumping", true);
        }

        if (Input.GetKeyDown(KeyCode.DownArrow) && !isPassing && transform.position.y > 1)
        {
            if (gameObject.layer == 10) // Player
            {
                gameObject.layer = 13;  // PlayerPassing
            }
            else
            {
                gameObject.layer = 14; // PlayerPassingDamaged
            }
            isPassing = true;
        }
    }
Exemple #13
0
    // checks all unfriendly contacts in the collider and updates bogie list
    void Ping()
    {
        bool  bogieListed = false;
        float distance    = 0f;

        ContactFilter2D filter = new ContactFilter2D();

        switch (teamSide)
        {
        case TeamManager.TeamSide.green:
            filter.SetLayerMask(redLayerMask);
            break;

        case TeamManager.TeamSide.red:
            filter.SetLayerMask(greenLayerMask);
            break;
        }

        Collider2D[] contacts = new Collider2D[100];


        int nrContacts = radarCollider.OverlapCollider(filter, contacts);

        if (nrContacts == 0)
        {
            return;
        }

        for (int i = 0; i < nrContacts; i++)
        {
            bogieListed = false;

            // Debug.Log("Collider go name: " + contacts[i].gameObject.name);

            // check listed bogies for match
            for (int j = 0; j < radarBogies.Count; j++)
            {
                contacts[i].gameObject.GetComponentInChildren <RadarController>().IncomingRWR(gameObject.transform.position, gameObject.transform.parent.gameObject);

                // if matched bogie found, update time and distance
                if (radarBogies[j].bogieObject != null)
                {
                    if (contacts[i].gameObject == radarBogies[j].bogieObject)
                    {
                        radarBogies[j].timeOfContact = Time.timeSinceLevelLoad;
                        radarBogies[j].sqrDistance   = Vector3.SqrMagnitude(contacts[i].transform.position - gameObject.transform.position);
                        bogieListed = true;
                        break;
                    }
                }
                else if (radarBogies[i].bogieObject == null)
                {
                    radarBogies.RemoveAt(i);
                }
            }

            // if the bogie was not found in the list, add it with all data
            if (!bogieListed && contacts[i].gameObject != null)
            {
                distance = (contacts[i].gameObject.transform.position - gameObject.transform.position).magnitude;
                float detectability = 1f;

                if (contacts[i].GetComponent <ShipController>() != null)
                {
                    detectability = contacts[i].GetComponent <ShipController>().detectability;
                }
                else if (contacts[i].GetComponent <StationAI>() != null)
                {
                    detectability = contacts[i].GetComponent <StationAI>().detectability;
                }

                if (contacts[i].GetComponent <ShipController>())
                {
                    if (contacts[i].GetComponent <ShipController>().detectability *radarRange > distance)
                    {
                        radarBogies.Add(new Bogie(
                                            contacts[i].gameObject,
                                            Time.timeSinceLevelLoad,
                                            Vector3.SqrMagnitude(contacts[i].transform.position - gameObject.transform.position)
                                            ));
                    }
                }
            }
        }
    }