Эффект тряски камеры

Весьма полезный эффект, особенно если на экране взрывы или допустим, падают тяжелые объекты. При этом, реализовано несколько режимов работы. Например, такие как: тряска камеры по осям Х и Y, что применимо для двухмерных игр или для шутера; либо по осям Х и Z, это в том случаи, когда камера повернута по Х, как в стратегии. Конечно, имеются и другие режимы, использовать только одну из осей или все сразу. Кроме режима тряски, есть так же опции: продолжительность и сила эффекта. Кстати говоря, скрипт необязательно юзать только на камере, можно прицепить на любой другой объект, чтобы добавить эффект дрожания на него.

Так, чтобы одновременно можно было двигать камеру и добавлять к ней эффект тряски. Нам нужно камеру сделать дочерней к пустому объекту, то есть, если в игре камера перемещается, то двигать мы будем родителя, а дочерний объект у нас соответственно в локальных координатах.

Эффект тряски камеры

Данный скрипт вешаем именно на камеру (которая дочерняя):

using UnityEngine;
using System.Collections;

public class CameraShake : MonoBehaviour {

	public enum ShakeMode {OnlyX, OnlyY, OnlyZ, XY, XZ, XYZ};

	private static Transform tr;
	private static float elapsed, i_Duration, i_Power, percentComplete;
	private static ShakeMode i_Mode;
	private static Vector3 originalPos;

	void Start()
	{
		percentComplete = 1;
		tr = GetComponent<Transform>();
	}

	public static void Shake(float duration, float power)
	{
		if(percentComplete == 1) originalPos = tr.localPosition;
		i_Mode = ShakeMode.XYZ;
		elapsed = 0;
		i_Duration = duration;
		i_Power = power;
	}

	public static void Shake(float duration, float power, ShakeMode mode)
	{
		if(percentComplete == 1) originalPos = tr.localPosition;
		i_Mode = mode;
		elapsed = 0;
		i_Duration = duration;
		i_Power = power;
	}

	void Update()
	{
		if(elapsed < i_Duration)
		{
			elapsed += Time.deltaTime;
			percentComplete = elapsed / i_Duration;
			percentComplete = Mathf.Clamp01(percentComplete);
			Vector3 rnd = Random.insideUnitSphere * i_Power * (1f - percentComplete);

			switch(i_Mode)
			{
			case ShakeMode.XYZ:
				tr.localPosition = originalPos + rnd;
				break;
			case ShakeMode.OnlyX:
				tr.localPosition = originalPos + new Vector3(rnd.x, 0, 0);
				break;
			case ShakeMode.OnlyY:
				tr.localPosition = originalPos + new Vector3(0, rnd.y, 0);
				break;
			case ShakeMode.OnlyZ:
				tr.localPosition = originalPos + new Vector3(0, 0, rnd.z);
				break;
			case ShakeMode.XY:
				tr.localPosition = originalPos + new Vector3(rnd.x, rnd.y, 0);
				break;
			case ShakeMode.XZ:
				tr.localPosition = originalPos + new Vector3(rnd.x, 0, rnd.z);
				break;
			}
		}
	}
}

Теперь, о том как его использовать. Вызов эффекта можно сделать из любого другого скрипта.



Если нужна тряска по всем осям, то пишем:

CameraShake.Shake(1, 1);

То есть, указываем только продолжительность и силу.

Если нужно переключится на другой режим, то пишем:

CameraShake.Shake(1, 1, CameraShake.ShakeMode.OnlyX);

В этом примере, мы задействуем только ось Х.

Скачать демо:

Внимание! Посетители, находящиеся в группе Гости, не могут скачивать файлы.

Комментариев 1

Офлайн
testttt 7 апреля 2020
Благодарствую !!!
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика