Unity 이동 단 제스처 잠 금 해제 기능 실현

본 논문 의 사례 는 유 니 티 가 모 바 일 제스처 로 잠 금 을 풀 수 있 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
효과 시범

2.사고 방향 실현
―암호 단 추 를 선택 하면 입력 한 숫자 와 마우스 의 시작 위 치 를 기록 합 니 다.
-마 우 스 를 누 르 는 과정 에서 기 록 된 마우스 의 시작 위치 와 현재 마우스 의 위치 두 점 에 따라 선분 을 그리고 선분 의 목록 에 추가 하 며 목록 에서 마지막 선분 을 제외 한 나머지 선분 을 삭제 합 니 다.
마우스 가 누 르 는 과정 에서 다른 암호 로 덮어 쓰 는 단추 가 있 으 면 시작 암호 단추 와 현재 암호 단추 두 점 에 따라 선분 을 그리고 입력 한 숫자 와 마우스 의 시작 위 치 를 다시 기록 합 니 다.
3.실현 과정
―9 개의 암호 블록 을 만 들 고 1,2......................................................................

―LineRenderer 를 만 드 는 방법,LineRenderer 속성 을 초기 화 하 는 방법,선 을 그 리 는 방법,선 을 비 우 는 방법
선분 을 그 릴 때 시작 위치 와 끝 위치의 z 축 을 0 으로 설정 해 야 합 니 다.

암 호 를 기록 하고 삭제 하 는 방법

4.전체 코드(제스처 잠 금 해제 인터페이스의 물체 에 마 운 트)

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
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기