// tnInputFiller's INTERFACE

    public override void Fill(float i_FrameTime, tnInputData i_Data)
    {
        if (m_Ball == null || self == null)
        {
            return;
        }

        Transform ballTransform = m_Ball.transform;
        Transform myTransform   = self.transform;

        Vector2 steering           = Vector2.zero;
        float   distance           = 0f;
        float   deltaFleeThreshold = 0f;
        float   deltaSeekThreshold = 0f;
        float   perc = 0f;

        steering = ballTransform.position - myTransform.position;
        steering.Normalize();
        distance           = Vector2.Distance(myTransform.position, ballTransform.position);
        deltaFleeThreshold = m_FleeMaxThreshold - m_FleeMinThreshold;
        deltaSeekThreshold = m_SeekMaxThreshold - m_SeekMinThreshold;

        if (distance < m_SeekMaxThreshold)
        {
            if (distance < m_FleeMinThreshold)
            {
                // zone -1
                perc = -1;
            }
            if (distance < m_FleeMaxThreshold && distance > m_FleeMinThreshold)
            {
                // zone (0 ; -1)
                perc = (distance - m_FleeMinThreshold) / deltaFleeThreshold * -1;
            }
            if (distance <= m_SeekMinThreshold && distance >= m_FleeMaxThreshold)
            {
                // zone 0
                perc = 0f;
            }
            if (distance > m_SeekMinThreshold)
            {
                // zone (1 ; 0)
                perc = (distance - m_SeekMinThreshold) / deltaSeekThreshold;
            }
        }
        else
        {
            // zone 1
            perc = 1f;
        }

        steering *= perc;

        // Fill Input

        i_Data.SetAxis(InputActions.s_HorizontalAxis, steering.x);
        i_Data.SetAxis(InputActions.s_VerticalAxis, steering.y);
    }
Exemplo n.º 2
0
    // PROTECTED

    protected void ResetInputData(tnInputData i_Data)
    {
        if (i_Data == null)
        {
            return;
        }

        i_Data.SetAxis(InputActions.s_HorizontalAxis, 0f);
        i_Data.SetAxis(InputActions.s_VerticalAxis, 0f);

        i_Data.SetButton(InputActions.s_PassButton, false);
        i_Data.SetButton(InputActions.s_ShotButton, false);
        i_Data.SetButton(InputActions.s_AttractButton, false);
        i_Data.SetButton(InputActions.s_TauntButton, false);
        i_Data.SetButton(InputActions.s_StartButton, false);
    }
    // tnInputFiller's INTERFACE

    public override void Fill(float i_FrameTime, tnInputData i_Data)
    {
        if (!initialized || self == null)
        {
            ResetInputData(i_Data);
            return;
        }

        Vector2 direction  = Vector2.zero;
        bool    passButton = false;

        UpdateState();
        CallUpdate(m_State, i_FrameTime, out direction, out passButton);

        i_Data.SetAxis(InputActions.s_HorizontalAxis, direction.x);
        i_Data.SetAxis(InputActions.s_VerticalAxis, direction.y);

        i_Data.SetButton(InputActions.s_PassButton, passButton);
    }
    // tnInputFiller's INTERFACE

    public override void Fill(float i_FrameTime, tnInputData i_Data)
    {
        if (m_PlayerInput == null)
        {
            return;
        }

        float horizontalAxisRaw = m_PlayerInput.GetAxis("MoveHorizontal");
        float verticalAxisRaw   = m_PlayerInput.GetAxis("MoveVertical");

        m_HorizontalFilter.Step(horizontalAxisRaw, i_FrameTime);
        m_VerticalFilter.Step(verticalAxisRaw, i_FrameTime);

        i_Data.SetAxis(InputActions.s_HorizontalAxis, m_HorizontalFilter.position);
        i_Data.SetAxis(InputActions.s_VerticalAxis, m_VerticalFilter.position);

        i_Data.SetButton(InputActions.s_ShotButton, m_PlayerInput.GetButton("Shot"));
        i_Data.SetButton(InputActions.s_PassButton, m_PlayerInput.GetButton("Pass"));
        i_Data.SetButton(InputActions.s_AttractButton, m_PlayerInput.GetButton("Attract"));

        i_Data.SetButton(InputActions.s_TauntButton, m_PlayerInput.GetButton("Taunt"));
    }
