// The method for bullet movemnt IEnumerator BulletMove(JIBulletController bullet, float angle) { Transform bulletTrans = bullet.transform; float sectorRadius = m_sectorRadius; float timeToReachEdge = m_timeToReachEdge; float waitingTime = m_waitingTime; float speedAfterWait = m_speedAfterWait; float accelAfterWait = m_accelAfterWait; float angleSpeedAfterWait = m_angleSpeedAfterWait; if (bulletTrans == null) { Debug.LogWarning("The shooting bullet is not exist!"); yield break; } bulletTrans.SetEulerAnglesZ(angle - 90f); Vector3 startPos = bulletTrans.position; Vector3 endPos = startPos + new Vector3(Mathf.Cos(Mathf.Deg2Rad * angle), Mathf.Sin(Mathf.Deg2Rad * angle), 0) * sectorRadius; float timer = 0f; // Bullet movement before waiting while (true) { float t = timer / timeToReachEdge; t = Mathf.Clamp01(-(Mathf.Pow(t - 1f, 2f) - 1f)); // Pow2Out bulletTrans.position = Vector3.Lerp(startPos, endPos, t); timer += JITimer.Instance.DeltTime; if (t >= 0.995f) { break; } yield return(null); } // Wait for a while yield return(UbhUtil.WaitForSeconds(waitingTime)); // Bullet movemnt after waiting while (true) { // turning. float addAngle = angleSpeedAfterWait * JITimer.Instance.DeltTime; bulletTrans.AddEulerAnglesZ(addAngle); // acceleration speed speedAfterWait += accelAfterWait * JITimer.Instance.DeltTime; // move bulletTrans.position += bulletTrans.up * speedAfterWait * JITimer.Instance.DeltTime; yield return(0); } }
/// <summary> /// Update Rotate /// </summary> public void UpdateRotate() { switch (m_axisMove) { case UbhUtil.AXIS.X_AND_Y: m_rootTransform.AddEulerAnglesZ(m_rotationSpeed * UbhTimer.instance.deltaTime); break; case UbhUtil.AXIS.X_AND_Z: m_rootTransform.AddEulerAnglesY(-m_rotationSpeed * UbhTimer.instance.deltaTime); break; default: break; } }
// The method for bullet move IEnumerator BulletMove(JIBulletController bullet, float angle) { Transform bulletTrans = bullet.transform; float bulletSpeed = m_bulletSpeed; float accelerationSpeed = m_accelerationSpeed; float angleSpeed = m_angleSpeed; float addAngleAfterChangeDirection = m_AddAngleAfterChangeDirection; float selfTimeCount = 0; float pauseBeforeChangeDirection = m_PauseBeforeChangeDirection; float bulletSpeedAfterChangeDir = m_BulletSpeedAfterChangeDir; bool usePauseAndResume = m_usePauseAndResume; float pauseTime = m_pauseTime; float resumeTime = m_resumeTime; if (bulletTrans == null) { Debug.LogWarning("The shooting bullet is not exist!"); yield break; } bulletTrans.SetEulerAnglesZ(angle); while (true) { float addAngle = angleSpeed * JITimer.Instance.DeltTime; bulletTrans.AddEulerAnglesZ(addAngle); bulletSpeed += accelerationSpeed * JITimer.Instance.DeltTime; bulletTrans.position += bulletTrans.up * bulletSpeed * JITimer.Instance.DeltTime; yield return(0); selfTimeCount += JITimer.Instance.DeltTime; // When the speed == 0, shoot two other bullet if (selfTimeCount > Mathf.Abs(bulletSpeed / accelerationSpeed)) { yield return(UbhUtil.WaitForSeconds(pauseBeforeChangeDirection)); bulletSpeed = bulletSpeedAfterChangeDir; var bulletUpper = GetBullet(bulletTrans.position, bulletTrans.rotation); var bulletUnder = GetBullet(bulletTrans.position, bulletTrans.rotation); if (bulletUpper == null || bulletUnder == null) { break; } ShotChildBullet(bulletUpper, bulletSpeed, angle + addAngleAfterChangeDirection); ShotChildBullet(bulletUnder, bulletSpeed, angle - addAngleAfterChangeDirection); AutoReleaseBulletGameObject(bulletUpper.gameObject); AutoReleaseBulletGameObject(bulletUnder.gameObject); BulletPool.Instance.ReleaseGameObject(bulletTrans.gameObject); FinishedShot(this); yield break; } // pause and resume. if (usePauseAndResume && pauseTime >= 0f && resumeTime > pauseTime) { while (pauseTime <= selfTimeCount && selfTimeCount < resumeTime) { yield return(0); selfTimeCount += JITimer.Instance.DeltTime; } } } }