生活工程体验信仰哲学精神
投稿投诉
精神世界
探索历史
哲学文学
艺术价值
信仰创造
境界审美
体验技术
技能工具
工程信息
医学生产
生活运用
操作能力

使用Unity3DUGUI实现翻书效果

2月26日 呛人心投稿
  Unity3D运行截屏
  提示:素材来源网络,侵权必删一、准备工作
  1。新建Unity工程准备几张图片,新建一个文件夹放进去,然后把文件夹放在Resources文件夹下。
  2。新建Hierarchy面板
  如图二、使用步骤
  1。新建UIBook脚本,挂在UIBook上
  代码如下(示例):usingSusingSystem。CusingUnityEnamespaceHKZ{publicclassUIBook:MonoBehaviour{组件privateRectTprivateSprite〔〕bookS存放所以的图片(书页)privateRectTransformclippingM引用summary正在翻页的书页的左面summaryprivateTheDraggingPageleftSideOfPsummary正在翻页的书页的右面summaryprivateTheDraggingPagerightSideOfPsummary左侧静止页面summaryprivatePageleftPsummary右侧静止页面summaryprivatePagerightPprivateDragPageBasedragPsummary数据类summaryprivateBookModelsbookM数据privateintcurrentLeftId;当前左边页数privatefloataniDuration0。5f;privateboolisDpublicintCurrentLeftId{get{returncurrentLeftId;}set{currentLeftIif(currentLeftId1){currentLeftId1;}elseif(currentLeftIdbookSprites。Length1){currentLeftIdbookSprites。Length1;}}}privatevoidStart(){CInitAddComponent(outcanvas);初始化InitDate(canvas);UpdateID(isDragging);}summary初始化,找到子项并添加相应的脚本(正在翻页,静态页面)summaryprivatevoidInitAddComponent(outCanvascanvas){rectGetComponentRectTransform();获取组件foreach(Canvascinrect。GetComponentsInParentCanvas()){if(c。isRootCanvas){}}clippingMaskrect。Find(ClippingMask)。GetComponentRectTransform();rightPagerect。Find(RightPage)。gameObject。AddComponentPage();leftPagerect。Find(LeftPage)。gameObject。AddComponentPage();rightSideOfPagerect。Find(RightSide)。gameObject。AddComponentTheDraggingPage();leftSideOfPagerect。Find(LeftSide)。gameObject。AddComponentTheDraggingPage();rect。Find(RightDragButton)。gameObject。AddComponentDragButton()。Init(OnMouseDragRightPage,OnUpdatePage,OnEndDragRightPage);rect。Find(LeftDragButton)。gameObject。AddComponentDragButton()。Init(OnMouseDragLeftPage,OnUpdatePage,OnEndDragLeftPage);rightPage。Init(GetSprite);leftPage。Init(GetSprite);rightSideOfPage。Init(GetSprite);leftSideOfPage。Init(GetSprite);}privateSpriteGetSprite(intindex){if(index0indexbookSprites。Length){returnbookSprites〔index〕;}}summary初始化数据(加载图片,设置整个UIBook大小)summaryprivatevoidInitDate(Canvascanvas){bookModelsnewBookModels();创建并初始化bookSpritesResources。LoadAllSprite(Book);加载所有的图片(书页)if(bookSprites。Length0){rect。sizeDeltanewVector2(bookSprites〔0〕。rect。width2,bookSprites〔0〕。rect。height);设置UIBook大小}CurrentLeftId1;isDfloatscaleFactor1;默认图片缩放比例为1if(canvas!null){scaleFactorcanvas。scaleF}计算屏幕上书页的显示尺寸floatpageWidthrect。rect。widthscaleFactor2;;书页宽度floatpageHeightrect。rect。heightscaleF书页高度底边中心点的获取Vector3posrect。positionVector3。downpageHeight2;bookModels。BottomCenterWorld2LocalPos(pos);右下角坐标posrect。positionVector3。downpageHeight2Vector3。rightpageWbookModels。RightCornerWorld2LocalPos(pos);上边中心点的获取posrect。positionVector3。uppageHeight2;bookModels。TopCenterWorld2LocalPos(pos);左下角坐标的获取posrect。positionVector3。downpageHeight2Vector3。leftpageWbookModels。LeftCornerWorld2LocalPos(pos);floatwidthrect。rect。width2;floatheightrect。rect。每页的宽度bookModels。PageW对角线的计算bookModels。PageDiagonalMathf。Sqrt(Mathf。Pow(width,2)Mathf。Pow(height,2));设置ClippingMask的大小clippingMask。sizeDeltanewVector2(bookModels。PageDiagonal,bookModels。PageDiagonalbookModels。PageWidth);反转切面的轴心点Y值bookModels。ClippingPivotYbookModels。PageWidthclippingMask。sizeDelta。y;leftSideOfPage。InitShadow(newVector2(bookModels。PageDiagonal,bookModels。PageDiagonal));rightSideOfPage。InitShadow(newVector2(bookModels。PageDiagonal,bookModels。PageDiagonal));}summary获取clippingMasksummaryreturnsreturnspublicRectTransformGetClippingMask(){returnclippingM}summary世界坐标转换为local坐标summaryparamnameworldparamreturnsreturnsprivateVector3World2LocalPos(Vector3world){returnrect。InverseTransformPoint(world);}summaryLocal坐标转化世界坐标summaryparamnamelocalparamreturnsreturnspublicVector3Local2WorldPos(Vector3local){returnrect。TransformPoint(local);}privatevoidUpdateID(boolisDragging){if(isDragging){leftPage。IDCurrentLeftId;leftSideOfPage。IDCurrentLeftId1;rightSideOfPage。IDCurrentLeftId2;rightPage。IDCurrentLeftId3;}else{leftPage。IDCurrentLeftId;rightPage。IDCurrentLeftId1;}}开始拖动privatevoidOnMouseDragRightPage(){if(CurrentLeftIdbookSprites。Length1){isDdragPagenewDragRightPage(this,bookModels,leftSideOfPage,rightSideOfPage,rightPage。transform。position);dragPage。BeginDragPage(World2LocalPos(Input。mousePosition));UpdateID(isDragging);}}privatevoidOnMouseDragLeftPage(){if(CurrentLeftId0){dragPagenewDragLeftPage(this,bookModels,rightSideOfPage,leftSideOfPage,leftPage。transform。position);dragPage。BeginDragPage(World2LocalPos(Input。mousePosition));isDCurrentLeftId2;UpdateID(isDragging);}}持续拖动privatevoidOnUpdatePage(){if(isDragging){dragPage。UpdateDrag();}}结束拖动privatevoidOnEndDragRightPage(){if(isDragging){isDboolisLeftJudgeCornerIsLeft();dragPage。EndDragPage(()AniEnd(isLeft));}}结束拖动privatevoidOnEndDragLeftPage(){if(isDragging){isDboolisLeftJudgeCornerIsLeft();dragPage。EndDragPage(()AniEnd(isLeft));}}privateboolJudgeCornerIsLeft(){returnbookModels。CurrentPageCorner。xbookModels。BottomCenter。x;}privatevoidAniEnd(boolisLeft){if(isLeft){CurrentLeftId2;}}summary获取点击位置summaryreturnsreturnspublicVector3GetClickPos(){if(isDragging){returnWorld2LocalPos(Input。mousePosition);}else{returnbookModels。ClickP}}summary计算拖拽角的位置summaryparamnameclickparampublicVector3CulculateDraggingCorner(Vector3click){Vector3cornerVector3。cornerLimitBotomCenter(click);returnLimitTopCenter(corner);}summary获取底边中心点summaryparamnameclickparamreturnsreturnsprivateVector3LimitBotomCenter(Vector3click){Vector3offsetclickbookModels。BottomCfloatradiansMathf。Atan2(offset。y,offset。x);Vector3cornerLimitnewVector3(bookModels。PageWidthMathf。Cos(radians),bookModels。PageWidthMathf。Sin(radians))bookModels。BottomCfloatdistanceVector2。Distance(click,bookModels。BottomCenter);if(distancebookModels。PageWidth){}else{returncornerL}}summary获取上边中心点summaryparamnameclickparamreturnsreturnsprivateVector3LimitTopCenter(Vector3corner){Vector3offsetcornerbookModels。TopCfloatradiansMathf。Atan2(offset。y,offset。x);Vector3cornerLimitnewVector3(bookModels。PageDiagonalMathf。Cos(radians),bookModels。PageDiagonalMathf。Sin(radians))bookModels。TopCfloatdistanceVector2。Distance(corner,bookModels。TopCenter);if(distancebookModels。PageDiagonal)returncornerL}summary计算折叠线的角度数summaryparamnamecornerparamparamnamebookCornerparamreturnsreturnspublicfloatCulculateFoldAngle(Vector3corner,Vector3bookCorner,outVector3bottomCrossPoint){Vector3twoCornerCenter(cornerbookCorner)2;Vector3offsetbookCornertwoCornerCfloatrandiansMathf。Atan2(offset。y,offset。x);floatoffsetXtwoCornerCenter。xoffset。yMathf。Tan(randians);offsetXLimitOffsetX(offsetX,bookCorner,bookModels。BottomCenter);bottomCrossPointnewVector3(offsetX,bookModels。BottomCenter。y);offsetbottomCrossPointtwoCornerCreturnMathf。Atan(offset。yoffset。x)Mathf。Rad2Drandianstodegress}privatefloatLimitOffsetX(floatoffsetX,Vector3bookCorner,Vector3bottomCenter){if(offsetXbottomCenter。xbottomCenter。xbookCorner。x)returnbottomCenter。x;if(offsetXbottomCenter。xbottomCenter。xbookCorner。x)returnbottomCenter。x;returnoffsetX;}publicvoidFlipAni(Vector3target,ActiononComplete){StartCoroutine(PageAni(target,aniDuration,(){if(onComplete!null){onComplete();}ResetDate();}));}privatevoidResetDate(){UpdateID(isDragging);leftSideOfPage。SetActiveState(false);rightSideOfPage。SetActiveState(false);}privateIEnumeratorPageAni(Vector3target,floatduration,ActiononComplete){Vector3offset(targetbookModels。ClickPoint)floatsymbol(targetbookModels。ClickPoint)。x;yieldreturnnewWaitUntil((){bookModels。ClickPointoffsetTime。deltaTdragPage。UpdateDrag();if(symbol0){returnbookModels。ClickPoint。xtarget。x;}else{returnbookModels。ClickPoint。xtarget。x;}});if(onComplete!null){onComplete();}}}}
  2。新建BookModels脚本
  代码如下(示例):usingUnityEnamespaceHKZ{publicclassBookModels{summary一页的宽度summarypublicfloatPageWsummary对角线summarypublicfloatPageDsummary底边中心点summarypublicVector3BottomCsummary顶点中心点summarypublicVector3TopCsummary当前被拖动的书页顶点位置summarypublicVector3CurrentPageCsummary右边书页右下角顶点summarypublicVector3RightCsummary左边书页右下角顶点summarypublicVector3LeftCsummary当前点击的点summarypublicVector3ClickPsummary反转切面的轴心点Y值summarypublicfloatClippingPivotY;}}
  3。新建DragButton脚本
  代码如下(示例):usingSusingUnityEusingUnityEngine。EventSnamespaceHKZ{publicclassDragButton:MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler{privateActiononBeginDprivateActiononDprivateActiononEndDsummary初始化数据summaryparamnameonBeginDragparamparamnameonDragparamparamnameonEndDragparampublicvoidInit(ActiononBeginDrag,ActiononDrag,ActiononEndDrag){this。onBeginDragonBeginDthis。onDragonDthis。onEndDragonEndD}summary开始拖动summaryparamnameeventDataparampublicvoidOnBeginDrag(PointerEventDataeventData){if(onBeginDrag!null){onBeginDrag();}}summary持续拖动summaryparamnameeventDataparampublicvoidOnDrag(PointerEventDataeventData){if(onDrag!null){onDrag();}}summary结束拖动summaryparamnameeventDataparampublicvoidOnEndDrag(PointerEventDataeventData){if(onEndDrag!null){onEndDrag();}}}}
  4。新建DragLeftPage脚本
  代码如下(示例):usingUnityEnamespaceHKZ{publicclassDragLeftPage:DragPageBase{publicDragLeftPage(UIBookuIBook,BookModelsbookModels,TheDraggingPagefrontPage,TheDraggingPagebackPage,Vector3startPos):base(uIBook,bookModels,frontPage,backPage,startPos){}protectedoverrideVector3GetBookCorner(){returnbookModels。LeftC}protectedoverrideVector2GetCilppingMaskPivot(){returnnewVector2(0,bookModels。ClippingPivotY);}protectedoverrideVector2GetPagePivot(){returnVector2。}protectedoverrideVector3GetValidAngle(floatangle){returnVector3。forward(angle180);}}}
  5。新建DragRightPage脚本
  代码如下(示例):usingUnityEnamespaceHKZ{publicclassDragRightPage:DragPageBase{publicDragRightPage(UIBookuIBook,BookModelsbookModels,TheDraggingPagefrontPage,TheDraggingPagebackPage,Vector3startPos):base(uIBook,bookModels,frontPage,backPage,startPos){}protectedoverrideVector3GetBookCorner(){returnbookModels。RightC}protectedoverrideVector2GetCilppingMaskPivot(){returnnewVector2(1,bookModels。ClippingPivotY);}protectedoverrideVector2GetPagePivot(){returnVector2。}protectedoverrideVector3GetValidAngle(floatangle){returnVector3。}}}
  6。新建IDragPage脚本
  代码如下(示例):usingSusingUnityEnamespaceHKZ{publicinterfaceIDragPage{voidBeginDragPage(Vector3point);voidUpdateDrag();voidEndDragPage(Actioncomplete);}publicabstractclassDragPageBase{privateUIBookuIBprotectedBookModelsbookMprivateTheDraggingPagefrontPprivateTheDraggingPagebackPprivateVector3startPprivateRectTransformclippingMpublicDragPageBase(UIBookuIBook,BookModelsbookModels,TheDraggingPagefrontPage,TheDraggingPagebackPage,Vector3startPos){this。uIBookuIBthis。bookModelsbookMthis。frontPagefrontPthis。backPagebackPthis。startPosstartPclippingMaskuIBook。GetClippingMask();}summary开始拖拽summaryparamnamepointparampublicvoidBeginDragPage(Vector3point){设置中心点clippingMask。pivotGetCilppingMaskPivot();bookModels。ClickPfrontPage。BeginDragPage(startPos,GetPagePivot());backPage。BeginDragPage(startPos,GetPagePivot());}protectedabstractVector2GetCilppingMaskPivot();protectedabstractVector2GetPagePivot();summary拖拽过程summarypublicvoidUpdateDrag(){bookModels。ClickPointuIBook。GetClickPos();backPage。SetParent(clippingMask,true);frontPage。SetParent(uIBook。transform,true);bookModels。CurrentPageCorneruIBook。CulculateDraggingCorner(bookModels。ClickPoint);Vector3bottomCrossPointUpdateClippingMask();UpdateBackSide(bottomCrossPoint);frontPage。SetParent(clippingMask,true);frontPage。ResetShadowDate();frontPage。transform。SetAsFirstSibling();backPage。SetShadowFollow(clippingMask);}privateVector3UpdateClippingMask(){Vector3bottomCrossPfloatangleuIBook。CulculateFoldAngle(bookModels。CurrentPageCorner,GetBookCorner(),outbottomCrossPoint);if(angle0){angleangle90;}else{angleangle90;}clippingMask。eulerAnglesVector3。clippingMask。localPositionbottomCrossPreturnbottomCrossP}protectedabstractVector3GetBookCorner();privatevoidUpdateBackSide(Vector3bottonCrossPoint){backPage。transform。positionuIBook。Local2WorldPos(bookModels。CurrentPageCorner);Vector3offsetbottonCrossPointbookModels。CurrentPageCfloatangleMathf。Atan2(offset。y,offset。x)Mathf。Rad2DbackPage。transform。eulerAnglesGetValidAngle(angle);}protectedabstractVector3GetValidAngle(floatangle);publicvoidEndDragPage(Actioncomplete){Vector3if(bookModels。CurrentPageCorner。xbookModels。BottomCenter。x){cornerbookModels。RightC}else{cornerbookModels。LeftC}uIBook。FlipAni(corner,complete);}}}
  7。新建Page脚本
  代码如下(示例):usingSusingUnityEusingUnityEngine。UI;namespaceHKZ{publicclassPage:MonoBehaviour{引用publicShadowShadow{}组件privateFuncint,SpritegetSprivateImageimgPprotectedRectT数据summary页数publicintID{get{}set{ChangeSprite(value);}}summary初始化数据summaryparamnamegetSpriteparampublicvirtualvoidInit(Funcint,SpritegetSprite){rectGetComponentRectTransform();this。getSpritegetSimgPageGetComponentImage();Shadowtransform。GetChild(0)。gameObject。AddComponentShadow();}summary赋值SpritesummaryparamnameidparamprivatevoidChangeSprite(intid){imgPage。spritegetSprite(id);}summary设置活跃状态summaryparamnameisActiveparampublicvoidSetActiveState(boolisActive){gameObject。SetActive(isActive);}summary设置父物体summaryparamnameparentparamparamnameworldPosStaysparampublicvoidSetParent(Transformparent,boolworldPosStays){transform。SetParent(parent,worldPosStays);}}}
  8。新建Shadow脚本
  代码如下(示例):usingUnityEusingUnityEngine。UI;namespaceHKZ{publicclassShadow:MonoBehaviour{组件privateRectTprivateIprivateColordefaultColornewColor(1,1,1,0。5f);summary初始化数据summaryparamnamesizeparampublicvoidInit(Vector2size){rectGetComponentRectTransform();imageGetComponentImage();rect。sizeD设置大小image。colordefaultC设置颜色}summary设置shadow的位置summaryparamnametargetparampublicvoidSetShadowFollow(Transformtarget){transform。positiontarget。transform。rotationtarget。}publicvoidResetShadowDate(){rect。anchoredPositionVector2。rect。localEulerAnglesVector2。}}}
  9。新建TheDraggingPage脚本
  代码如下(示例):usingSusingUnityEnamespaceHKZ{publicclassTheDraggingPage:Page{publicoverridevoidInit(Funcint,SpritegetSprite){base。Init(getSprite);SetActiveState(false);}summary开始拖动summaryparamnameposparamparamnamepivotparampublicvoidBeginDragPage(Vector3pos,Vector2pivot){SetActiveState(true);rect。transform。transform。eulerAnglesVector3。}summary初始化Shadow的大小summaryparamnamesizeparampublicvoidInitShadow(Vector2size){Shadow。Init(size);}summary让shadow跟随书页summaryparamnametargetparampublicvoidSetShadowFollow(Transformtarget){Shadow。SetShadowFollow(target);}publicvoidResetShadowDate(){Shadow。ResetShadowDate();}}}完结,如何?,翻书效果不错吧,快一键三连双击加关注。
  效果图
