日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Unity3D使用GL實現(xiàn)圖案解鎖功能-創(chuàng)新互聯(lián)

聊天是時候看到有人問如何在Unity3D的UGUI中實現(xiàn)圖案解鎖的功能,然后便試了一下。剛開始想用LineRender來實現(xiàn),但又一想是要在UGUI中,然后就用了另外一種方法,即使用GL類來實現(xiàn)。

創(chuàng)新互聯(lián)公司是工信部頒發(fā)資質(zhì)IDC服務器商,為用戶提供優(yōu)質(zhì)的服務器托管服務

GL相關(guān)介紹及官方文檔

實現(xiàn)后在Android手機上跑的效果如下:

Unity3D使用GL實現(xiàn)圖案解鎖功能

主要實現(xiàn)GraphicUnLockManager類。代碼如下:

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

public class GraphicUnLockManager : MonoBehaviour
{
 [Tooltip("含有Selectable及Image組件的UI對象,作為連接點。")]
 public List _lstPoints = new List();
 [Tooltip("用于設置所畫線的顏色。(可使用“unlit/Color”Shader)")]
 public Material _matLineColor;
 [Tooltip("用于設置所畫線的高度。")]
 public int _nHalfHeight = 15;
 [Tooltip("用于設置選擇時Image的顏色。")]
 public Color _clrSelect = Color.red;
 [Tooltip("用于設置未選擇時Image的顏色。")]
 public Color _clrUnSelect = Color.white;

 [HideInInspector]
 public List _lstSelectPoints = new List();//已選擇連接點
 [HideInInspector]
 public List _lstPassword = new List();//以輸入密碼
 [HideInInspector]
 public Action onInputState;//true為開始輸入,false為結(jié)束輸入

 private bool _isPressing = false;//是否按下
 private Vector2 _vtPressPos;//按下點坐標

 private float _fDistance;//距離
 private float _fDegree;//夾角
 private Matrix4x4 _matrixTrans;//變換矩陣
 private Vector2[] _vertexPos = new Vector2[4];//頂點數(shù)組

 private Vector2 _tempPos;

 void Awake()
 {
  InitEnterEvent();//初始化所有連接點的消息
  ClearLines();//清空相關(guān)數(shù)據(jù)
 }

 void Update()
 {
  if (!IsPressed())
  {//當未按下時清空是數(shù)據(jù)
   ClearLines();
  }
 }

 bool IsPressed()
 {
  //觸摸
  if (Input.touchCount > 0)
  {
   switch (Input.touches[0].phase)
   {
    case TouchPhase.Began:
     _isPressing = true;
     if (onInputState != null)
     {
      onInputState(true);//狀態(tài)改變
     }
     break;
    case TouchPhase.Ended:
    case TouchPhase.Canceled:
     _isPressing = false;
     if (onInputState != null)
     {
      onInputState(false);//狀態(tài)改變
     }
     break;
   }

   _vtPressPos = Input.touches[0].position;
  }
  else
  {
   //鼠標
   if (Input.GetMouseButtonDown(0))
   {
    _isPressing = true;
    if (onInputState != null)
    {
     onInputState(true);//狀態(tài)改變
    }
   }
   if (Input.GetMouseButtonUp(0))
   {
    _isPressing = false;
    if (onInputState != null)
    {
     onInputState(false);//狀態(tài)改變
    }
   }

   _vtPressPos = Input.mousePosition;
  }

  return _isPressing;
 }

 void OnPostRender()
 {
  DrawLines();//畫所有線
 }

 void OnGUI()
 {
  string msg = "";

  msg += "是否正在輸入:" + IsPressed() + "\n";
  msg += "密碼:";
  for (int i = 0; i < _lstPassword.Count; i++)
  {
   msg += _lstPassword[i] + ",";
  }

  GUIStyle guiStyle = new GUIStyle();
  guiStyle.normal.textColor = new Color(1, 1, 1); //設置字體顏色
  guiStyle.fontSize = 75;  //設置字體大小
  GUILayout.Label(msg, guiStyle);
 }

