protected IEnumerator Flicker(TakeDamageable damageable)
    {
        float timer           = 0f;
        float sinceLastChange = 0.0f;

        Color transparent = m_OriginalColor;

        transparent.a = 0.2f;
        int state = 1;

        m_SpriteRenderer.color = transparent;

        while (timer < damageable.invulnerabilityDuration)
        {
            yield return(null);

            timer           += Time.deltaTime;
            sinceLastChange += Time.deltaTime;
            if (sinceLastChange > flickeringDuration)
            {
                sinceLastChange       -= flickeringDuration;
                state                  = 1 - state;
                m_SpriteRenderer.color = state == 1 ? transparent : m_OriginalColor;
            }
        }

        m_SpriteRenderer.color = m_OriginalColor;
    }
        public void OnHurt(TakeDamager damager, TakeDamageable damageable)
        {
            //if the player don't have control, we shouldn't be able to be hurt as this wouldn't be fair
            if (!PlayerInput.Instance.HaveControl)
            {
                return;
            }

            UpdateFacing(damageable.GetDamageDirection().x > 0f);
            damageable.EnableInvulnerability();

            m_Animator.SetTrigger(m_HashHurtPara);

            //we only force respawn if health > 0, otherwise both forceRespawn & Death trigger are set in the animator, messing with each other.
            if (damageable.CurrentHealth > 0 && damager.forceRespawn)
            {
                m_Animator.SetTrigger(m_HashForcedRespawnPara);
            }

            m_Animator.SetBool(m_HashGroundedPara, false);
            hurtAudioPlayer.PlayRandomSound();

            //if the health is < 0, mean die callback will take care of respawn
            if (damager.forceRespawn && damageable.CurrentHealth > 0)
            {
                //StartCoroutine(DieRespawnCoroutine(false, true));
            }
        }
Exemple #3
0
 public void unRegisteredTakeDamagable(TakeDamageable takeDamageable)
 {
     if (TakeDamageables.Contains(takeDamageable))
     {
         takeDamageable.status = null;
         TakeDamageables.Remove(takeDamageable);
     }
 }
Exemple #4
0
 public void RegisteredTakeDamagable(TakeDamageable takeDamageable)
 {
     if (TakeDamageables.Contains(takeDamageable))
     {
         takeDamageable.status = this;
         TakeDamageables.Add(takeDamageable);
     }
 }
Exemple #5
0
    public void ShowNum(TakeDamager damager, TakeDamageable able)
    {
        Text text = FindFreeText();

        text.text = damager.CurrentDamagNum.ToString();
        text.transform.localPosition = Vector3.zero;
        text.gameObject.SetActive(true);
        StartCoroutine(ShowAndFindPath(text));
    }
    //public GameObject BlowoutObj;

    public void OnHit(TakeDamager takeDamagerBase, TakeDamageable damageable)
    {
        //GameObject vfx = Instantiate(Resources.Load<GameObject>("VFX/Blowout/PistolBulletHit"));
        //vfx.transform.position = transform.position;
        //vfx.GetComponent<Animation>().Play();
        //Destroy(this.gameObject);
        //gameObject.SetActive(false);
        // GameObject obj = MonoBehaviour.Instantiate(BlowoutObj);
        //obj.transform.position = transform.position;
    }
    /// <summary>
    /// 目前的弹射未携带之前的攻击特效 -- 同时可以优化,缓存GameObject.FindGameObjectsWithTag("Enemy");
    /// 不用每次都计算
    /// </summary>
    /// <param name="_damager"></param>
    /// <param name="_damageable"></param>
    public void Calculat(TakeDamager _damager, TakeDamageable _damageable)
    {
        GameObject calculatObj = FindOtherEnemyInRange(_damageable.transform);

        if (calculatObj == null)
        {
            return;
        }
        VFXControllerM.Instance.MakeLighting(_damageable.transform, calculatObj.transform, 0.2f);
        calculatObj.GetComponent <TakeDamageable>().TakeDamage(_damager);
    }
