コード例 #1
0
    private IEnumerator Shake(ShakeSettings settings)
    {
        float completionPercent = 0;
        float movePercent       = 0;

        float   angle_radians    = settings.angle * Mathf.Deg2Rad - Mathf.PI;
        Vector3 previousWaypoint = new Vector3(0, 0, -10);
        Vector3 currentWaypoint  = new Vector3(0, 0, -10);
        float   moveDistance     = 0;

        while (true)
        {
            if (movePercent >= 1 || completionPercent == 0)
            {
                float dampingFactor = DampingCurve(completionPercent, settings.dampingPercent);
                float noiseAngle    = (Random.value - .5f) * 2 * Mathf.PI / 2f;
                angle_radians    += Mathf.PI + noiseAngle * settings.noisePercent;
                currentWaypoint   = new Vector3(Mathf.Cos(angle_radians), Mathf.Sin(angle_radians)) * settings.strength * dampingFactor;
                currentWaypoint.z = -10;
                previousWaypoint  = transform.localPosition;

                moveDistance = Vector2.Distance(currentWaypoint, previousWaypoint);
                movePercent  = 0;
            }

            completionPercent      += Time.deltaTime / settings.duration;
            movePercent            += Time.deltaTime / moveDistance * settings.speed;
            transform.localPosition = Vector3.Lerp(previousWaypoint, currentWaypoint, movePercent);


            yield return(null);
        }
    }
コード例 #2
0
        private Vector2 CalculateRandomVector(ref ShakeInstance shake, ShakeSettings currentSettings)
        {
            float noise     = Mathf.PerlinNoise(Time.realtimeSinceStartup * m_DirectionNoiseScale, shake.duration);
            float deviation = noise * shake.magnitude * currentSettings.maxAngle;

            return(shake.direction.Rotate(deviation));
        }
コード例 #3
0
 public static void S_ShakeAllCameras(ShakeSettings settings)
 {
     foreach (var transform in transforms.Where(t => t.GetComponent <CameraShaker>() != null))
     {
         transform.Shake(settings);
     }
 }
コード例 #4
0
    //public static void S_ShakeAllCameras(ShakeSettings settings)
    //{
    //    foreach (var camera in transforms)
    //        camera.Shake(settings);
    //}

    //public void ShakeAllCameras(ShakeSettings settings)
    //{
    //    CameraShaker.S_ShakeAllCameras(settings);
    //}

    public void Shake(ShakeSettings settings)
    {
        if (UseLocalSettings)
        {
            settings = this.Settings;
        }

        if (settings.duration <= 0)
        {
            return;
        }

        List <ShakeData> shakeDatas;

        if (!shakes.ContainsKey(this))
        {
            shakes[this] = new List <ShakeData>();
        }
        shakeDatas = shakes[this];

        shakeDatas.Add(new ShakeData(settings));

        //start new coroutine
        if (shakeDatas.Count == 1)
        {
            StartCoroutine(ShakeTransform(Transform, shakeDatas));
        }
        //else we olready have coroutine with shakeDatas list
    }
コード例 #5
0
 public void DoGunScreenShake(ShakeSettings settings)
 {
     if (currentShakeCoroutine != null)
     {
         StopCoroutine(currentShakeCoroutine);
     }
     currentShakeCoroutine = Shake(settings);
     StartCoroutine(currentShakeCoroutine);
 }
コード例 #6
0
    private float CalculateShakeMagnitude(ref ShakeInstance shake, ShakeSettings currentSettings)
    {
        var t = shake.normalizedProgress;

        var noise = Mathf.PerlinNoise(Time.realtimeSinceStartup * m_MagnitudeNoiseScale, shake.duration);

        noise *= 0.6f + 0.4f;

        return(Mathf.Lerp(shake.magnitude, 0, t) * noise * currentSettings.maxShake);
    }
コード例 #7
0
        private float CalculateShakeMagnitude(ref ShakeInstance shake, ShakeSettings currentSettings)
        {
            float t = shake.normalizedProgress;

            float noise = Mathf.PerlinNoise(Time.realtimeSinceStartup * m_MagnitudeNoiseScale, shake.duration);

            // Rescale noise so it shakes primarily towards direction rather than in both directions
            // This changes the noise range from [1,-1] to [1, -0.2],
            noise *= 0.6f + 0.4f;

            return(Mathf.Lerp(shake.magnitude, 0, t) * noise * currentSettings.maxShake);
        }
コード例 #8
0
        /// <summary>
        /// Process and accumulate each shake
        /// </summary>
        protected virtual void ProcessShake(ref ShakeInstance shake, ref Vector2 shakeVector)
        {
            if (shake.maxDuration > 0)
            {
                shake.duration = Mathf.Clamp(shake.duration + Time.deltaTime, 0, shake.maxDuration);
            }

            ShakeSettings settings        = m_ShakingCamera.orthographic ? m_OrthographicSettings : m_PerspectiveSettings;
            float         magnitude       = CalculateShakeMagnitude(ref shake, settings);
            Vector2       additionalShake = CalculateRandomVector(ref shake, settings);

            shakeVector += additionalShake * magnitude;
        }
コード例 #9
0
ファイル: FollowCamera.cs プロジェクト: Backman/Ludum-Dare-33
    public ShakeID AddShake(ShakeSettings shake, float strength, Vector2 dir)
    {
        ActiveShakeData data;

        data.Settings  = shake;
        data.Strength  = strength;
        data.Direction = dir;
        data.StartTime = Time.time;
        data.ID        = _ShakeID++;
        _ActiveShakes.Add(data);
        return(new ShakeID()
        {
            ID = data.ID
        });
    }
コード例 #10
0
 public void ShakeAllCameras(ShakeSettings settings)
 {
     CameraShaker.S_ShakeAllCameras(settings);
 }
コード例 #11
0
 public void ShakeAllVirtualCameras(ShakeSettings settings)
 {
     VirtualCameraShaker.S_ShakeAllVirtualCameras(settings);
 }
コード例 #12
0
 public void SetSettings(ShakeSettings settings)
 {
     Settings = settings;
 }
コード例 #13
0
 public Shake(ShakeSettings settings)
 {
     Settings = settings;
 }
コード例 #14
0
 public Shake()
 {
     Settings = ShakeSettings.Default;
 }
コード例 #15
0
 public ShakeData(ShakeSettings settings)
 {
     this.settings = settings;
 }