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)); } }
public void unRegisteredTakeDamagable(TakeDamageable takeDamageable) { if (TakeDamageables.Contains(takeDamageable)) { takeDamageable.status = null; TakeDamageables.Remove(takeDamageable); } }
public void RegisteredTakeDamagable(TakeDamageable takeDamageable) { if (TakeDamageables.Contains(takeDamageable)) { takeDamageable.status = this; TakeDamageables.Add(takeDamageable); } }
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); }
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); }
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; }
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); } } }
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)); }
public void Miss(TakeDamager damager, TakeDamageable able) { }
public void ToPool(TakeDamager damager, TakeDamageable damageable) { base.ReturnToPool(); }