Ejemplo n.º 1
0
    //升级动画
    IEnumerator PlayUpgradeAnim()
    {
        for (var i = 0; i < 10; i++)
        {
            //TimeScalse == 0 的时候,使用realtime来做协程
            yield return(new WaitForSecondsRealtime(0.1f));

            //使用调色板来做动画
            GetComponent <SpriteRenderer>().material.SetInt("_CurrentPalette", i % 2 == 0 ? 1 : 5);
        }
        GetComponent <SpriteRenderer>().material.SetInt("_CurrentPalette", 1);
        Time.timeScale = 1;
        m_status       = m_lastStatus;
        EnableInput();
    }
Ejemplo n.º 2
0
    //攻击动画不能只用关键帧来结束 ,因为可能在攻击动画未结束的时候切换状态,所以在攻击开始的时候,调用这个协程来关闭攻击动画
    IEnumerator AttackOver(SimonStatus simonStatus)
    {
        string animName = "Idle";

        switch (simonStatus)
        {
        case SimonStatus.MeleeAttack:
            animName = m_whip.m_animString;
            break;

        case SimonStatus.SquatMeleeAttack:
            animName = m_whip.m_animStringSquat;
            break;

        case SimonStatus.SubWeaponAttack:
            animName = "ShootSubWeapon";
            break;
        }
        yield return(new WaitForEndOfFrame());

        //获取动画长度
        float time = m_anim.GetAnimationClip(animName).length;

        yield return(new WaitForSeconds(time));

        if (!IsOnHit())
        {
            switch (simonStatus)
            {
            case SimonStatus.MeleeAttack:
                ChangeState(SimonStatus.Idle);
                break;

            case SimonStatus.SquatMeleeAttack:
                ChangeState(SimonStatus.Squat);
                break;

            case SimonStatus.SubWeaponAttack:
                ChangeState(SimonStatus.Idle);
                break;
            }
        }
    }
Ejemplo n.º 3
0
    //切换状态
    void ChangeState(SimonStatus state)
    {
        if (m_status != state)
        {
            m_lastStatus = m_status;
            m_status     = state;
        }
        else
        {
            return;
        }
        //Debug.Log("SwitchStatus:" + state);
        switch (state)
        {
        case SimonStatus.JumpUp0:
            m_anim.Play("Idle");
            ActiveCollider(SimonColliderType.Default);
            break;

        case SimonStatus.JumpUp1:
            ActiveCollider(SimonColliderType.Squat);
            m_anim.Play("Squat");
            break;

        case SimonStatus.Squat:
            ActiveCollider(SimonColliderType.Squat);
            m_anim.Play("Squat");
            break;

        case SimonStatus.JumpFall0:
            ActiveCollider(SimonColliderType.Squat);
            break;

        case SimonStatus.JumpFall1:
            m_anim.Play("Idle");
            ActiveCollider(SimonColliderType.Default);
            break;

        case SimonStatus.Walk:
            m_anim.Play("Walk");
            ActiveCollider(SimonColliderType.Default);
            break;

        case SimonStatus.Idle:
            m_anim.Play("Idle");
            if (CheckGrounded())
            {
                StopX();
            }
            ActiveCollider(SimonColliderType.Default);
            break;

        case SimonStatus.MeleeAttack:
            m_anim.Play(m_whip.m_animString);
            ActiveCollider(SimonColliderType.Default);
            StartCoroutine(AttackOver(state));
            break;

        case SimonStatus.SquatMeleeAttack:
            m_anim.Play(m_whip.m_animStringSquat);
            ActiveCollider(SimonColliderType.Squat);
            StartCoroutine(AttackOver(state));
            break;

        case SimonStatus.OnHit0:
            m_anim.Play("Onhit");
            ActiveCollider(SimonColliderType.OnHit);
            m_whip.ActiveCollider(false);
            DisableInput();     //No Input After OnHit
            OnDmgAction();
            new EnumTimer(() =>
            {
                ChangeState(SimonStatus.OnHit1);
            }, 0.1f).StartTimeout(this);
            break;

        case SimonStatus.OnHit1:
            break;

        case SimonStatus.OnHit2:
            m_anim.Play("Squat");
            ActiveCollider(SimonColliderType.Squat);
            StopX();
            new EnumTimer(() =>
            {
                if (m_isDead)
                {
                    ChangeState(SimonStatus.Dead);
                }
                else
                {
                    ChangeState(SimonStatus.Idle);
                    EnableInput();
                }
            }, m_onHit1Time).StartTimeout(this);
            break;

        case SimonStatus.Dead:
            m_anim.Play("Die");
            transform.localPosition = new Vector3(transform.localPosition.x, transform.localPosition.y - 8);
            Destroy(m_rigidbody);
            new EnumTimer(() =>
            {
                OnDied?.Invoke(m_diedDamage);
            }, 2f).StartTimeout(this);
            break;

        case SimonStatus.SubWeaponAttack:
            m_anim.Play("ShootSubWeapon");
            ActiveCollider(SimonColliderType.Default);
            StartCoroutine(AttackOver(state));
            break;

        case SimonStatus.Upgrade:
            UpgradeAnim();
            break;
        }
    }