Example #1
0
        public void Shot(Vector3 aimPosition, int aimingState, int moveState,
                         int postureState, float velocityMagitude, SpawnBulletEventHandler spawnBulletAction)
        {
            GunUpTimeModifier((PostureState)postureState);
            CalculateShotDeviation((AimingState)aimingState, (MoveState)moveState,
                                   (PostureState)postureState, velocityMagitude);
            var spreadAndDeviation = CalculateSpreadAndDeviation((AimingState)aimingState, (MoveState)moveState,
                                                                 (PostureState)postureState, velocityMagitude);
            float deviation = spreadAndDeviation.y;
            float spread    = spreadAndDeviation.x;
            int   shotCount = 1;

            if (m_ShotCount > shotCount)
            {
                shotCount = m_ShotCount;
            }

            if (m_ShotSpread > 0)
            {
                ShotWithShotgun(aimPosition, aimingState, deviation, spread, shotCount, spawnBulletAction);
            }
            else
            {
                ShotWithCommonGun(aimPosition, aimingState, deviation, spread, spawnBulletAction);
            }

            if (m_RecoilCoroutine != null && startRecoil)
            {
                StopCoroutine(m_RecoilCoroutine);
            }
            if (startRecoil)
            {
                m_RecoilCoroutine = StartCoroutine(Recoil());
            }
        }
Example #2
0
        private void ShotWithShotgun(Vector3 aimPosition, int aimingState, float deviation, float spread, float shotCount, SpawnBulletEventHandler spawnBulletAction)
        {
            var muzzlePoint = m_MuzzleTransform.position;
            var forward     = (aimPosition - muzzlePoint).normalized;

            forward = m_BulletRefTransform.InverseTransformDirection(forward);
            if ((AimingState)aimingState == AimingState.ADS)
            {
                forward = m_ShotGunRorateBias * forward;
            }
            for (int i = 0; i < shotCount; ++i)
            {
                // Calculate bullet velocity by spread.
                Vector2 spreadAngle    = UnityEngine.Random.insideUnitCircle * (spread + deviation) * AngleUnit;      //将分度转换为度
                var     spreadRotation = Quaternion.Euler(spreadAngle.x, spreadAngle.y, 0.0f);

                // 利用散布和偏差对子弹的初始设计方向进行修正
                var bulletInitialVelocity = m_BulletRefTransform.rotation * spreadRotation * forward * m_InitialBulletSpeed;
                // Spawn bullet.
                if (spawnBulletAction != null)
                {
                    spawnBulletAction(bulletInitialVelocity, muzzlePoint);
                }
            }
        }
Example #3
0
        private void ShotWithCommonGun(Vector3 aimPosition, int aimingState, float deviation, float spread, SpawnBulletEventHandler spawnBulletAction)
        {
            var muzzlePoint = m_MuzzleTransform.position;
            var forward     = (aimPosition - muzzlePoint).normalized;

            forward = m_BulletRefTransform.InverseTransformDirection(forward);
            if ((AimingState)aimingState == AimingState.ADS)
            {
                forward = m_ShotGunRorateBias * forward;
            }

            float   randomAngle    = UnityEngine.Random.Range(0f, 1f) * deviation * AngleUnit; //将分度转换为度
            Vector2 deviationAngle = Vector2.zero;

            if (leixing == 0)
            {
                //在单位圆上随机
                deviationAngle = OnUnitCircle(randomAngle); //wangXun
            }
            else
            {
                //在单位球上均匀随机,然后将球压平实现内密外疏
                deviationAngle = UnityEngine.Random.insideUnitSphere * randomAngle; //hongXian
            }

            // Calculate bullet velocity by spread.
            Vector2 spreadAngle    = UnityEngine.Random.insideUnitCircle * spread * AngleUnit;     //将分度转换为度
            var     spreadRotation = Quaternion.Euler(spreadAngle.x, spreadAngle.y, 0.0f) * Quaternion.Euler(deviationAngle.x, deviationAngle.y, 0.0f);

            // 利用散布和偏差对子弹的初始设计方向进行修正
            var bulletInitialVelocity = m_BulletRefTransform.rotation * spreadRotation * forward * m_InitialBulletSpeed;

            // Spawn bullet.
            if (spawnBulletAction != null)
            {
                spawnBulletAction(bulletInitialVelocity, muzzlePoint);
            }
        }