Exemplo n.º 5
0
    public override void Fill(float i_FrameTime, tnInputData i_Data)
    {
        // Update timers.
        UpdateCooldownTimers(i_FrameTime);

        UpdateRecoverTimer(i_FrameTime);
        UpdateAttractTimer(i_FrameTime);

        //DEFINE LOCAL VARS
        Vector2 axes = Vector2.zero;

        bool requestKick = false;
        bool requestDash = false;
        bool attract     = false;

        if (UpdateAttract(out axes))
        {
            // You're attracting the ball. Skip regular movement.

            attract = true;
        }
        else if (GetMyIndex() == 0)
        {
            //ATTACK
            if (WeHaveBall())
            {
                //we have ball
                if (IHaveBall())
                {
                    //SELECT GOOD PATH TO GOAL
                    if (PathIsFree())
                    {
                        if (CanIShoot())
                        {
                            //bring ball to right direction
                            ChargeBall(out axes, out requestKick, out requestDash);
                        }
                        else
                        {
                            //move along path
                            axes    = Seek(opponentGoalPosition);
                            axes.x += 0.15f;
                            //attract = true;
                        }
                    }
                    else
                    {
                        //Obstacle avoidance
                        ChargeBall(out axes, out requestKick, out requestDash);
                    }
                }
                else
                {
                    //supporter
                    //KEEP CONSTANT DINSTANCE
                    for (int i = 0; i < teamCharactersCount; i++)
                    {
                        if (GetTeammateByIndex(i) != self)
                        {
                            axes = Seek(GetTeammateByIndex(i).gameObject.transform, colliderRadius);
                            break;
                        }
                    }
                }
            }
            else
            {
                if (TheyHaveBall())
                {
                    //they have ball
                    if (GoalIsDistant())
                    {
                        //Goto ball
                        axes = Seek(ballPosition, colliderRadius);
                    }
                    else
                    {
                        //Goto to mygoal
                        Recover(myGoalPosition, out axes, out requestKick, out requestDash);
                    }
                }
                else
                {
                    //NOBODY HAVE BALL
                    //SELECT GOOD PATH TO BALL
                    requestDash = true;
                    axes        = Seek(ballPosition);
                }
            }
        }
        else
        {
            //DEFEND
            if (WeHaveBall() && !IHaveBall()) //il mio compagno ha la palla
            {
                // a distanza fissa dalla porta e segue la palla come posizione y
                Recover(myGoalPosition, out axes, out requestKick, out requestDash);
                //axes = Seek(target, colliderRadius);
            }
            else if (IHaveBall()) // io ho la palla
            {
                // "attiro" la palla
                //attract = true;
                // mi allontano dalla porta (raggiungo compagno di squadra)
                axes = Seek(GetTeammateByIndex(0).position, colliderRadius);
                // lancio quando la palla è in posizione corretta
                //requestDash = true;
                ChargeBall(out axes, out requestKick, out requestDash);
            }
            else if (TheyHaveBall()) // gli avversari hanno la palla
            {
                // mi avvicino alla porta
                axes = Seek(new Vector2(myGoalPosition.x - 2.0f, myGoalPosition.y), colliderRadius);
                // cerco di predire la posizione di tiro e la intercetto
                axes = Interpose(ball, ball);
                Recover(myGoalPosition, out axes, out requestKick, out requestDash);
            }
            else if (IsBallInMyHalfSide())
            {
                axes        = Seek(ballPosition, colliderRadius);
                requestKick = true;
                ChargeBall(out axes, out requestKick, out requestDash);
            }
            else
            {
                axes = Seek(new Vector2(myGoalPosition.x - 2.0f, myGoalPosition.y), colliderRadius);
            }
        }

        // Update action status.
        {
            // Kick
            if (m_KickCooldownTimer == 0f && (CheckEnergy(m_MinKickEnergy)))
            {
                if (requestKick)
                {
                    m_KickCooldownTimer = m_KickCooldown;
                }
            }
            else
            {
                requestKick = false; // Inhibit action.
            }

            // Dash

            if (m_DashCooldownTimer == 0f && (CheckEnergy(m_MinDashEnergy)))
            {
                if (requestDash)
                {
                    m_DashCooldownTimer = m_DashCooldown;
                }
            }
            else
            {
                requestDash = false; // Inhibit action.
            }

            // Tackle

            /*
             * if (!requestKick)
             * {
             *  if (m_TackleCooldownTimer == 0f && (CheckEnergy(m_MinTackleEnergy)))
             *  {
             *      Transform nearestOpponent;
             *      if (UpdateTackle(out nearestOpponent))
             *      {
             *          requestKick = true;
             *
             *          m_TackleCooldownTimer = m_TackleCooldown;
             *      }
             *  }
             * }
             */
        }

        if (m_SmoothTime > 0f)
        {
            axes.x = Mathf.SmoothDamp(m_Axes.x, axes.x, ref m_AxesSpeed.x, m_SmoothTime);
            axes.y = Mathf.SmoothDamp(m_Axes.y, axes.y, ref m_AxesSpeed.y, m_SmoothTime);
        }

        m_Axes = axes;

        // Fill input data.
        i_Data.SetAxis(InputActions.s_HorizontalAxis, axes.x);
        i_Data.SetAxis(InputActions.s_VerticalAxis, axes.y);

        i_Data.SetButton(InputActions.s_PassButton, requestKick);
        i_Data.SetButton(InputActions.s_ShotButton, requestDash);

        i_Data.SetButton(InputActions.s_AttractButton, attract);
    }
 public abstract void Fill(float i_FrameTime, tnInputData i_Data);
