본문 바로가기
가상세계 산사VR

가상세계 산사 VR, 선택버튼 알아내기

이번 스크립트는 지난 시간에 이은 Alert 팝업창의 선택 버튼 판정 버전입니다.
지난 시간에 Alert 와 같은 팝업창을 다루어 보았지만
버튼이 2개일 때 어떤 버튼을 선택했는지 알 수 없는 문제가 있었지요?

원래는 ModelDialog.Response 에 그 값이 들어오긴 하지만,
문제는 팝업창을 띄우고 난 다음 사용자가 버튼을 선택하기 전에
그 다음 행을 계속해서 쭉쭉 실행해 나가는 문제로 인하여
아래와 같은 코드는 제대로 실행이 안됩니다. 아예 2번째 팝업창은 뜨질 않더라구요.

// 유저의 클라이언트에 메시지를 띄워줍니다.
agent.Client.UI.ModalDialog.Show(message, "확인", "");
     :  사용자에게 팝업창을 띄우고 이 뒷부분으로 실행 계속
agent.Client.UI.ModalDialog.Show(dlg.Response + " 를 선택하셨군요,", "닫기", "");       

그렇다면 c# 언어 기본 MessageBox.Show 함수나
자바스크립트의 confirm 함수와 비슷한 기능으로 사용할 수 없는 걸까요? 물론 있지요 :)

산사에서는 WaitFor 라는 대기 함수가 있는데요.
WaitFor 일부 함수들과 함께 사용하는 함수입니다, 그래서 함께 사용하는 함수의 동작이 끝날때까지 대기해줍니다.
만일 다이얼로그 창이라면 사용자가 버튼 2개중 1개를 선택해야 WaitFor 함수 동작이 끝나고 그 다음을 진행합니다.

이를 테면 원래 다이얼로그 함수가 아래와 같았다면,

agent.Client.UI.ModalDialog.Show(message, "확인", "");

이와 똑같은 기능을 하는 WaitFor 함수는 아래와 같습니다.
첫번째 파라미터에 함수명이 입력된다는게 좀 색다르지요.

WaitFor(agent.Client.UI.ModalDialog.Show, message, "확인", "");

WaitFor 는 사용자가 버튼 하나를 선택해야 그 다음 코드가 계속해서 실행이 됩니다.

WaitFor(agent.Client.UI.ModalDialog.Show, message, "확인", "");
         : 사용자가 버튼을 선택하면 이 다음 코드 진행

그래서 그 다음 코드에서는 결국 선택한 버튼의 결과를 알 수 있다는 것이지요.

최종 결과 소스입니다.
이 번에는 답변 2개의 버튼까지도 속성으로 넣었는데요

using Sansar;
using Sansar.Script;
using Sansar.Simulation;
using System;

public class DialogSample : SceneObjectScript
{
    [DisplayName("제목")]
    [DefaultValue("알림")]
    public Interaction MyInteraction;

    [DisplayName("클릭메시지")]
    [DefaultValue("가상세계 산사VR의 얼럿 메시지입니다.")]
    public string message;

    [DisplayName("버튼1")]
    [DefaultValue("선택1")]
    public string btn1;

    [DisplayName("버튼2")]
    [DefaultValue("선택2")]
    public string btn2;

    public override void Init()
    {   
        // 인터렉션 정의 - 터치시 콜백 함수 지정
        MyInteraction.Subscribe((InteractionData data) =>
        {
            // 사용자의 유저객체 정보를 받아
            var agent = ScenePrivate.FindAgent(data.AgentId);

            // 해당 유저가 존재하면
            if (agent != null)
            {
                // 문장이 너무 길어서 dlg 변수에 받아서 사용
                ModalDialog dlg = agent.Client.UI.ModalDialog;
                // 팝업창을 보여주고 버튼 선택
                WaitFor(dlg.Show, message, btn1, btn2);
                // 선택 결과룰 다시 팝업창으로 보여줍니다.
                dlg.Show(dlg.Response + " 를 선택하셨군요,", "닫기", "");
            }
        });
    }

}

위 소스를 산사에 업로드, 오브젝트에 적용하면, 
오브젝트에는 아래와 같은 4가지 속성을 입력할 수 있는데요.

위의 2개는 지난 시간과 똑같이 마우스를 대었을때 제목과 팝업창이 뜨는 문구입니다.
그 다음 2개를 각각의 버튼에 들어가는 내용을 직접 입력하실 수 있구요.

월드를 빌드하고 오브젝트를 터치하면 아래와 같이 팝업창 및 선택버튼이 뜨는건 지난번과 동일하나 

버튼을 선택하면 선택한 버튼의 글자를 확인하실 수 있습니다.

다이얼로그창의 Response 속성에 선택한 버튼의 텍스트 내용이 들어 있기 때문이지요.

dlg.Response
dlg.Show(dlg.Response + " 를 선택하셨군요,", "닫기", "");

단순한 예제 소스이지만,
이 기능은 대부분의 예/아니오, 확인/취소 등의 선택을 요구하는 기능으로 사용할 수 있어
자주 사용될 것으로 예상됩니다.

필요하신 분께 유익한 내용 되셨는지요 :)
오늘도 방문해주시고 여기까지 읽어주신 것 감사합니다.