Csharp/C#教程:Unity实现移动端手势解锁功能分享

本文实例为大家分享了Unity实现移动端手势解锁的具体代码,供大家参考,具体内容如下

一、效果演示

Unity实现移动端手势解锁功能

二、实现思路

——当鼠标选中一个密码按钮时开始记录输入的数字和鼠标的起始位置
——当鼠标按下过程中,始终根据记录的鼠标起始位置和当前鼠标的位置两个点绘制线段并添加到线段的列表中,并一直清空掉列表中除了最后一个线段外的其余线段
——当鼠标按下过程中,如果有覆盖到其他的密码按钮,则根据起始的密码按钮与当前的密码按钮两个点绘制线段并重新记录输入的数字和鼠标起始位置

三、实现过程

——创建9个密码块,并依次命名为1、2…..9,并设置tag为PasswordBlock

Unity实现移动端手势解锁功能

——编写生成LineRenderer的方法,初始化LineRenderer属性的方法,绘制线的方法以及清空线的方法
注意绘制线段时,需要将起始位置和结束位置的z轴置为0

Unity实现移动端手势解锁功能

——编写记录密码和删除密码的方法

Unity实现移动端手势解锁功能

四、完整代码(挂载到手势解锁界面的物体身上)

usingUnityEngine; usingSystem.Collections.Generic; usingUnityEngine.EventSystems; publicclassGestureUnlock:MonoBehaviour,IBeginDragHandler,IEndDragHandler,IDragHandler { privateList<GameObject>lrList=newList<GameObject>();//存储每个LineRenderer的列表 privateList<GameObject>passwordButtonList=newList<GameObject>();//存储每个密码按钮的列表 privateVector3startPos;//鼠标开始的位置 //线的参数 publicColorstartColor=Color.black;//线开始的颜色 publicColorendColor=Color.black;//线结束的颜色 publicfloatwidth=0.1f;//线宽度 publicintvertices=90;//顶点数 publicstringpassword;//密码 privatestringinputPassword;//输入的密码 ///<summary> ///刷新线段(拖拽过程中一直刷新) ///</summary> privatevoidRefreshLine() { if(passwordButtonList.Count==0) { return; } LineRendereruncompleteLR=SpawnLineRenderer(false); InitLine(uncompleteLR); DrawLine(uncompleteLR,startPos,ScreenToWorld(Input.mousePosition)); ClearLine(false); } ///<summary> ///绘制已经连线完成的线段 ///</summary> privatevoidDrawCompleteLine(Vector3endPos) { LineRenderercompleteLR=SpawnLineRenderer(true); InitLine(completeLR); DrawLine(completeLR,startPos,endPos); } ///<summary> ///记录密码 ///</summary> ///<paramname="_passwordBlock">密码块物体</param> privatevoidRecordPassword(GameObject_passwordButton) { passwordButtonList.Add(_passwordButton); inputPassword+=_passwordButton.name; startPos=_passwordButton.transform.position;//记录起始位置 } ///<summary> ///删除密码 ///</summary> privatevoidDeletePassword() { passwordButtonList.Clear(); inputPassword=""; } publicvoidOnBeginDrag(PointerEventDataeventData) { ClearLine(true);//每次开始拖拽时清空所有线段 GameObjectgo=eventData.pointerEnter; if(go!=null&&go.tag=="PasswordButton"&&IsExistInPasswordBlockList(go)==false) { RecordPassword(go);//记录密码 } } publicvoidOnEndDrag(PointerEventDataeventData) { ClearUnCompleteLine();//清除未完成的线段 } publicvoidOnDrag(PointerEventDataeventData) { RefreshLine();//刷新线段(拖拽过程中一直刷新) GameObjectgo=eventData.pointerEnter; if(passwordButtonList.Count!=0&&go!=null&&go.tag=="PasswordButton"&&IsExistInPasswordBlockList(go)==false) { DrawCompleteLine(go.transform.position);//绘制已经连线完成的线段 RecordPassword(go);//记录密码 } } #region线段相关操作 ///<summary> ///生成LineRenderer ///</summary> privateLineRendererSpawnLineRenderer(boolisCompleteLine) { LineRendereruncompleteLR=newGameObject().AddComponent<LineRenderer>(); uncompleteLR.material=newMaterial(Shader.Find("Sprites/Default")); lrList.Add(uncompleteLR.gameObject); if(isCompleteLine) { uncompleteLR.gameObject.name="CompleteLine"; } else { uncompleteLR.gameObject.name="UncompleteLine"; } returnuncompleteLR; } ///<summary> ///初始化线 ///</summary> privatevoidInitLine(LineRenderer_uncompleteLR) { _uncompleteLR.startColor=startColor; _uncompleteLR.endColor=endColor; _uncompleteLR.startWidth=width; _uncompleteLR.endWidth=width; _uncompleteLR.numCapVertices=vertices; _uncompleteLR.numCornerVertices=vertices; } ///<summary> ///两点绘制一条直线 ///</summary> ///<paramname="_uncompleteLR">线段</param> ///<paramname="startPos">起始位置</param> ///<paramname="endPos">结束位置</param> privatevoidDrawLine(LineRenderer_uncompleteLR,Vector3startPos,Vector3endPos) { _uncompleteLR.positionCount=2; startPos.z=0; endPos.z=0; _uncompleteLR.SetPosition(0,startPos); _uncompleteLR.SetPosition(1,endPos); } ///<summary> ///清除线段 ///</summary> ///<paramname="clearAll">是否清除全部线段</param> privatevoidClearLine(boolclearAll) { if(lrList.Count==0) { return; } for(inti=lrList.Count-1;i>=0;i--) { GameObjectgo=lrList[i]; if(clearAll) { Destroy(go); lrList.Remove(go); } else { if(go.name!="CompleteLine"&&i!=lrList.Count-1) { Destroy(go); lrList.Remove(go); } } } if(clearAll) { DeletePassword(); } } ///<summary> ///清除未完成的线段(每次拖拽结束时清除) ///</summary> privatevoidClearUnCompleteLine() { if(lrList.Count==0) { return; } GameObjectgo=lrList[lrList.Count-1]; Destroy(go); lrList.Remove(go); } #endregion #region工具方法 ///<summary> ///当前密码块是否存在于密码块列表中 ///</summary> ///<paramname="_passwordBlock">密码块</param> privateboolIsExistInPasswordBlockList(GameObject_passwordButton) { if(passwordButtonList.Count==0) { returnfalse; } if(passwordButtonList.Contains(_passwordButton)) { returntrue; } else { returnfalse; } } ///<summary> ///屏幕坐标转世界坐标 ///</summary> ///<paramname="screenPos">屏幕坐标位置</param> ///<paramname="camera">相机</param> ///<returns>转换后的世界坐标</returns> privateVector3ScreenToWorld(Vector3screenPos,Cameracamera=null) { if(camera==null) { camera=Camera.main; } Vector3_screenPos=newVector3(screenPos.x,screenPos.y,-camera.transform.position.z); Vector3v=camera.ScreenToWorldPoint(_screenPos); returnv; } #endregion } 您可能感兴趣的文章:UnityUGUI实现滑动翻页效果

标签: 手势 解锁 ni

javascript实现支付宝滑块验证码效果

Keras模型转成tensorflow的.pb操作

上述就是C#学习教程:Unity实现移动端手势解锁功能分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/903833.html

(0)
上一篇 2021年10月21日
下一篇 2021年10月21日

精彩推荐