local acos = math.acos local clamp = Mathf.Clamp local sqrt = Mathf.Sqrt local setmetatable = setmetatable local rawset = rawset local rawget = rawget local Vector2 = {} local get = tolua.initget(Vector2) Vector2.__index = function(t,k) local var = rawget(Vector2, k) if var == nil then var = rawget(get, k) if var ~= nil then return var(t) end end return var end Vector2.__call = function(t, x, y) return Vector2.New(x, y) end function Vector2.New(x, y) -- print(debug.traceback("")) -- print("2222222222222222222222222 Vector2.New") local v = {x = x or 0, y = y or 0} setmetatable(v, Vector2) return v end function Vector2:Set(x,y) self.x = x or 0 self.y = y or 0 end function Vector2:Get() return self.x, self.y end function Vector2:SqrMagnitude() return self.x * self.x + self.y * self.y end function Vector2:Clone() return Vector2.New(self.x, self.y) end function Vector2:Normalize() local v = self:Clone() return v:SetNormalize() end function Vector2:SetNormalize() local num = self:Magnitude() if num == 1 then return self elseif num > 1e-05 then self:Div(num) else self:Set(0,0) end return self end function Vector2.Dot(lhs, rhs) return lhs.x * rhs.x + lhs.y * rhs.y end function Vector2.Angle(from, to) return acos(clamp(Vector2.Dot(from:Normalize(), to:Normalize()), -1, 1)) * 57.29578 end function Vector2.Magnitude(v2) return sqrt(v2.x * v2.x + v2.y * v2.y) end function Vector2:Div(d) self.x = self.x / d self.y = self.y / d return self end function Vector2:Mul(d) self.x = self.x * d self.y = self.y * d return self end function Vector2:Add(b) self.x = self.x + b.x self.y = self.y + b.y return self end function Vector2:Sub(b) self.x = self.x - b.x self.y = self.y - b.y return end Vector2.__tostring = function(self) return string.format("[%f,%f]", self.x, self.y) end Vector2.__div = function(va, d) return Vector2.New(va.x / d, va.y / d) end Vector2.__mul = function(va, d) return Vector2.New(va.x * d, va.y * d) end Vector2.__add = function(va, vb) return Vector2.New(va.x + vb.x, va.y + vb.y) end Vector2.__sub = function(va, vb) return Vector2.New(va.x - vb.x, va.y - vb.y) end Vector2.__unm = function(va) return Vector2.New(-va.x, -va.y) end Vector2.__eq = function(va,vb) return va.x == vb.x and va.y == vb.y end get.up = function() return Vector2.New(0,1) end get.right = function() return Vector2.New(1,0) end get.zero = function() return Vector2.New(0,0) end get.one = function() return Vector2.New(1,1) end get.magnitude = Vector2.Magnitude get.normalized = Vector2.Normalize get.sqrMagnitude = Vector2.SqrMagnitude UnityEngine.Vector2 = Vector2 setmetatable(Vector2, Vector2) return Vector2