forked from endernon/PGRData
56 lines
No EOL
1.9 KiB
Lua
56 lines
No EOL
1.9 KiB
Lua
XUiGravity = XClass(XLuaBehaviour, "XUiGravity")
|
|
-- 范围(防止画面抖动)
|
|
local range = 0.01
|
|
|
|
function XUiGravity:Ctor(rootUi, ui, minX, maxX, minY, maxY)
|
|
self.minX = minX
|
|
self.maxX = maxX
|
|
self.minY = minY
|
|
self.maxY = maxY
|
|
self.lastAttitude = CS.UnityEngine.Vector3.zero
|
|
self.testV = 0
|
|
self.testSpeed = 0.01
|
|
end
|
|
|
|
function XUiGravity:Start()
|
|
CS.UnityEngine.Input.gyro.enabled = true
|
|
end
|
|
|
|
function XUiGravity:Update()
|
|
self.testV = self.testV + self.testSpeed
|
|
if self.testV > 1 then
|
|
self.testSpeed = -0.01
|
|
elseif self.testV < -1 then
|
|
self.testSpeed = 0.01
|
|
end
|
|
local transform = self.Transform
|
|
-- local attitude = CS.UnityEngine.Vector3(CS.UnityEngine.Input.gyro.attitude.x, CS.UnityEngine.Input.gyro.attitude.y, 0)
|
|
local attitude = CS.UnityEngine.Vector3(self.testV, 0, 0)
|
|
--使安全范围内 - 1之1
|
|
attitude.x = XMath.Clamp(attitude.x, -1, 1);
|
|
attitude.y = XMath.Clamp(attitude.y, -1, 1);
|
|
|
|
local x = transform.localPosition.x
|
|
local y = transform.localPosition.y
|
|
|
|
local isDirty = false
|
|
if math.abs(self.lastAttitude.x - attitude.x) >= range then
|
|
isDirty = true
|
|
local direction = attitude.x - self.lastAttitude.x
|
|
local position = direction * (self.maxX - self.minX) / 2
|
|
x = XMath.Clamp(transform.localPosition.x - position, self.minX, self.maxX);
|
|
self.lastAttitude = attitude
|
|
end
|
|
if math.abs(self.lastAttitude.y - attitude.y) >= range then
|
|
isDirty = true
|
|
local direction = attitude.y - self.lastAttitude.y
|
|
local position = direction * (self.maxY - self.minY) / 2
|
|
y = XMath.Clamp(transform.localPosition.y - position, self.minY, self.maxY);
|
|
self.lastAttitude = attitude
|
|
end
|
|
if isDirty then
|
|
transform.localPosition = CS.UnityEngine.Vector3(x, y, transform.localPosition.z);
|
|
end
|
|
end
|
|
|
|
return XUiGravity |