Exemplo n.º 7
0
    // tnInputFiller's INTERFACE

    public override void Fill(float i_FrameTime, tnInputData i_Data)
    {
    }
Exemplo n.º 8
0
    // tnInputFiller's INTERFACE

    public override void Fill(float i_FrameTime, tnInputData i_Data)
    {
        if (!initialized || self == null)
        {
            ResetInputData(i_Data);
            return;
        }

        if (m_Role == AIRole.Null)
        {
            ResetInputData(i_Data);
            return;
        }

        // Clear status.

        SetBehaviourMode(BehaviourMode.None);
        SetBehaviourType(BehaviourType.None);

        // Update timers.

        UpdateCooldownTimers(i_FrameTime);

        UpdateRecoverTimer(i_FrameTime);
        UpdateAttractTimer(i_FrameTime);

        // Update actions.

        Vector2 axes = Vector2.zero;

        bool requestKick = false;
        bool requestDash = false;

        bool attract = false;

        if (UpdateAttract(out axes))
        {
            // You're attracting the ball. Skip regular movement.

            attract = true;
        }
        else
        {
            if (m_Role == AIRole.Midfielder)
            {
                // You're a midfielder. Based on ball position, you can behave as defender or striker.

                if (IsBallInMyHalfSide()) // Ball is in my half side. Behave as defender.
                {
                    UpdateDefender(out axes, out requestKick, out requestDash);

                    SetBehaviourMode(BehaviourMode.Defender);
                }
                else // Ball is on the opponent side. Behave as striker.
                {
                    UpdateStriker(out axes, out requestKick, out requestDash);

                    SetBehaviourMode(BehaviourMode.Striker);
                }
            }
            else
            {
                if (m_Role == AIRole.Defender)
                {
                    UpdateDefender(out axes, out requestKick, out requestDash);

                    SetBehaviourMode(BehaviourMode.Defender);
                }
                else // m_Role == AIRole.Striker
                {
                    UpdateStriker(out axes, out requestKick, out requestDash);

                    SetBehaviourMode(BehaviourMode.Striker);
                }
            }
        }

        // Update action status.

        {
            // Kick

            if (m_KickCooldownTimer == 0f && (CheckEnergy(m_MinKickEnergy)))
            {
                if (requestKick)
                {
                    m_KickCooldownTimer = m_KickCooldown;
                }
            }
            else
            {
                requestKick = false; // Inhibit action.
            }

            // Dash

            if (m_DashCooldownTimer == 0f && (CheckEnergy(m_MinDashEnergy)))
            {
                if (requestDash)
                {
                    m_DashCooldownTimer = m_DashCooldown;
                }
            }
            else
            {
                requestDash = false; // Inhibit action.
            }

            // Tackle

            if (!requestKick)
            {
                if (m_TackleCooldownTimer == 0f && (CheckEnergy(m_MinTackleEnergy)))
                {
                    Transform nearestOpponent;
                    if (UpdateTackle(out nearestOpponent))
                    {
                        requestKick = true;

                        m_TackleCooldownTimer = m_TackleCooldown;
                    }
                }
            }
        }

        if (m_SmoothTime > 0f)
        {
            axes.x = Mathf.SmoothDamp(m_Axes.x, axes.x, ref m_AxesSpeed.x, m_SmoothTime);
            axes.y = Mathf.SmoothDamp(m_Axes.y, axes.y, ref m_AxesSpeed.y, m_SmoothTime);
        }

        m_Axes = axes;

        // Fill input data.

        i_Data.SetAxis(InputActions.s_HorizontalAxis, axes.x);
        i_Data.SetAxis(InputActions.s_VerticalAxis, axes.y);

        i_Data.SetButton(InputActions.s_PassButton, requestKick);
        i_Data.SetButton(InputActions.s_ShotButton, requestDash);

        i_Data.SetButton(InputActions.s_AttractButton, attract);
    }