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