Inheritance: MonoBehaviour
    private void DoShot(StateController controller, Vector3 direction, Vector3 hitPoint,
                        Vector3 hitNormal = default, bool organic = false, Transform target = null)
    {
        GameObject muzzleFlash = EffectManager.Instance.EffectOneShot((int)EffectList.flash, Vector3.zero);

        muzzleFlash.transform.localPosition    = Vector3.zero;
        muzzleFlash.transform.localEulerAngles = Vector3.left * 90.0f;
        DestroyDelayed destroyDelayed = muzzleFlash.AddComponent <DestroyDelayed>();

        destroyDelayed.DelayTime = 0.5f; // 자동 파괴

        GameObject shotTracer = EffectManager.Instance.EffectOneShot((int)EffectList.tracer, Vector3.zero);
        Vector3    origin     = controller.enemyAnimation.gunMuzzle.position;

        shotTracer.transform.rotation = Quaternion.LookRotation(direction);

        if (target && !organic)
        {
            GameObject bulletHole = EffectManager.Instance.EffectOneShot((int)EffectList.bulletHole, hitPoint + 0.1f * hitNormal);
            bulletHole.transform.rotation = Quaternion.FromToRotation(Vector3.up, hitNormal);
            GameObject instantSpark = EffectManager.Instance.EffectOneShot((int)EffectList.sparks, hitPoint);
        }
        else if (target && organic)                                       // 플레이어
        {
            HealthBase targetHealth = target.GetComponent <HealthBase>(); // 플레이어 생명력
            if (targetHealth)
            {
                targetHealth.TakeDamage(hitPoint, direction, controller.classStats.BulletDamage,
                                        target.GetComponent <Collider>(), controller.gameObject);
            }
        }

        SoundManager.Instance.PlayShotSound(controller.classID, controller.enemyAnimation.gunMuzzle.position, 2.0f);
    }
Exemplo n.º 2
0
    /// <summary>
    /// 실제 사격을 위한 함수
    /// </summary>
    /// <param name="stateController">Enemy</param>
    /// <param name="direction">사격 방향</param>
    /// <param name="hitPoint">총알이 맞는 위치(타겟의 위치와는 다름)</param>
    /// <param name="hitNormal"></param>
    /// <param name="organic">Bullet Hole을 표시할지 말지를 결정</param>
    /// <param name="target">타겟</param>
    private void DoShot(StateController controller, Vector3 direction, Vector3 hitPoint,
                        Vector3 hitNormal = default, bool organic = false, Transform target = null)
    {
        // 총알 발사 이펙트 생성 및 세팅
        GameObject muzzleFlash = EffectManager.Instance.EffectOneShot((int)EffectList.flash, Vector3.zero);

        muzzleFlash.transform.SetParent(controller.enemyAnimation.gunMuzzle);
        muzzleFlash.transform.localPosition    = Vector3.zero;
        muzzleFlash.transform.localEulerAngles = Vector3.left * 90f;
        DestroyDelayed destroyDelayed = muzzleFlash.AddComponent <DestroyDelayed>();

        destroyDelayed.DelayTime = 0.5f; // 0.5초 뒤에 자동으로 삭제

        // 총아 궤적 이펙트 생성 및 세팅
        GameObject shotTracer = EffectManager.Instance.EffectOneShot((int)EffectList.tracer, Vector3.zero);

        shotTracer.transform.SetParent(controller.enemyAnimation.gunMuzzle);
        Vector3 origin = controller.enemyAnimation.gunMuzzle.position;

        shotTracer.transform.position = origin;
        shotTracer.transform.rotation = Quaternion.LookRotation(direction);

        // 피탄 구멍 생성 여부 체크
        if (target && !organic)
        {
            GameObject bulletHole = EffectManager.Instance.EffectOneShot((int)EffectList.bulletHole,
                                                                         hitPoint + 0.01f * hitNormal);
            bulletHole.transform.rotation = Quaternion.FromToRotation(Vector3.up, hitNormal);

            GameObject instantSpark = EffectManager.Instance.EffectOneShot((int)EffectList.shotEffect, hitPoint);
        }
        else if (target && organic)                                       // == player
        {
            HealthBase targetHealth = target.GetComponent <HealthBase>(); // playerHealth
            if (targetHealth)
            {
                targetHealth.TakeDamage(hitPoint, direction, controller.classStats.BulletDamage,
                                        target.GetComponent <Collider>(), controller.gameObject); // maybe floating text
            }
        }

        // (현재 Enemy가 가진 무기 종류에 따라 사운드 재생)
        SoundManager.Instance.PlayShotSound(controller.classID,
                                            controller.enemyAnimation.gunMuzzle.position, 2f);
    }