예제 #1
0
    void ClickHandler(Vector2 pos)
    {
        Ray        ray = Camera.main.ScreenPointToRay(pos);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit))
        {
            if (hit.transform.tag == "PlayerField")
            {
                if (currentPlayerEnergy > player.energyCost)
                {
                    currentPlayerEnergy -= player.energyCost;
                    if (player.isAtk)
                    {
                        GameObject soldierObjPlayer = Instantiate(soldierAtkPrefab, hit.point, Quaternion.identity, gameplayComponents.transform);
                        SoldierAtk s = soldierObjPlayer.GetComponent <SoldierAtk>();
                        s.ball = ballObj;
                        s.Soldier.SetAttr(true);
                        s.Soldier.GameManager = this;
                        AtkSoldiers.Add(s);
                    }
                    else
                    {
                        GameObject soldierObj = Instantiate(soldierDefPrefab, hit.point, Quaternion.identity, gameplayComponents.transform);
                        SoldierDef s          = soldierObj.GetComponent <SoldierDef>();
                        s.Soldier.SetAttr(true);
                        s.Soldier.GameManager = this;
                        DefSoldiers.Add(s);
                    }
                }
            }
            else if (hit.transform.tag == "EnemyField")
            {
                if (currentEnemyEnergy > enemy.energyCost)
                {
                    currentEnemyEnergy -= enemy.energyCost;
                    if (enemy.isAtk)
                    {
                        GameObject soldierObjEnemy = Instantiate(soldierAtkPrefab, hit.point, Quaternion.Euler(0, 180, 0), gameplayComponents.transform);
                        SoldierAtk s = soldierObjEnemy.GetComponent <SoldierAtk>();
                        s.ball = ballObj;
                        s.Soldier.SetAttr(false);
                        s.Soldier.GameManager = this;
                        AtkSoldiers.Add(s);
                    }
                    else
                    {
                        GameObject soldierObjEnemy = Instantiate(soldierDefPrefab, hit.point, Quaternion.Euler(0, 180, 0), gameplayComponents.transform);
                        SoldierDef s = soldierObjEnemy.GetComponent <SoldierDef>();
                        s.Soldier.SetAttr(false);
                        s.Soldier.GameManager = this;
                        DefSoldiers.Add(s);
                    }
                }
            }
        }
    }
예제 #2
0
    void Update()
    {
        if (Globals.gamePaused)
        {
            Soldier.animator.SetBool("Run", false);
            return;
        }
        if (Soldier.isActive)
        {
            // if detect atker: chase
            if (target != null)
            {
                Soldier.animator.SetBool("Run", true);
                transform.position = Vector3.MoveTowards(transform.position, target.transform.position, Params.speedNormalMultiplierDef * Time.deltaTime);

                // while chasing: hide the DetectionArea
                DetectionArea.SetActive(false);

                // if caught the Atker
                if (targetCaught)
                {
                    Soldier.animator.SetBool("Run", false);
                    Soldier.SetStatus(false);
                    Soldier.SetKinematic(true);
                    StartCoroutine(Reactivate());
                }
                else
                {
                    // If other Defers caught the Atker target while chasing, return
                    // to the origin position and let any Soldiers pass through
                    // This sounds unreal, but matches the fact that
                    // *The Detection circle is only available at Standby state*
                    if (target.isCaught)
                    {
                        Soldier.SetStatus(false);
                        Soldier.SetKinematic(true);
                        returning = true;
                    }
                }
            }
        }
        if (returning)
        {
            Soldier.animator.SetBool("Run", true);
            transform.position = Vector3.MoveTowards(transform.position, Soldier.originPos, Params.speedReturnMultiplier * Time.deltaTime);
            if (transform.position == Soldier.originPos)
            {
                Soldier.animator.SetBool("Run", false);
                returning = false;
                target    = null;
                Soldier.SetStatus(true);
                Soldier.SetKinematic(false);
                DetectionArea.SetActive(true);
            }
        }
    }
예제 #3
0
 void OnTriggerEnter(Collider other)
 {
     if (other.tag == "SoldierAtk")
     {
         SoldierAtk soldier = other.transform.parent.GetComponent <SoldierAtk>();
         if (GameManager.ballHolder == soldier.Soldier)
         {
             soldierDef.target = soldier;
         }
     }
 }