Exemple #8
0
    public void Die(TakeDamager damager, TakeDamageable damageable)
    {
        m_Animator.SetTrigger(m_HashDeathPara);
        dieAudio.PlayRandomSound();

        m_Dead = true;
        //Debug.Log(moveVector);
        //m_Collider.enabled = false;
        //gameObject.layer = 20;
        //CameraShaker.Shake(0.15f, 0.3f);
        plots[end - 1].gameObject.SetActive(true);
    }
        public void Die(TakeDamager damager, TakeDamageable damageable)
        {
            //Vector2 throwVector = new Vector2(0, 2.0f);
            //Vector2 damagerToThis = damager.transform.position - transform.position;

            //throwVector.x = Mathf.Sign(damagerToThis.x) * -4.0f;
            //SetMoveVector(throwVector);

            m_Animator.SetTrigger(m_HashDeathPara);

            dieAudio.PlayRandomSound();

            m_Dead = true;
            //Debug.Log(moveVector);
            //m_Collider.enabled = false;
            gameObject.layer = 20;
            CameraShaker.Shake(0.15f, 0.3f);
        }
    public void Hit(TakeDamager damager, TakeDamageable damageable)
    {
        if (damageable.CurrentHealth <= 0)
        {
            return;
        }

        m_Animator.SetTrigger(m_HashHitPara);

        //Vector2 throwVector = new Vector2(0, 3.0f);
        //Vector2 damagerToThis = damager.transform.position - transform.position;

        //throwVector.x = Mathf.Sign(damagerToThis.x) * -2.0f;
        //m_MoveVector = throwVector;

        if (m_FlickeringCoroutine != null)
        {
            StopCoroutine(m_FlickeringCoroutine);
            m_SpriteRenderer.color = m_OriginalColor;
        }

        m_FlickeringCoroutine = StartCoroutine(Flicker(damageable));
        CameraShaker.Shake(0.15f, 0.3f);
    }
Exemple #11
0
 void PlayerDied(TakeDamager d, TakeDamageable da)
 {
     BackgroundMusicPlayer.Instance.PushClip(playerDeathClip);
 }
    public void Blowout(TakeDamager damager, TakeDamageable damageable)
    {
        GameObject vfx = MonoBehaviour.Instantiate(BlowoutEffect);

        vfx.transform.position = damageable.AttackPoint;
    }
Exemple #13
0
    void FixedUpdate()
    {
        Vector2 scale        = m_DamagerTransform.lossyScale;
        Vector2 facingOffset = Vector2.Scale(offset, scale);

        CurrentFramePoint = (Vector2)transform.position + facingOffset;
        float len = 3;

        if (!m_CanDamage)
        {
            return;
        }

        //if (offsetBasedOnSpriteFacing && spriteRenderer != null && spriteRenderer.flipX != m_SpriteOriginallyFlipped)
        //    facingOffset = new Vector2(-offset.x * scale.x, offset.y * scale.y);

        Vector2 scaledSize = Vector2.Scale(size, scale);

        //点A,B分别是攻击范围指示框的左下和右上点
        Vector2 pointA = (Vector2)m_DamagerTransform.position + facingOffset - scaledSize * 0.5f;
        Vector2 pointB = pointA + scaledSize;


        int hitCount = Physics2D.OverlapArea(pointA, pointB, m_AttackContactFilter, m_AttackOverlapResults);

        for (int i = 0; i < hitCount; i++)
        {
            Transform trans = m_AttackOverlapResults[i].transform;
            if (!IsCanHit(trans))
            {
                continue;
            }
            AddHitInfo(trans);

            m_LastHit = m_AttackOverlapResults[i];
            //m_LastHit.GetContacts(AttackPoints); // 这个方法获得碰撞点始终有误差

            TakeDamageable damageable = m_LastHit.GetComponent <TakeDamageable>();
            // hit is Missing
            if (damageable && !damageable.isHit(damageable.DodgeRate))
            {
                OnHitMissing.Invoke();
                damageable.OnMissingAttack.Invoke();
            }

            if (damageable)
            {
                hitPoint = getPoint(CurrentFramePoint, (CurrentFramePoint - LastFramePoint).normalized, len, hittableLayers);
                damageable.TakeDamage(this, TakeAttackBuffs, ignoreInvincibility);
                status.HP += status.AttackDamageNum * status.BloodsuckingRate; // 吸血
                OnDamageableHit.Invoke(this, damageable);
                if (disableDamageAfterHit)
                {
                    DisableDamage();
                }
            }
            else
            {
                OnNonDamageableHit.Invoke(this);
            }
        }
    }
Exemple #14
0
 public void HitEnemy(TakeDamager take, TakeDamageable takeDamageable)
 {
     MeleeAcAudio.Stop();
     MeleeAcAudio.PlayRandomSound(HitObject.Enemy);
 }
        public void OnDie(TakeDamager damager, TakeDamageable able)
        {
            m_Animator.SetTrigger(m_HashDeadPara);

            StartCoroutine(DieRespawnCoroutine(true, false));
        }
Exemple #16
0
 public void Miss(TakeDamager damager, TakeDamageable able)
 {
 }
Exemple #17
0
 public void ToPool(TakeDamager damager, TakeDamageable damageable)
 {
     base.ReturnToPool();
 }