投诉 评论 转载

新年去哪儿玩?杨浦不可错过的宝藏地新春逛杨浦对于杨浦人来说五角场是特别的存在宛如儿时记忆的瑰宝今天就带您来挖掘这块宝藏之地五角场五角场分为南部、中部和北部三个地块。南部为商业商务区,以环岛为……口碑榜注意!这些化妆品抽检不合格!在2022年国家化妆品监督抽检工作中,经江苏省食品药品监督检验研究院等单位检验,标示为广州市佳桐化妆品有限公司生产的艾贝尔芳香滋润型染发霜(自然黑色)等70批次化妆品(含牙膏,……今日申购真兰仪表上海真兰仪表科技股份有限公司保荐机构(主承销商):华福证券有限责任公司发行情况:公司简介:真兰仪表主营业务为燃气计量仪表及配套产品的研发、制造和销售。公……郭晶晶,你凭什么让人敬佩?郭晶晶,一个在普通家庭长大的女孩,最后不仅仅成为了世界冠军,还成为了顶流豪门中让人敬佩的豪门媳妇。郭晶晶,很多人都想不明白,她为何人一步又一步走上人生巅峰。郭晶晶,……微信不用打开也能给好友发消息和付款,你还不懂?中老年人特适用微信好友那么多,可我们经常联系的往往就那么几个,同样微信功能那么多,可我们最常用的莫过于付款功能,而每次和好友聊天,都要打开微信,从微信通讯录一堆好友中翻找,还怪麻烦的,有时急……辅仁药业等被执行超8亿元!辅仁药业累计被执行超30亿元,存上中国经济周刊经济网讯天眼查App显示,近日,辅仁药业集团有限公司及法定代表人朱文臣、母公司辅仁科技控股(北京)集团股份有限公司新增两则被执行人信息,执行标的分别为4。12亿余元……郭晓帆专栏迎接春天(组诗)文郭晓帆(山东菏泽)编辑燕子图片网络迎接春天(组诗)1。梅花雪雪席地而坐红梅在雪落之前开始笑意嫣然梅揉碎所有思念,飘落成诗把暖,……国际奥委会发文庆祝北京冬奥会成功举办一周年在北京冬奥会成功举办一周年之际,国际奥委会1日在其官方网站头条位置刊文庆祝,题目为《北京2022年冬奥会:一年来,中国人正越来越喜欢冬季项目,并在社会和经济领域享受冬奥会带来的……电动牙刷有什么危害?详解四大危害弊端!大家经常能看到很多网红博主在讲电动牙刷的好处,但对电动牙刷的危害却少有提及,并不是电动牙刷没有危害,而是商家、博主刻意忽略的结果。因此很多人对电动牙刷认知都存在漏洞,导致很多人……使用Unity3DUGUI实现翻书效果Unity3D运行截屏提示:素材来源网络,侵权必删一、准备工作1。新建Unity工程准备几张图片,新建一个文件夹放进去,然后把文件夹放在Resources文件夹下。……2月大宝宝同时患上4种疾病,医生私人定制手术方案2个月大的康康因为肺炎来到了河南省儿童医院治疗医生查体时发现除了肺部症状康康的口唇、双手双足都发紫考虑到可能存在别的疾病医生为康康安排了相关……创新巧干数字赋能重庆智造2023年第一批重大产业项目开工,17个项目总投资369。7亿元;举办全球招商大会,新签约项目28个新年伊始,奋进新征程、建设新重庆的热情洋溢在两江新区的热土上。变……
夏天穿黑色裙子好看吗彰显你的时尚态度揭秘女人月经量过多吃啥调节呢传奇热度排行榜前三自由之刃在黄龙,寻找初秋的浪漫国米24惨败之战最差先生无争议过渡期新队长已浮出水面九寨沟的风景静心求职技巧进名企不再难海棠叶子发黄注意浇水的量及光照情况遇到碎片化的生活母猪产下男婴揭秘恐怖人猪兽的传闻欢乐颂3都别瞎猜了,方芷衡身份的秘密,被一根手链给出卖了

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找新乡渭南铜川松江山南雅安松原荃湾淮北昭通平凉鞍山赤峰苗栗保亭池州渝北株洲陇南濮阳三沙秀山密云鸡西