unity3d 攝像機抖動效果 ,利用腳本直接控制;當然也可以選擇使用dotween插件,但到不至於為了使用僅一個功能,就導入了一個插件;
腳本示例:
using UnityEngine; using System.Collections; public class CameraShake : MonoBehaviour { public Transform cameraTransform; private Vector3 _currentPosition; //記錄抖動前的位置 private float _shakeCD = 0.002f; //抖動的頻率 private int _shakeCount = -1; //設置抖動次數 private float _shakeTime; void Start () { if(cameraTransform == null) cameraTransform = transform; _currentPosition = cameraTransform.position; //記錄抖動前的位置 _shakeCount = Random.Range (50, 60); //設置抖動次數 } void Update () { if(_shakeTime + _shakeCD < Time.time && _shakeCount > 0) { _shakeCount --; float radio = Random.Range (-0.01f, 0.01f); if(_shakeCount == 1) //抖動最后一次時設置為都動前記錄的位置 radio = 0; _shakeTime = Time.time; cameraTransform.position = _currentPosition + Vector3.one * radio; } } }
另一版本:
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// this Script need a Component Of camera /// </summary> public class myCameraShake : MonoBehaviour { private float m_FduringTime = 2.0f; [SerializeField] private bool m_BisOnShake = true; [SerializeField] private int m_IyshakeLength =0; private Transform m_TCamera; private Vector3 m_OldPos; private float mtime = 0; void Awake() { if (this.transform.GetComponent<Camera>() == null && GameObject.FindObjectOfType<myCameraShake>() == null) { Camera.main.gameObject.AddComponent<myCameraShake>(); } m_TCamera = Camera.main.transform; m_OldPos = m_TCamera.position; } void Start () { } private void Update() { if (m_BisOnShake) { mtime+=0.1f; if (mtime < m_FduringTime) { m_IyshakeLength = Random.Range(-2, 4); if(m_IyshakeLength!=0) m_TCamera.position = Vector3.Lerp(m_OldPos, new Vector3(m_OldPos.x, m_OldPos.y + m_IyshakeLength, m_OldPos.z), 0.05f); } else { m_BisOnShake = !m_BisOnShake; } } } }