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()); } }
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); } } }
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); } }