unity 中lua实现震屏

--[[

    shake_power 震动强度

    frequency 震动频率

    shake_time 震动时间

    start_shake_time 开始往前拉伸镜头时间

    recovery_time 摄像机恢复时间

    stretch_length 摄像机每次前后拉伸长度

    shake_angle 震动角度

]]

function startShake( self, shake_power, frequency, shake_time,start_shake_time,recovery_time,stretch_length,shake_angle)

   local T = 1 / frequency

if shake_angle == 0 then

shake_angle = math.random(0, 360)

self._phaseX = math.random(0, 1)*T

self._phaseY = math.random(0, 1)*T

self._phaseZ = math.random(0, 1)*T

else

self._phaseX = T

self._phaseY = T

self._phaseZ = T

end

if CameraUtils.curCameraType == GameCameraType.Camera_3D then

    local amount = _hShake*shake_power + _vShake*shake_power

    self._shakeAmount = Quaternion.AngleAxis(shake_angle, Vector3.up) * amount

else

    local amount = _h2DShake*shake_power

    self._shakeAmount = Quaternion.AngleAxis(shake_angle, Vector3.forward) * amount

    end

    if recovery_time == nil or recovery_time > shake_time then

        recovery_time = shake_time

    end

    if start_shake_time == nil or start_shake_time > recovery_time then

        start_shake_time = recovery_time

    end

    if stretch_length == nil or stretch_length == 0 then

        stretch_length = 0.2

    end

    local camera = CameraUtils.GetCurCamera()

    if self.fieldOfViewBool then

        self.fieldOfViewBool = false

        self.fieldOfView = camera.fieldOfView

    end

    camera.fieldOfView = self.fieldOfView

    if self._shakeTimer == 0 then

        self.oldCameraPos = camera.transform.position

    else

        camera.transform.position = self.oldCameraPos

    end

self._shakeTime = shake_time

self._shakeTimer = shake_time

    self._shakeFrequency = frequency

    self.start_shake_time = start_shake_time

    self._recovery_time = recovery_time

    self._stretch_length = stretch_length

    self._isInShake = true

end

 

function endShake( self )

    self._isInShake = false

    self._shakeTimer = 0

    self._recovery_time = 0

    self.start_shake_time = 0

    self._shakeOffset = Vector3.zero

    self._stretch_length = 0

    local camera = CameraUtils.GetCurCamera()

    if self.fieldOfView then

        camera.fieldOfView = self.fieldOfView

    end

    if self.oldCameraPos ~= nil then

        camera.transform.position = self.oldCameraPos

    end

end

 

local function triFun( t, a, T )

    local tt = t - math.floor(t / T) * T

return 2 * a * math.abs(1 - 2 / T * tt) - a

end

 

local function UpdateShake( self, elapsedTime )

    if self._isInShake == false then return end

 

    local falloff = self._shakeTimer / self._shakeTime

    self._shakeTimer = self._shakeTimer - elapsedTime

    self._recovery_time = self._recovery_time - elapsedTime

    self.start_shake_time = self.start_shake_time - elapsedTime

    if self._shakeTimer > 0 then

local amountX = self._shakeAmount.x * falloff

local amountY = self._shakeAmount.y * falloff

local amountZ = self._shakeAmount.z * falloff

local time = self._shakeTimer

local shtX = time + self._phaseX

local shtY = time + self._phaseY

local shtZ = time + self._phaseZ

local T = 1 / self._shakeFrequency

local am = self._shakeAmount.magnitude * falloff * 0.5

        local camera = CameraUtils.GetCurCamera()

self._shakeOffset = Vector3(triFun(shtX, amountX, T), triFun(shtY, amountY, T), triFun(shtZ, amountZ, T)) + camera.gameObject.transform.forward * triFun(time, am, T)

        local auto_gen_vector3 = camera.gameObject.transform.position + self._shakeOffset

        GameObjectHelper.position( camera.gameObject, auto_gen_vector3.x, auto_gen_vector3.y, auto_gen_vector3.z)

        if self._recovery_time < 0 and self._recovery_time + elapsedTime >= 0 then

            camera.fieldOfView = self.fieldOfView

        else if self.start_shake_time <= 0 and self._recovery_time >= 0 and camera.fieldOfView >= 12 then

            camera.fieldOfView = camera.fieldOfView - self._stretch_length

        end

        end

    else

self:endShake()

end

end

 

你可能感兴趣的:(unity)