Unity5.4로 모달 대화상자 되돌리기

편집중은 UnityEditor 의 기능에 있는 것 같습니다만, 실행중에는 표준에서는 기능이 없는 것 같습니다.
동작 확인은 Unity 에디터상과 Standalone(windows x86, x86_64)판에서 실시했습니다.
충분한 검증은 하고 있지 않으므로, 자기 책임으로 이용해 주십시오.
조언 등이 있으면 코멘트 잘 부탁드립니다.
샘플 코드는 화면 오른쪽 상단의 휴지통 Sprite를 클릭했을 때 모든 항목을 삭제할 수 있는지 묻는 프로그램의 발췌입니다.
모달이 아닌 모덜리스 대화 상자 만들기
아래 참조 사이트의 1에 소개되어 있는 것처럼, 우선은 다이얼로그용의 Canvas 를 만듭니다.
이미 uGUI를 사용하고 있다면 Canvas가 있다고 생각합니다.
그것과는 별도로 다이얼로그 전용의 Canvas 를 만듭니다.
Canvas의 자식에 대화 상자로 표시할 파트를 추가합니다.
예를 들어, 메시지용 텍스트나 선택용 Button을 배치합니다.

창 테두리를 원하면 메시지나 버튼이 있는 위치에만 Image 를 배치하면 손쉽게 그렇게 됩니다.

그런 다음 대화 상자를 사용하는 스크립트를 작성합니다.
이번에는 휴지통 그림의 Sprite에 다음 스크립트를 구성 요소로 추가했습니다.
스크립트에서 Canvas의 효과를 조작합니다.
샘플의 Canvas 변수 이름은 canvasConfirmAllHoshiDelete입니다. (긴...)
using UnityEngine;
using System.Collections;
public class TrashBox : MonoBehaviour {
// エディタのインスペクタで、この変数にヒエラルキーにある Canvas を割り当ててください。
public Canvas canvasConfirmAllHoshiDelete = null;
// Use this for initialization
void Start() {
// ダイアログを表示するときまで、 Canvas を無効にしておく。
if (canvasConfirmAllHoshiDelete != null)
{
canvasConfirmAllHoshiDelete.enabled = false;
}
}
// クリックされた
void OnMouseUpAsButton()
{
confirmAllHoshiDelete();
}
// ダイアログを表示
public void confirmAllHoshiDelete()
{
// Canvas を有効にする
if (canvasConfirmAllHoshiDelete != null)
{
canvasConfirmAllHoshiDelete.enabled = true;
}
}
// Yes ボタンと関連づけたイベントハンドラ関数
public void onButtonYes()
{
// Canvas を無効にする。(ダイアログを閉じる)
canvasConfirmAllHoshiDelete.enabled = false;
// アイテムの削除処理(省略)
}
// No ボタンと関連づけたイベントハンドラ関数
public void onButtonNo()
{
// Canvas を無効にする。(ダイアログを閉じる)
canvasConfirmAllHoshiDelete.enabled = false;
}
}
그리고는, 이 컴퍼넌트에 인스펙터상에서 히에랄키의 다이얼로그용의 Canvas 를 할당합니다.

모달 대화 상자로 만들기
uGUI 객체는 패널을 전면에 두는 것으로 무효로 한다.
방금 만든 Canvas에 Panel을 추가합니다. 범위는 화면과 동일합니다.

Panel 가 쓰여진 장소의 그것보다 안쪽의 Button 등의 uGUI 의 조작이 무효가 됩니다.
Panel의 투명도와 색상은 Color 속성에서 변경할 수 있습니다.
편집하는 동안 Panel이 방해가되는 경우

편집중, 뒤측의 오브젝트를 건드리지 않고 방해인 경우는, 다이얼로그용의 Canvas 의 인스펙터상의 좌상의 체크 박스를 일시적으로 오프로 하는 것이 좋았습니다.
단, 실행 전에는 체크를 되돌려 둡니다.
마우스 이벤트 비활성화
이것만으로는, OnMouseDown 등의 마우스 이벤트를 구현한 GameObject 는 반응해 버립니다.
그래서 반응을 원하지 않는 마우스 이벤트의 시작 부분에 다음 코드를 추가합니다.
if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())
{
return;
}
이 코드에 의해 uGUI 의 객체가 이 객체 위에 있었을 경우는 return 합니다.
얼마 안되는 Panel도 uGUI이므로, 그 범위내의 모든 오브젝트의 마우스 이벤트를 캔슬할 수 있습니다.
참고 사이트
using UnityEngine;
using System.Collections;
public class TrashBox : MonoBehaviour {
// エディタのインスペクタで、この変数にヒエラルキーにある Canvas を割り当ててください。
public Canvas canvasConfirmAllHoshiDelete = null;
// Use this for initialization
void Start() {
// ダイアログを表示するときまで、 Canvas を無効にしておく。
if (canvasConfirmAllHoshiDelete != null)
{
canvasConfirmAllHoshiDelete.enabled = false;
}
}
// クリックされた
void OnMouseUpAsButton()
{
confirmAllHoshiDelete();
}
// ダイアログを表示
public void confirmAllHoshiDelete()
{
// Canvas を有効にする
if (canvasConfirmAllHoshiDelete != null)
{
canvasConfirmAllHoshiDelete.enabled = true;
}
}
// Yes ボタンと関連づけたイベントハンドラ関数
public void onButtonYes()
{
// Canvas を無効にする。(ダイアログを閉じる)
canvasConfirmAllHoshiDelete.enabled = false;
// アイテムの削除処理(省略)
}
// No ボタンと関連づけたイベントハンドラ関数
public void onButtonNo()
{
// Canvas を無効にする。(ダイアログを閉じる)
canvasConfirmAllHoshiDelete.enabled = false;
}
}
uGUI 객체는 패널을 전면에 두는 것으로 무효로 한다.
방금 만든 Canvas에 Panel을 추가합니다. 범위는 화면과 동일합니다.

Panel 가 쓰여진 장소의 그것보다 안쪽의 Button 등의 uGUI 의 조작이 무효가 됩니다.
Panel의 투명도와 색상은 Color 속성에서 변경할 수 있습니다.
편집하는 동안 Panel이 방해가되는 경우

편집중, 뒤측의 오브젝트를 건드리지 않고 방해인 경우는, 다이얼로그용의 Canvas 의 인스펙터상의 좌상의 체크 박스를 일시적으로 오프로 하는 것이 좋았습니다.
단, 실행 전에는 체크를 되돌려 둡니다.
마우스 이벤트 비활성화
이것만으로는, OnMouseDown 등의 마우스 이벤트를 구현한 GameObject 는 반응해 버립니다.
그래서 반응을 원하지 않는 마우스 이벤트의 시작 부분에 다음 코드를 추가합니다.
if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())
{
return;
}
이 코드에 의해 uGUI 의 객체가 이 객체 위에 있었을 경우는 return 합니다.
얼마 안되는 Panel도 uGUI이므로, 그 범위내의 모든 오브젝트의 마우스 이벤트를 캔슬할 수 있습니다.
참고 사이트
Reference
이 문제에 관하여(Unity5.4로 모달 대화상자 되돌리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sakura-crowd/items/626a88808c1d3717fb73텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)