유 니 티 사용자 정의 팝 업 상자 기능
1.팝 업 프레임 의 구축
그림 과 같은 레이아웃:Message 는 전체 부모 물체 이 고 UiMessage 코드 를 추가 합 니 다.패 널 커버.
Message Box 는 전체 알림 상자,Panel 은 제목,ok 은 확인 단추,cancel 은 취소 단추,retry 는 재 시도 단추,Text 는 알림 상자 의 텍스트 입 니 다.
대소 문자 에 주의 하 세 요.뒤의 코드 는 이름 에 따라 해당 하 는 구성 을 가 져 옵 니 다.
효 과 는 다음 과 같 습 니 다:
2.Message Box 코드
설명 할 것 은 모두 코드 에 주석 을 달 았 다.윈도 의 알림 상자 기능 을 본 떠 서 기능 이 부족 하면 스스로 추가 할 수 있 습 니 다.예 를 들 어 닫 기 단추,아이콘 표시 등.
using System;
public enum DialogResult
{
Ok,
OKCancel,
RetryCancel,
YesNo,
YesNoCancel
}
public static class MessageBox
{
/// <summary>
/// true
/// </summary>
public static bool type;
// ,
public static Action clickOk;
public static Action clickRetry;
public static Action clickCancel;
public static DialogResult dialogResult;
//
public static string headText;
//
public static string text;
// 。
public static bool state;
/// <summary>
///
/// </summary>
public static void onClickRetry()
{
state = false;
clickRetry?.Invoke();
clickRetry = null;
}
/// <summary>
///
/// </summary>
public static void onClickCancel()
{
state = false;
clickCancel?.Invoke();
clickCancel = null;
}
/// <summary>
///
/// </summary>
public static void onClickOk()
{
state = false;
clickOk?.Invoke();
clickOk = null;
}
/// <summary>
///
/// </summary>
/// <param name="_text"> </param>
/// <param name="_head"> </param>
/// <param name="dialog"> </param>
/// <param name="type"> </param>
public static void Show(string _text,string _head,DialogResult _dialog, bool _type = true)
{
text = _text;
headText = _head;
dialogResult = _dialog;
type = _type;
state = true;
}
public static void Show(string _text,string _head,bool _type = true)
{
text = _text;
headText = _head;
dialogResult = DialogResult.Ok;
type = _type;
state = true;
}
public static void Show(string _text, bool _type = true)
{
text = _text;
headText = " ";
dialogResult = DialogResult.Ok;
type = _type;
state = true;
}
}
3.UiMessage 코드Message 물체 에 추가 합 니 다.팝 업 상자 의 디 스 플레이 를 제어 하 는 데 사 용 됩 니 다.
using UnityEngine;
using UnityEngine.UI;
public class UiMessage : MonoBehaviour
{
public Button ok;
public Button cancel;
public Button retry;
/// <summary>
///
/// </summary>
public GameObject panel;
public Text headText;
public Text text;
/// <summary>
///
/// </summary>
private GameObject messageBox;
private void Awake()
{
messageBox = gameObject.transform.GetChild(1).gameObject;
ok = messageBox.transform.Find("ok").GetComponent<Button>();
cancel = messageBox.transform.Find("cancel").GetComponent<Button>();
retry = messageBox.transform.Find("retry").GetComponent<Button>();
panel = gameObject.transform.Find("panel").gameObject;
text = messageBox.transform.Find("Text").GetComponent<Text>();
headText = messageBox.transform.GetChild(0).Find("head").GetComponent<Text>();
//
messageBox.transform.position = new Vector3(Screen.width / 2 - messageBox.GetComponent<RectTransform>().rect.width / 2,
Screen.height / 2 + messageBox.GetComponent<RectTransform>().rect.height / 2, 0);
init();
}
private void OnEnable()
{
init();
}
private void init()
{
ok.onClick.AddListener(MessageBox.onClickOk);
cancel.onClick.AddListener(MessageBox.onClickCancel);
retry.onClick.AddListener(MessageBox.onClickRetry);
text.text = MessageBox.text;
headText.text = MessageBox.headText;
// ,
switch (MessageBox.dialogResult)
{
case DialogResult.Ok:
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(false);
retry.gameObject.SetActive(false);
break;
case DialogResult.OKCancel:
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(true);
retry.gameObject.SetActive(false);
break;
case DialogResult.RetryCancel:
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(true);
retry.gameObject.SetActive(true);
break;
case DialogResult.YesNo:
ok.transform.GetChild(0).GetComponent<Text>().text = " ";
cancel.transform.GetChild(0).GetComponent<Text>().text = " ";
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(true);
retry.gameObject.SetActive(false);
break;
case DialogResult.YesNoCancel:
ok.transform.GetChild(0).GetComponent<Text>().text = " ";
cancel.transform.GetChild(0).GetComponent<Text>().text = " ";
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(true);
retry.gameObject.SetActive(true);
break;
}
}
private void Update()
{
panel.SetActive(MessageBox.type);
gameObject.SetActive(MessageBox.state);
}
}
4.디 스 플레이 상자 의 호출이 호출 은 이벤트 에 호출 을 등록 하면 단 추 를 스스로 설정 할 수 있 습 니 다.
필 자 는 프로젝트 중의 방식 으로 시범 을 보 였 다.구체 적 으로 는 설명 을 하지 않 는 다.호출 방식 이 이미 제시 되 었 습 니 다.
특히 주의:UiMessage 에서 Message Box 방법 을 호출 했 기 때문에 Message Box 데 이 터 를 초기 화해 야 합 니 다.사용 하 는 것 을 초기 화 합 니 다.필 자 는 ok,cancel 단 추 를 사 용 했 습 니 다.마지막 으로 팝 업 상 자 를 표시 합 니 다.
운행 결과
6.팝 업 상자 드래그 이동 가능
Message Box 물체 에 Drag Manage 를 추가 합 니 다.(ui 물 체 를 끌 어 당 기 려 면 Drag Manage 를 추가 하면 됩 니 다)
필 자 는 시연 을 하지 않 겠 습 니 다.
using UnityEngine;
using UnityEngine.EventSystems;
/// <summary>
///
/// </summary>
public class DragManage : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
{
private Vector3 offect;
public void OnBeginDrag(PointerEventData eventData)
{
offect = Input.mousePosition - transform.position;
}
public void OnDrag(PointerEventData eventData)
{
transform.position = Input.mousePosition - offect;
}
public void OnEndDrag(PointerEventData eventData)
{
transform.position = Input.mousePosition - offect;
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Unity 최적화1. 프레임마다 처리하는 것을 최대한 피한다. 예를 들면: 5프레임당 한 번 처리로 변경할 수 있습니다. 2. 정시 반복 처리는 InvokeRepeating 함수로 이루어집니다. 예를 들어 0.5초 동안 시작한 후 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.