Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        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);
        }