예제 #4
0
    void OnCollisionEnter(Collision collision)
    {
        if (gameObject.tag == "SoldierDef" && collision.gameObject.tag == "SoldierAtk")
        {
            SoldierDef soldierDef = transform.parent.GetComponent <SoldierDef>();
            SoldierAtk soldierAtk = collision.transform.parent.GetComponent <SoldierAtk>();

            if (transform.parent.GetComponent <SoldierDef>().target == soldierAtk)
            {
                soldierDef.targetCaught = true;
                soldierAtk.isCaught     = true;
            }
        }
    }
예제 #5
0
    void Update()
    {
        if (Globals.gamePaused)
        {
            Soldier.animator.SetBool("Run", false);
            return;
        }
        if (Soldier.isActive)
        {
            if (target != null)
            {
                Soldier.animator.SetBool("Run", true);
                transform.position = Vector3.MoveTowards(transform.position, target.transform.position, Params.speedNormalMultiplierDef * Time.deltaTime);

                DetectionArea.SetActive(false);

                if (targetCaught)
                {
                    Soldier.animator.SetBool("Run", false);
                    Soldier.SetStatus(false);
                    Soldier.SetKinematic(true);
                    StartCoroutine(Reactivate());
                }
                else
                {
                    if (target.isCaught)
                    {
                        Soldier.SetStatus(false);
                        Soldier.SetKinematic(true);
                        returning = true;
                    }
                }
            }
        }
        if (returning)
        {
            Soldier.animator.SetBool("Run", true);
            transform.position = Vector3.MoveTowards(transform.position, Soldier.originPos, Params.speedReturnMultiplier * Time.deltaTime);
            if (transform.position == Soldier.originPos)
            {
                Soldier.animator.SetBool("Run", false);
                returning = false;
                target    = null;
                Soldier.SetStatus(true);
                Soldier.SetKinematic(false);
                DetectionArea.SetActive(true);
            }
        }
    }
예제 #6
0
 void Update()
 {
     if (Globals.gamePaused)
     {
         return;
     }
     if (transform.parent == null && passedTo != null)
     {
         transform.position = Vector3.MoveTowards(transform.position, passedTo.transform.position, moveSpeed * Time.deltaTime);
         if (transform.position == passedTo.transform.position)
         {
             passedTo = null;
         }
     }
 }
예제 #7
0
    SoldierAtk GetNearestAtker()
    {
        float      minDistance    = float.PositiveInfinity;
        SoldierAtk potentialAtker = null;

        foreach (SoldierAtk soldierAtk in GameManager.AtkSoldiers)
        {
            if (!soldierAtk.Soldier.isActive || soldierAtk == this)
            {
                continue;
            }
            float distance = Vector3.Distance(soldierAtk.transform.position, transform.position);
            if (distance < minDistance)
            {
                potentialAtker = soldierAtk;
                minDistance    = distance;
            }
        }
        return(potentialAtker);
    }
