2025-06-04 05:02:57 +08:00

406 lines
12 KiB
Plaintext

NGUIUtil = {}
NGUIUtil.AnchorSide = {
BottomLeft=1,
Left=2,
TopLeft=3,
Top=4,
TopRight=5,
Right=6,
BottomRight=7,
Bottom=8,
Center=9,
}
function NGUIUtil.ChangeRenderQ(role,renderQ)
GameObjectUtil.Instance:ChangeLayersRecursively (role.gameObject, "UI")
-- change renderQ
local r = role.gameObject:GetComponentsInChildren(Renderer)
for i=1,#r do
local m = r [i].sharedMaterials
for j=1,#m do
m[j].renderQueue = renderQ
end
end
end
function NGUIUtil.GetOrAddComponent(obj, comp)
local result = obj:GetComponent(comp);
result = obj or obj:AddComponent(comp);
return result;
end
-- dir 0:minus 1:add
function NGUIUtil.SliderChangeValue(slider, tovalue, time ,dir)
local nowValue = slider.value;
if(dir == 1)then
tovalue = tovalue<nowValue and tovalue+1 or tovalue;
elseif(dir == 0)then
tovalue = tovalue>nowValue and tovalue-1 or tovalue;
end
LeanTween.cancel(slider.gameObject);
LeanTween.value (slider.gameObject, function (f)
f = f<0 and f+1 or f;
f = f>0 and f-1 or f;
slider.value = f;
end, nowValue, tovalue, time):setDestroyOnComplete (true);
end
function NGUIUtil.PlayUIAnim(obj, animName)
local animator = obj:GetComponent(Animator);
if(animator == nil) then
error "cannot fin animator"
end
animator:Play (animName, -1, 0);
end
function NGUIUtil:GetCameraByLayername(layerName)
local layer = LayerMask.NameToLayer(layerName);
self.cameras = self.cameras or {};
local camera = self.cameras[layerName];
if(camera or GameObjectUtil.Instance:ObjectIsNULL(camera))then
camera = NGUITools.FindCameraForLayer(layer);
self.cameras[layerName] = camera;
end
return camera;
end
function NGUIUtil.GetAnchorPoint(widget,anchorTarget,side,pixelOffset)
pixelOffset = pixelOffset or {0,0}
local pc = anchorTarget and anchorTarget.gameObject:GetComponent(UIPanel) or nil
local relativeOffset = {0,0}
local mRect = Rect(0,0,0,0)
if(anchorTarget ~=nil) then
local b = anchorTarget:CalculateBounds(anchorTarget.transform.parent);
mRect.x = b.min.x;
mRect.y = b.min.y;
mRect.width = b.size.x;
mRect.height = b.size.y;
elseif(pc~=nil) then
else return Vector3(0,0,0)
end
local Side = NGUIUtil.AnchorSide
local cx = (mRect.xMin + mRect.xMax) * 0.5;
local cy = (mRect.yMin + mRect.yMax) * 0.5;
local v = Vector3(cx, cy, 0);
if(side ~= Side.Center) then
if (side == Side.Right or side == Side.TopRight or side == Side.BottomRight) then v.x = mRect.xMax;
elseif (side == Side.Top or side == Side.Center or side == Side.Bottom)then v.x = cx;
else v.x = mRect.xMin end
if (side == Side.Top or side == Side.TopRight or side == Side.TopLeft)then v.y = mRect.yMax;
elseif (side == Side.Left or side == Side.Center or side == Side.Right)then v.y = cy;
else v.y = mRect.yMin end
end
local width = mRect.width;
local height = mRect.height;
v.x = v.x + pixelOffset[1] + relativeOffset[1] * width;
v.y = v.y + pixelOffset[2] + relativeOffset[2] * height;
v.x = Mathf.Round(v.x);
v.y = Mathf.Round(v.y);
if (pc ~= null) then
v = pc.cachedTransform:TransformPoint(v);
elseif (anchorTarget ~= null) then
local t = anchorTarget.transform.parent;
if (t ~= null) then v = t:TransformPoint(v) end
end
-- v.z = widget.transform.position.z;
return v
end
function NGUIUtil.DrawAbilityPolygon(pObj, lObj, radiu, values)
local resultObjs = {};
local points = {};
for i = 1, #values do
points[i] = {};
local a = (360/#values)*(#values - i + 1)+90;
a = ((a % 360)/180)*math.pi;
local length = radiu*values[i];
points[i].length = length;
points[i].point = Vector3(length * math.cos(a), length*math.sin(a), 0);
end
for i = 1, #points do
if(pObj)then
local cpyPoint = GameObject.Instantiate(pObj);
cpyPoint:SetActive(true);
cpyPoint.transform:SetParent(pObj.transform.parent, false);
cpyPoint.transform.localPosition = points[i].point;
cpyPoint.name = "p"..i;
table.insert(resultObjs, cpyPoint);
end
if(lObj)then
local cpyLine = GameObject.Instantiate(lObj);
cpyLine:SetActive(true);
cpyLine.transform:SetParent(lObj.transform.parent, false);
cpyLine.transform.localPosition = points[i].point;
local nextPIndex = (i)%6 + 1;
local lineV3 = points[nextPIndex].point - points[i].point;
local deg = math.acos(lineV3.x/lineV3.magnitude);
local tempa = math.deg(deg);
if(lineV3.y < 0)then
tempa = 360 - tempa;
end
cpyLine.transform.rotation = Quaternion.Euler (0,0, tempa);
cpyLine:GetComponent(UISprite).width = math.floor(lineV3.magnitude+2);
cpyLine.name = "l"..i;
table.insert(resultObjs, cpyLine);
end
end
return resultObjs;
end
function NGUIUtil.AddComponent(obj,component)
obj = obj.gameObject
local already = obj:GetComponent(component)
if(not already) then
obj:AddComponent(component)
end
end
function NGUIUtil.MaskButton(button, clickevent, color)
local temp = {};
local widgets = button:GetComponentsInChildren(UIWidget);
local color = color or Color(0.5,0.5,0.5);
temp.catchColor = {};
local maxLv = 0;
for i=1,#widgets do
local v = widgets[i];
temp.catchColor[v] = v.color;
v.color = color;
maxLv = math.max(maxLv, v.depth);
end
local mask = GameObjectUtil.Instance:DeepFind(button, "ButtonMask");
if(not mask)then
local rid = ResourcePathHelper.UICell("ButtonMask");
mask = Game.AssetManager_UI:CreateAsset(rid, button);
mask.name = "ButtonMask";
mask.transform.localPosition = Vector3.zero;
end
if(clickevent)then
UIEventListener.Get(mask).onClick = clickevent;
end
temp.mask = mask;
local maskWidget = mask:GetComponent(UIWidget);
maskWidget.depth = maxLv+1;
local bound = NGUIMath.CalculateRelativeWidgetBounds(button.transform);
maskWidget.width = bound.size.x;
maskWidget.height = bound.size.y;
NGUITools.UpdateWidgetCollider(mask);
return temp;
end
function NGUIUtil.CheckScrollViewShouldMove(scrollView)
local mPanel = scrollView.panel;
local clip = mPanel.finalClipRegion;
local b = scrollView.bounds;
local hx = (clip.z == 0) and Screen.width or clip.z * 0.5;
local hy = (clip.w == 0) and Screen.height or clip.w * 0.5;
if (scrollView.canMoveHorizontally)then
if (b.min.x < clip.x - hx)then
return true;
elseif(b.max.x > clip.x + hx)then
return true;
end
elseif(scrollView.canMoveVertically)then
if(b.min.y < clip.y - hy)then
return true;
end
if(b.max.y > clip.y + hy)then
return true;
end
end
return false;
end
function NGUIUtil.HelpChangePageByDrag(scrollView, preEvt, nextEvt, offsetValue)
offsetValue = offsetValue or 100;
local startPos = nil;
local mTrans = scrollView.transform;
local isHorizontally = scrollView.canMoveHorizontally;
local shouldMove = false;
scrollView.onDragStarted = function ()
triggerFunc = nil;
shouldMove = NGUIUtil.CheckScrollViewShouldMove(scrollView)
end
scrollView.onDragFinished = function ()
local bounds = scrollView.bounds;
local mPanel = scrollView.panel;
if(shouldMove)then
local pCorners = mPanel.worldCorners;
local topCorner = (pCorners[2]+pCorners[3])*0.5;
topCorner = mTrans:InverseTransformPoint(topCorner);
local preVal = isHorizontally and topCorner.x - bounds.max.x or topCorner.y - bounds.max.y;
if(preVal >= offsetValue)then
triggerFunc = preEvt;
end
local downCorner = (pCorners[1]+pCorners[4])*0.5;
downCorner = mPanel.transform:InverseTransformPoint(downCorner);
local nextVal = isHorizontally and bounds.min.x - downCorner.x or bounds.min.y - downCorner.y;
if(nextVal >= offsetValue)then
triggerFunc = nextEvt;
end
end
end
scrollView.onStoppedMoving = function ()
if(triggerFunc~=nil)then
triggerFunc();
triggerFunc = nil;
end
end
end
EnlargeCenterCell_Control = class("EnlargeCenterCell_Control");
function EnlargeCenterCell_Control:ctor(scrollView, cellsParent, minScale, changeDis, dir)
self.v3 = LuaVector3(0,0,0);
self.scrollView = scrollView;
self.scrollView_LocalPos_x, self.scrollView_LocalPos_y = LuaGameObject.GetLocalPosition( scrollView.transform );
self.cellsParent = cellsParent.transform;
self.dir = dir;
local panel = scrollView:GetComponent(UIPanel);
local cors = panel.worldCorners;
self.center = cors[1] + cors[2];
panel.onClipMove = function ()
for i=1,self.cellsParent.childCount do
local childTrans = self.cellsParent:GetChild(i-1);
local pos_x, pos_y = LuaGameObject.GetPosition( childTrans );
local scale;
if(dir == 1)then
local delta = 360 * math.abs(self.center[1] - pos_x) * (1- minScale) / changeDis;
scale = math.clamp(1 - delta, minScale, 1);
elseif(dir == 2)then
local delta = 360 * math.abs(self.center[2] - pos_y) * (1- minScale) / changeDis;
scale = math.clamp(1 - delta, minScale, 1);
end
self.v3:Set(scale, scale, scale);
childTrans.localScale = self.v3;
end
end
self.centerOnChild = self.cellsParent:GetComponent(UICenterOnChild);
if(self.centerOnChild == nil)then
return;
end
scrollView.onDragFinished = function ()
local minDelta, delta, centerTrans = changeDis;
for i=1,self.cellsParent.childCount do
local childTrans = self.cellsParent:GetChild(i-1);
local pos_x, pos_y = LuaGameObject.GetPosition( childTrans );
if(dir == 1)then
delta = 360 * math.abs(self.center[1] - pos_x);
elseif(dir == 2)then
delta = 360 * math.abs(self.center[2] - pos_y);
end
if(delta < minDelta)then
centerTrans = childTrans
end
end
if(centerTrans == nil and self.cellsParent.childCount > 0)then
centerTrans = self.cellsParent:GetChild(0);
end
if(centerTrans ~= nil)then
self.centerOnChild:CenterOn(centerTrans);
end
end
self.centerOnChild.onCenter = function (centerGO)
self:_OnCenter(centerGO);
end
end
function EnlargeCenterCell_Control:_OnCenter(centerGO)
self.centerGO = centerGO;
self.centerIndex = 0;
local maxNum = self.cellsParent.childCount;
for i=1,maxNum do
local trans = self.cellsParent:GetChild(i-1);
if(trans == centerGO.transform)then
self.centerIndex = i;
break;
end
end
if(maxNum > 1)then
if(self.centerIndex > 1)then
self.preGO = self.cellsParent:GetChild(self.centerIndex - 2);
else
self.preGO = nil;
end
if(self.centerIndex < maxNum)then
self.nextGO = self.cellsParent:GetChild(self.centerIndex);
else
self.nextGO = nil;
end
end
if(self.preSymbol)then
self.preSymbol:SetActive(self.preGO ~= nil);
end
if(self.nextSymbol)then
self.nextSymbol:SetActive(self.nextGO ~= nil);
end
if (self.centerEndCall) then
self.centerEndCall(self.centerEndCallParam, centerGO, self.centerIndex);
end
end
function EnlargeCenterCell_Control:SetCenterCall( centerEndCall, centerEndCallParam )
if(self.centerOnChild == nil)then
return;
end
self.centerEndCall = centerEndCall;
self.centerEndCallParam = centerEndCallParam;
end
function EnlargeCenterCell_Control:SetPreSymbol(go, addEvent)
self.preSymbol = go;
if(addEvent)then
UIEventListener.Get(go).onClick = function (go)
self.centerOnChild:CenterOn(self.preGO);
end;
end
end
function EnlargeCenterCell_Control:SetNextSymbol(go, addEvent)
self.nextSymbol = go;
if(addEvent)then
UIEventListener.Get(go).onClick = function (go)
self.centerOnChild:CenterOn(self.nextGO);
end;
end
end
function EnlargeCenterCell_Control:CenterOn(index, noTween, forceRefresh)
if(self.centerOnChild == nil)then
return;
end
local childTrans = self.cellsParent:GetChild(index - 1);
if(childTrans)then
self.scrollView:DisableSpring();
if(noTween)then
self.scrollView:ResetPosition();
local pos_x, pos_y = LuaGameObject.GetLocalPosition( childTrans );
self.v3:Set(-pos_x + self.scrollView_LocalPos_x, -pos_y + self.scrollView_LocalPos_y);
self.scrollView.transform.localPosition = self.v3;
self.v3:Set(pos_x, pos_y);
self.scrollView.panel.clipOffset = self.v3;
else
self.centerOnChild:CenterOn(childTrans);
end
if(forceRefresh or self.centerGO ~= childTrans)then
self:_OnCenter(childTrans);
end
end
end
function NGUIUtil.Panel_EnlargeCenterCell(scrollView, cellsParent, minScale, changeDis, dir)
return EnlargeCenterCell_Control.new(scrollView, cellsParent, minScale, changeDis, dir);
end