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

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

一、效果演示

二、实现思路

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

三、实现过程

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

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

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

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

using UnityEngine;
using System.Collections.Generic;
using UnityEngine.EventSystems;

public class GestureUnlock : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
 private List<GameObject> lrList = new List<GameObject>();//存储每个LineRenderer的列表
 private List<GameObject> passwordButtonList = new List<GameObject>();//存储每个密码按钮的列表

 private Vector3 startPos;//鼠标开始的位置

 //线的参数
 public Color startColor = Color.black;//线开始的颜色
 public Color endColor = Color.black;//线结束的颜色
 public float width = 0.1f;//线宽度
 public int vertices = 90;//顶点数

 public string password;//密码
 private string inputPassword;//输入的密码

 /// <summary>
 /// 刷新线段(拖拽过程中一直刷新)
 /// </summary>
 private void RefreshLine()
 {
 if (passwordButtonList.Count == 0)
 {
 return;
 }

 LineRenderer uncompleteLR = SpawnLineRenderer(false);
 InitLine(uncompleteLR);
 DrawLine(uncompleteLR, startPos, ScreenToWorld(Input.mousePosition));
 ClearLine(false);
 }

 /// <summary>
 /// 绘制已经连线完成的线段
 /// </summary>
 private void DrawCompleteLine(Vector3 endPos)
 {
 LineRenderer completeLR = SpawnLineRenderer(true);
 InitLine(completeLR);
 DrawLine(completeLR, startPos, endPos);
 }

 /// <summary>
 /// 记录密码
 /// </summary>
 /// <param name="_passwordBlock">密码块物体</param>
 private void RecordPassword(GameObject _passwordButton)
 {
 passwordButtonList.Add(_passwordButton);
 inputPassword += _passwordButton.name;

 startPos = _passwordButton.transform.position;//记录起始位置
 }

 /// <summary>
 /// 删除密码
 /// </summary>
 private void DeletePassword()
 {
 passwordButtonList.Clear();
 inputPassword = "";
 }

 public void OnBeginDrag(PointerEventData eventData)
 {
 ClearLine(true);//每次开始拖拽时清空所有线段

 GameObject go = eventData.pointerEnter;
 if (go != null && go.tag == "PasswordButton" && IsExistInPasswordBlockList(go) == false)
 {
 RecordPassword(go);//记录密码
 }
 }

 public void OnEndDrag(PointerEventData eventData)
 {
 ClearUnCompleteLine();//清除未完成的线段
 }

 public void OnDrag(PointerEventData eventData)
 {
 RefreshLine();//刷新线段(拖拽过程中一直刷新)

 GameObject go = eventData.pointerEnter;
 if (passwordButtonList.Count != 0 && go != null && go.tag == "PasswordButton" && IsExistInPasswordBlockList(go) == false)
 {
 DrawCompleteLine(go.transform.position);//绘制已经连线完成的线段

 RecordPassword(go);//记录密码
 }
 }

 #region 线段相关操作

 /// <summary>
 /// 生成LineRenderer
 /// </summary>
 private LineRenderer SpawnLineRenderer(bool isCompleteLine)
 {
 LineRenderer uncompleteLR = new GameObject().AddComponent<LineRenderer>();
 uncompleteLR.material = new Material(Shader.Find("Sprites/Default"));
 lrList.Add(uncompleteLR.gameObject);
 if (isCompleteLine)
 {
 uncompleteLR.gameObject.name = "CompleteLine";
 }
 else
 {
 uncompleteLR.gameObject.name = "UncompleteLine";
 }
 return uncompleteLR;
 }

 /// <summary>
 /// 初始化线
 /// </summary>
 private void InitLine(LineRenderer _uncompleteLR)
 {
 _uncompleteLR.startColor = startColor;
 _uncompleteLR.endColor = endColor;
 _uncompleteLR.startWidth = width;
 _uncompleteLR.endWidth = width;
 _uncompleteLR.numCapVertices = vertices;
 _uncompleteLR.numCornerVertices = vertices;
 }

 /// <summary>
 /// 两点绘制一条直线
 /// </summary>
 /// <param name="_uncompleteLR">线段</param>
 /// <param name="startPos">起始位置</param>
 /// <param name="endPos">结束位置</param>
 private void DrawLine(LineRenderer _uncompleteLR, Vector3 startPos, Vector3 endPos)
 {
 _uncompleteLR.positionCount = 2;
 startPos.z = 0;
 endPos.z = 0;
 _uncompleteLR.SetPosition(0, startPos);
 _uncompleteLR.SetPosition(1, endPos);
 }

 /// <summary>
 /// 清除线段
 /// </summary>
 /// <param name="clearAll">是否清除全部线段</param>
 private void ClearLine(bool clearAll)
 {
 if (lrList.Count == 0)
 {
 return;
 }

 for (int i = lrList.Count - 1; i >= 0; i--)
 {
 GameObject go = 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>
 private void ClearUnCompleteLine()
 {
 if (lrList.Count == 0)
 {
 return;
 }

 GameObject go = lrList[lrList.Count - 1];
 Destroy(go);
 lrList.Remove(go);
 }

 #endregion

 #region 工具方法

 /// <summary>
 /// 当前密码块是否存在于密码块列表中
 /// </summary>
 /// <param name="_passwordBlock">密码块</param>
 private bool IsExistInPasswordBlockList(GameObject _passwordButton)
 {
 if (passwordButtonList.Count == 0)
 {
 return false;
 }

 if (passwordButtonList.Contains(_passwordButton))
 {
 return true;
 }
 else
 {
 return false;
 }
 }

 /// <summary>
 /// 屏幕坐标转世界坐标
 /// </summary>
 /// <param name="screenPos">屏幕坐标位置</param>
 /// <param name="camera">相机</param>
 /// <returns>转换后的世界坐标</returns>
 private Vector3 ScreenToWorld(Vector3 screenPos, Camera camera = null)
 {
 if (camera == null)
 {
 camera = Camera.main;
 }
 Vector3 _screenPos = new Vector3(screenPos.x, screenPos.y, -camera.transform.position.z);
 Vector3 v = camera.ScreenToWorldPoint(_screenPos);
 return v;
 }

 #endregion
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity UGUI实现滑动翻页效果

    本文实例为大家分享了Unity UGUI实现滑动翻页效果的具体代码,供大家参考,具体内容如下 这个问题真的是老生常谈的事情了,不过在这里还是要说一下,以便以后之需 首先看一下效果图 最后在Content下面是一些Image using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; using UnityEngine.EventSystems; using

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

    本文实例为大家分享了Unity实现移动端手势解锁的具体代码,供大家参考,具体内容如下 一.效果演示 二.实现思路 --当鼠标选中一个密码按钮时开始记录输入的数字和鼠标的起始位置 --当鼠标按下过程中,始终根据记录的鼠标起始位置和当前鼠标的位置两个点绘制线段并添加到线段的列表中,并一直清空掉列表中除了最后一个线段外的其余线段 --当鼠标按下过程中,如果有覆盖到其他的密码按钮,则根据起始的密码按钮与当前的密码按钮两个点绘制线段并重新记录输入的数字和鼠标起始位置 三.实现过程 --创建9个密码块,并依

  • Android 5秒学会使用手势解锁功能

    Android手势解锁 本文讲述的是一个手势解锁的库,可以定制显示隐藏宫格点.路径.并且带有小九宫格显示图,和震动!让你学会使用这个简单,高效的库! 先来一波效果效果展示: 手势解锁效果 今天给大家介绍的是本人良心制作的一个手势解锁开源库,大家有什么建议和想法都可以发到我的邮箱: diosamolee2014@gmail.com 或者评论,我会为大家提供我力所能及的帮助! GitHub地址: https://github.com/Diosamo/Gesture_Lock 添加依赖: 添加的gra

  • iOS实现手势解锁操作

    本文主要介绍通过手势识别实现手势解锁功能,这个方法被广泛用于手机解锁,密码验证,快捷支付等功能实现.事例效果如下所示. 首先,我们先分析功能的实现过程,首先我们需要先看大致的实现过程: 1.加载九宫格页面 2.实现按钮被点击及滑动过程中按钮状态的改变 3.实现滑动过程中的连线 4.绘制完毕后判定密码是否正确, 5.密码判定后实现跳转. 下面我们就来用代码实现上述五个过程. 1.加载九宫格界面 1.1九宫格内控件的分布 3*3 ,我们可以自定义view(包含3*3个按钮),添加到viewContr

  • android自定义View实现手势解锁

    有时候为了程序的安全性,我们经常要采取一些安全措施,就像我们常用的支付宝那样,隔一定的时间再回到应用程序时会让用户利用手势去解锁应用程序,最近由于项目需求,也要求做这样一个功能,当用户切出本应用程序15分钟后回来,让用户手势解锁,整个需求的难点就在如何实现这个手势锁,开始一点头绪也没有,没有一点思路去实现这个手势解锁功能,在google了一番后看了一篇非常好的博客后,按照博主的思路的确是可以实现一个十分不错的手势锁View,也参考了下那位大神的代码,下面是我根据他的思路和代码片段实现的一个自定义

  • iOS实现手势滑动解锁功能简析

    题记 在平常的生活中,我们大概经常遇见手势滑动解锁---也就是九宫格啊,已经出现好久了,虽然随着Apple的指纹解锁的发展手势解锁虽然还有但是因为其不如指纹解锁方便也用的也少了,但是在大多数APP中这两种方式都是并存的,比如qq,微信,支付宝等等,最近项目里面也刚好有这个需求,趁着刚完成抽出时间来记录下来当时的一些思路,可能有的地方理解的不到位,还需多总结,闲言少叙了,看重点. 功能描述如图:大概说一下思路,这个功能用来做相当于密令,用于两端的匹配,教师端设置了路径生成密码,储存在本地,学生端用

  • 基于Flutter实现手势密码加密与解锁功能

    目录 前言 1.绘制静态图形 2.存储手势密码数据 3.添加手势交互 4.绘制.刷新密码线 5.加入密码错误动画 总结 前言 密码的由来:在公元前405年,由古希腊和斯巴达的战争中,由于斯巴达盟友波斯帝国背叛,导致古希腊和斯巴达两败俱伤,这时斯巴达抓了一个波斯国的信使,这个信使 没有任何情报,只有一条有着杂乱无章的希腊字母的普通腰带,最终斯巴达统帅破解了这条腰带,成功击败了希腊.这就是世界上最早的密码.同时也是世界上最早的解密. 密码在我们生活中无处不在,作为个人隐私的最后一道防线显得无比的重要

  • JS前端使用Canvas快速实现手势解锁特效

    目录 前言 Demo 需要实现的功能 初始化数据和页面渲染 touchstart 手指开始触摸事件 touchmove 监听手指滑动事件 touchend 监听手指触摸结束事件 页面滚动处理 连接的两颗星星之间有其他星星时 前言 之前在公司开发活动项目的时候,遇到一个项目需求要让用户使用手势画星位图来解锁星座运势,一看设计稿,这不就是我们平时的手机屏幕解锁吗?于是上网搜了一些关于手势解锁的文章,没找到可以直接复用的,于是只能自己打开canvas教程,边学习边设计实现了这个功能,同时兼容了移动端和

  • 微信小程序开发实战教程之手势解锁

    代码:https://github.com/jsongo/wx-gesture-lock 这个手势解锁的demo使用了https://github.com/lvming6816077/H5lock这个项目的算法和主逻辑,整合到微信小程序来,修改了很多地方的语法来适配小程序,去掉了window.document等函数,同时也添加了新的机制来解耦界面的操作和第三方库,这个下面会介绍到. 不过可惜的是,这个demo也只能在开发工具上玩玩,到真机上测试的时候,手指一滑动,页面会跟着滚动,手势没法使用.

  • 微信小程序开发教程-手势解锁实例

    手势解锁是app上常见的解锁方式,相比输入密码方式操作起来要方便许多.下面展示如何基于微信小程序实现手机解锁.最终实现效果如下图: 整个功能基于canvas实现,首先添加画布组件,并设定样式 <!--index.wxml--> <view class="container"> <canvas canvas-id="id-gesture-lock" class="gesture-lock" bindtouchstart

  • Unity调取移动端的麦克风进行录音并播放

    本文实例为大家分享了Unity调取移动端的麦克风进行录音并播放的具体代码,供大家参考,具体内容如下 1.对MicroPhone类的理解 对麦克风的调用在Unity里主要是用到了MicroPhone这个类,此类里面有几个方法可以方便我们实现功能 2.代码演示 #region 模块信息 // ********************************************************************** // Copyright (C) 2018 Blazors // P

随机推荐