/// <summary> /// 获得损害 /// </summary> /// </summary> /// <param name="damage"></param> /// <returns></returns> public bool GetDamage(int damage, int deathDir) { if (!m_CharacterController.IsAlive()) { return(false); } m_CharacterController.Hit(); SubtractHealth(damage); if (health <= 0) { m_CharacterController.Die(deathDir); //一半的几率会爆炸,只是简单的特效展示 if (Random.Range(0, 100) > 50) { FXDisplay explosionFXDisplay = ObjPoolMgr.Instance.SpawnObj <FXDisplay>(explosionPrefName); explosionFXDisplay.transform.position = transform.position; explosionFXDisplay.ShowFX(); GameMgr.Instance.shakeCamera.ExplosionShake(); } return(false); } return(true); }
private void OnCollisionEnter2D(Collision2D collision) { bool isHitFXShowed = false; //敌人受伤并会被击退 if (collision.transform.CompareTag(DataMgr.Instance.EnemyTag)) { KinematicObject kObj = collision.transform.GetComponent <KinematicObject>(); Damageable damageable = kObj.GetComponent <Damageable>(); int deathDir = (int)Mathf.Sign(kObj.transform.position.x - transform.position.x); if (!damageable.GetDamage(damage, deathDir)) { return; } int sign = transform.right.x > 0 ? 1 : -1; if (!kObj.IsForwardWalled && !kObj.IsBackObstacled) { kObj.transform.position += Vector3.right * beatBackPower * sign * Time.deltaTime; } } //显示击中特效 foreach (ContactPoint2D point2D in collision.contacts) { if (isHitFXShowed) { break; } FXDisplay hitFXDisplay = ObjPoolMgr.Instance.SpawnObj <FXDisplay>("pref_Hit"); hitFXDisplay.transform.position = new Vector3(point2D.point.x, point2D.point.y, 0); hitFXDisplay.ShowFX(); isHitFXShowed = true; } ObjPoolMgr.Instance.RecycleObj(gameObject); }
/// <summary> /// 开火 /// </summary> public void Fire() { ShowFireGun(true); if (m_Timer > 0) { return; } if (m_AudioSource.isPlaying) { m_AudioSource.Stop(); } m_AudioSource.Play(); m_Animator.SetTrigger(m_User.IsGrounded ? "Fire" : "JumpFire"); m_Timer = 1 / shootRate; flashFXDisplay.ShowFX(); GameMgr.Instance.shakeCamera.FireShake(); Rigidbody2D shell = ObjPoolMgr.Instance.SpawnObj <Rigidbody2D>(shellPrefName); shell.transform.SetTransform(shellExit); m_ShellPower.x = transform.lossyScale.x * ShellPower.x; shell.AddForce(m_ShellPower); foreach (Gun gun in m_Guns) { gun.Fire(); } //后坐力实现 if (m_User.IsGrounded && !m_User.IsBackObstacled) { m_User.transform.position += Vector3.left * recoilForce * transform.lossyScale.x * Time.deltaTime; } }