예제 #8
0
    void Update()
    {
        if (Globals.gamePaused)
        {
            Soldier.animator.SetBool("Run", false);
            return;
        }
        if (Soldier.isActive)
        {
            Soldier.animator.SetBool("Run", true);

            if (GameManager.ballHolder == null)
            {
                Soldier.animator.speed = 1;

                CircleIndicator.SetActive(false);
                Soldier.SetKinematic(true);
                transform.position = Vector3.MoveTowards(transform.position, ball.transform.position, Params.speedNormalMultiplierAtk * Time.deltaTime);

                if (Vector3.Distance(transform.position, ball.transform.position) <= Params.spacingBallAtk)
                {
                    GameManager.ballHolder = Soldier;
                    ball.transform.parent  = Soldier.transform.parent;
                }
            }

            else if (GameManager.ballHolder == Soldier)
            {
                Soldier.animator.speed = Params.speedCarryMultiplier / Params.speedNormalMultiplierAtk;

                CircleIndicator.SetActive(true);
                if (isCaught)
                {
                    CircleIndicator.SetActive(false);
                    SoldierAtk nearestAtker = GetNearestAtker();
                    if (nearestAtker == null)
                    {
                        GameManager.MatchOver(false);
                        Soldier.SetStatus(false);
                        return;
                    }

                    Vector3 targetDirection = nearestAtker.transform.position - transform.position;
                    Vector3 newDirection    = Vector3.RotateTowards(transform.forward, targetDirection, 360, 0f);
                    transform.rotation = Quaternion.LookRotation(newDirection);

                    Soldier.animator.SetBool("Pass", true);
                    Soldier.animator.SetBool("Run", false);
                    Soldier.animator.SetBool("Pass", false);

                    GameManager.ballHolder = null;
                    Soldier.SetStatus(false);
                    Soldier.SetKinematic(true);

                    ball.transform.parent = null;
                    ball.GetComponent <Ball>().passedTo = nearestAtker;

                    StartCoroutine(Reactivate());
                }
                else
                {
                    Soldier.animator.speed = 1;
                    Soldier.SetKinematic(false);
                    transform.position = Vector3.MoveTowards(transform.position, gatePos, Params.speedCarryMultiplier * Time.deltaTime);
                }
            }
            else
            {
                Soldier.animator.speed = 1;

                CircleIndicator.SetActive(false);
                Soldier.SetKinematic(true);
                transform.position = Vector3.MoveTowards(transform.position, new Vector3(transform.position.x, gatePos.y, gatePos.z), Params.speedNormalMultiplierAtk * Time.deltaTime);

                if (transform.position.z == gatePos.z)
                {
                    GameManager.AtkSoldiers.Remove(this);

                    Soldier.animator.SetBool("Down", true);
                    Soldier.SetStatus(false);
                    Destroy(gameObject, 1.2f);
                }
            }
        }
    }
예제 #9
0
    void Update()
    {
        if (Globals.gamePaused)
        {
            Soldier.animator.SetBool("Run", false);
            return;
        }
        if (Soldier.isActive)
        {
            Soldier.animator.SetBool("Run", true);

            // chase the ball if it's not hold by an Attacker
            if (GameManager.ballHolder == null)
            {
                Soldier.animator.speed = 1;

                CircleIndicator.SetActive(false);
                Soldier.SetKinematic(true);
                transform.position = Vector3.MoveTowards(transform.position, ball.transform.position, Params.speedNormalMultiplierAtk * Time.deltaTime);

                // there should be an *acceptable range* that allows Atker
                // to *catch* the ball if it's in the range
                if (Vector3.Distance(transform.position, ball.transform.position) <= Params.spacingBallAtk)
                {
                    GameManager.ballHolder = Soldier;
                    ball.transform.parent  = Soldier.transform.parent;
                }
            }

            // if holding the ball
            else if (GameManager.ballHolder == Soldier)
            {
                Soldier.animator.speed = Params.speedCarryMultiplier / Params.speedNormalMultiplierAtk;

                CircleIndicator.SetActive(true);
                // if caught: find nearest Atker, pass the ball, become inactive
                // if no nearest Atker available, game over
                if (isCaught)
                {
                    CircleIndicator.SetActive(false);
                    //Debug.Log($"Caught by Defender at {transform.position}");
                    SoldierAtk nearestAtker = GetNearestAtker(); //
                    if (nearestAtker == null)
                    {
                        GameManager.MatchOver(false);
                        Soldier.SetStatus(false);
                        return;
                    }

                    // rotate to the nearest Atker & pass the ball
                    Vector3 targetDirection = nearestAtker.transform.position - transform.position;
                    Vector3 newDirection    = Vector3.RotateTowards(transform.forward, targetDirection, 360, 0f);
                    transform.rotation = Quaternion.LookRotation(newDirection);

                    Soldier.animator.SetBool("Pass", true);
                    Soldier.animator.SetBool("Run", false);
                    Soldier.animator.SetBool("Pass", false);

                    GameManager.ballHolder = null;
                    //Debug.Log($"Nearest Attacker at {nearestAtker.transform.position}");
                    Soldier.SetStatus(false);
                    Soldier.SetKinematic(true);

                    ball.transform.parent = null;
                    ball.GetComponent <Ball>().passedTo = nearestAtker;

                    StartCoroutine(Reactivate());
                }
                else
                {
                    Soldier.animator.speed = 1;
                    Soldier.SetKinematic(false);
                    transform.position = Vector3.MoveTowards(transform.position, gatePos, Params.speedCarryMultiplier * Time.deltaTime);
                }
            }

            // If no ball to chase or hold, move towards the opponent's fence
            // and destroy on collision
            // Using *kinematic* allows SoldierAtk to *pass through* others,
            // but it can't collide with fences (except for changing
            // project collision settings - but that may cause some
            // unexpected results - idk, not enough time to test xD)
            // So the simpler approach is to compare current position
            // with the Gate's z-position. If equal => Destroy
            else
            {
                Soldier.animator.speed = 1;

                CircleIndicator.SetActive(false);
                Soldier.SetKinematic(true);
                transform.position = Vector3.MoveTowards(transform.position, new Vector3(transform.position.x, gatePos.y, gatePos.z), Params.speedNormalMultiplierAtk * Time.deltaTime);

                if (transform.position.z == gatePos.z)
                {
                    GameManager.AtkSoldiers.Remove(this);

                    // This animation needs a bit *tweaking*
                    Soldier.animator.SetBool("Down", true);
                    Soldier.SetStatus(false);
                    Destroy(gameObject, 1.2f);
                }
            }
        }
    }
