Unity 이동 단 제스처 잠 금 해제 기능 실현
7845 단어 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
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
android 사용자 정의 View 제스처 잠 금 해제가끔 은 프로그램의 안전성 을 위해 저 희 는 항상 안전 조 치 를 취해 야 합 니 다.저희 가 자주 사용 하 는 알 리 페 이 처럼 일정한 시간 간격 으로 응용 프로그램 으로 돌아 갈 때 사용자 로 하여 금 제스처...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.