 void InitEnterEvent()
 {
  //為每個點添加Enter事件
  _lstPoints.ForEach((rtTrans) =>
  {
   EventTrigger trigger = rtTrans.GetComponent();
   if (trigger == null)
   {
    trigger = rtTrans.gameObject.AddComponent();
   }

   //添加事件
   EventTrigger.Entry entryEnter = new EventTrigger.Entry();
   entryEnter.eventID = EventTriggerType.PointerEnter;//進入事件
   EventTrigger.TriggerEvent evtEnter = new EventTrigger.TriggerEvent();
   evtEnter.AddListener(OnSelectPoint);
   entryEnter.callback = evtEnter;
   trigger.triggers.Add(entryEnter);

   EventTrigger.Entry entryDown= new EventTrigger.Entry();
   entryDown.eventID = EventTriggerType.PointerDown;//按下事件
   EventTrigger.TriggerEvent evtDown = new EventTrigger.TriggerEvent();
   evtDown.AddListener(OnSelectPoint);
   entryDown.callback = evtDown;
   trigger.triggers.Add(entryDown);
  });
 }

 public void OnSelectPoint(BaseEventData obj)
 {
  //轉(zhuǎn)換數(shù)據(jù)類型
  PointerEventData data = obj as PointerEventData;

  GameObject target = null;
  if (null != data.pointerEnter)
  {
   target = data.pointerEnter;
  }
  else if (null != data.pointerPress)
  {
   target = data.pointerPress;
  } 

  AddSelectPoint(target);//添加選擇連接點
 }

 void AddSelectPoint(GameObject obj)
 {
  if (IsPressed() && null != obj)
  {
   //將未連接的點添加到需要連接的點的列表中去
   RectTransform rtTrans = obj.GetComponent();
   if (null != rtTrans && !_lstSelectPoints.Contains(rtTrans))
   {
    //添加到繪制列表
    _lstSelectPoints.Add(rtTrans);
    //添加密碼序列
    _lstPassword.Add(_lstPoints.IndexOf(rtTrans));
    //改變顏色
    rtTrans.GetComponent().color = _clrSelect;
   }
  }
 }

 void ClearLines()
 {
  //清空選擇及密碼列表
  _lstSelectPoints.Clear();
  _lstPassword.Clear();

  //還原顏色
  _lstPoints.ForEach((rtTrans) =>
  {
   rtTrans.GetComponent().color = _clrUnSelect;
  });
 }

 void DrawLine(Vector2 vtStart, Vector2 vtEnd)
 {
  _tempPos = vtEnd - vtStart;
  _fDistance = Vector3.Distance(Vector3.zero, _tempPos);//距離
  _fDegree = Vector3.Angle(_tempPos, Vector3.right);//與x軸正方向的夾角

  //判斷旋轉(zhuǎn)方向,逆時針為正,順時針為付
  if (_tempPos.y < 0)
  {
   _fDegree *= -1;
  }

  //設置變換矩陣
  _matrixTrans.SetTRS(vtStart, Quaternion.Euler(0, 0, _fDegree), Vector3.one);//設置變換矩陣


  //設置繪制頂點坐標
  _vertexPos[0].x = 0;
  _vertexPos[0].y = -_nHalfHeight;
  _vertexPos[1].x = 0;
  _vertexPos[1].y = _nHalfHeight;
  _vertexPos[2].x = _fDistance;
  _vertexPos[2].y = _nHalfHeight;
  _vertexPos[3].x = _fDistance;
  _vertexPos[3].y = -_nHalfHeight;

  //繪制
  GL.PushMatrix();
  GL.LoadPixelMatrix();//使(0,0,0)為左下角,(Screen.width,Screen.height,0)為右上角
  GL.MultMatrix(_matrixTrans);
  GL.Begin(GL.QUADS);//繪制四邊形
  for (int n = 0; n < 4; n++)
  {
   GL.Vertex(_vertexPos[n]);
  }
  GL.End();
  GL.PopMatrix();
 }

 void DrawLines()
 {
  //設置線的材質(zhì)
  _matLineColor.SetPass(0);

  //連接已選擇的點
  for (int nIndex = 0; nIndex < _lstSelectPoints.Count - 1; nIndex++)
  {
   DrawLine(_lstSelectPoints[nIndex].position, _lstSelectPoints[nIndex + 1].position);
  }

  //連接到Press點
  if (IsPressed() && _lstSelectPoints.Count > 0)
  {
   DrawLine(_vtPressPos, _lstSelectPoints[_lstSelectPoints.Count - 1].position);
  }
 }
}

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


文章題目:Unity3D使用GL實現(xiàn)圖案解鎖功能-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://www.dlmjj.cn/article/gehcj.html