//////////////////////////////////////////////////////////////////////////
    private void FixedUpdate()
    {
        if (m_Expiered)
        {
            return;
        }

        if (m_Timer.AddTime(Time.deltaTime))
        {
            m_Expired.Invoke();
            if (m_Loop)
            {
                m_Timer.Reset();
            }
            else
            {
                m_Expiered = true;
            }
        }
    }
Example #2
0
    private void FixedUpdate()
    {
        if (m_State != CharacterState.Fight)            // issue of non state machine implementation
        {
            m_Animator.SetBool("Hit", false);
        }

        // rude state machine implementation
        switch (m_State)
        {
        case CharacterState.Fight:
        {
            // find closest enemy, get close, make hit
            m_AttackTarget = implIsNative()
                                        ? PlayerManager.Instance.GetClosestUnit(transform.position, Tribe.Instance.m_CharacterList)
                                        : PlayerManager.Instance.GetClosestUnit(transform.position, m_CurrentHub.m_HubDefenderList);

            if (m_AttackTarget == null)
            {
                m_State = CharacterState.Idle;
                return;
            }

            if (m_AttackTarget.m_CurrentHub != m_CurrentHub)
            {
                m_AttackTarget = null;
                return;
            }


            iTargertPosition = m_AttackTarget.transform.position;
            implGoToTarget(m_FightSpeed);

            m_Animator.SetBool("Hit", m_DistanceToTarget <= 0.35f);

            var toTargetNormal = (iTargertPosition - iGetCurrentPosition()).normalized;
            if (implIsStay(0.1f))                       // make delayed call, for fair fight
            {
                Instantiate(m_HitEffect).transform.position = transform.position;


                SoundManager.Instance.Play("Hit");
                m_AttackTarget.TakeDamage(m_HitDamage, toTargetNormal);
                if (m_AttackTarget.m_AttackTarget == this)
                {
                    ;
                }
                TakeDamage(m_AttackTarget.m_HitDamage, -toTargetNormal);
            }
        }
        break;

        case CharacterState.Loot:
        {
            // follow to position and interract
            if (m_LootTarget == null)
            {
                Idle();
                return;
            }

            iTargertPosition = m_LootTarget.transform.position;

            if (implIsStay(0.05f))
            {
                m_LootTarget.Use(this);
                m_LootTarget = m_CurrentHub.GetClosestLoot(transform.position, m_CurrentHub.m_ValidLootList);
            }
            else
            {
                implGoToTarget(m_LootSpeed);
            }
        }
        break;

        case CharacterState.Idle:
        {
            // wander

            // wait random, time, or move to random position
            if (implIsStay(0.05f))
            {
                m_WanderTimer.AddTime(Time.fixedDeltaTime);

                if (m_WanderTimer.Expired)
                {
                    m_WanderTimer.Reset(UnityEngine.Random.Range(m_WanderTimerRange.x, m_WanderTimerRange.y));
                    iTargertPosition = m_CurrentHub.RandomHubPos();
                }
            }
            else
            {
                implGoToTarget(m_WanderSpeed);
            }
        }
        break;

        case CharacterState.Travel:
        {
            // follow to the target
            implGoToTarget(m_TravelSpeed);
        }
        break;
        }

        // dirty orientation update
        foreach (var n in m_SpriteList)
        {
            n.flipX = m_VectorToTarget.x < 0.0f;
        }
    }
Example #3
0
    private void Update()
    {
        if (IsInHub())
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                m_SelectedRoutePresentation = null;
            }

            if (Input.GetKeyDown(KeyCode.W))
            {
                var newPresentation = m_CurrentHub.GetRoutePresentation(RoutePresentation.KeyDirection.W);
                implApplyPresentation(newPresentation);
            }
            if (Input.GetKeyDown(KeyCode.S))
            {
                var newPresentation = m_CurrentHub.GetRoutePresentation(RoutePresentation.KeyDirection.S);
                implApplyPresentation(newPresentation);
            }
            if (Input.GetKeyDown(KeyCode.A))
            {
                var newPresentation = m_CurrentHub.GetRoutePresentation(RoutePresentation.KeyDirection.A);
                implApplyPresentation(newPresentation);
            }
            if (Input.GetKeyDown(KeyCode.D))
            {
                var newPresentation = m_CurrentHub.GetRoutePresentation(RoutePresentation.KeyDirection.D);
                implApplyPresentation(newPresentation);
            }

            if (m_CurrentHub != null)
            {
                m_HubLook = m_SelectedRoutePresentation != null ? m_SelectedRoutePresentation.transform.position : m_CurrentHub.transform.position;
            }
        }
        else
        {
            if (Input.GetKey(KeyCode.W))
            {
                SwarmManager.Instance.SpeedScale += m_SpeedScaleStep * Time.deltaTime;
            }
            if (Input.GetKey(KeyCode.S))
            {
                SwarmManager.Instance.SpeedScale -= m_SpeedScaleStep * Time.deltaTime;
            }
            if (Input.GetKeyDown(KeyCode.A))
            {
                SwarmManager.Instance.ElementsInRow--;
            }
            if (Input.GetKeyDown(KeyCode.D))
            {
                SwarmManager.Instance.ElementsInRow++;
            }

            m_ConsumptionTimer.AddTime(Time.deltaTime);
            if (m_ConsumptionTimer.Expired)
            {
                m_ConsumptionTimer.Reset(m_ConsumptionTimer.TimePassed - m_TravelFoodConsumptionTime, m_TravelFoodConsumptionTime);
                ConsumeFood();
            }
        }
    }