예제 #10
0
    void ClickHandler(Vector2 pos)
    {
        // 2D screen => 3d world space
        Ray        ray = Camera.main.ScreenPointToRay(pos);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit))
        {
            //OnscreenDebugOutput.Log($"Touch at {pos}, hit {hit.transform.tag} at {hit.point}");
            if (hit.transform.tag == "PlayerField")
            {
                if (currentPlayerEnergy > player.energyCost)
                {
                    currentPlayerEnergy -= player.energyCost;
                    if (player.isAtk)
                    {
                        GameObject soldierObjPlayer = Instantiate(soldierAtkPrefab, hit.point, Quaternion.identity, gameplayComponents.transform);
                        SoldierAtk s = soldierObjPlayer.GetComponent <SoldierAtk>();
                        s.ball = ballObj;
                        s.Soldier.SetAttr(true);
                        s.Soldier.GameManager = this;
                        AtkSoldiers.Add(s);
                        //OnscreenDebugOutput.Log($"Added {s} at {hit.point}");
                    }
                    else
                    {
                        GameObject soldierObj = Instantiate(soldierDefPrefab, hit.point, Quaternion.identity, gameplayComponents.transform);
                        SoldierDef s          = soldierObj.GetComponent <SoldierDef>();
                        s.Soldier.SetAttr(true);
                        s.Soldier.GameManager = this;
                        DefSoldiers.Add(s);
                        //OnscreenDebugOutput.Log($"Added {s} at {hit.point}");
                    }
                }
            }
            // TODO: remove this pls
            // Replace with a simple *Do nothing*
            // or a message to let the player know that
            // they can't put soldiers in enemy's field.
            // Or only activate this in 2-players mode
            else if (hit.transform.tag == "EnemyField")
            {
                if (currentEnemyEnergy > enemy.energyCost)
                {
                    currentEnemyEnergy -= enemy.energyCost;
                    if (enemy.isAtk)
                    {
                        GameObject soldierObjEnemy = Instantiate(soldierAtkPrefab, hit.point, Quaternion.Euler(0, 180, 0), gameplayComponents.transform);
                        SoldierAtk s = soldierObjEnemy.GetComponent <SoldierAtk>();
                        s.ball = ballObj;
                        s.Soldier.SetAttr(false);
                        s.Soldier.GameManager = this;
                        AtkSoldiers.Add(s);
                    }
                    else
                    {
                        GameObject soldierObjEnemy = Instantiate(soldierDefPrefab, hit.point, Quaternion.Euler(0, 180, 0), gameplayComponents.transform);
                        SoldierDef s = soldierObjEnemy.GetComponent <SoldierDef>();
                        s.Soldier.SetAttr(false);
                        s.Soldier.GameManager = this;
                        DefSoldiers.Add(s);
                    }
                }
            }
        }
    }