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

산사VR, 텍스트 보드(영문형) 제작 및 판매!

영어, 숫자 및 아스키코드 문자를 출력할 수 있는 텍스트 오브젝트를 제작하였습니다.
아스키 코드니 당연 한글은 지원이 안되니 아쉽지만요 :)

어떤건지 궁금하시면 아래와 같이 한장의 그림으로 설명이 가능한데요.
이런 글자를 산사에 이미지 작업 없이 띄우는 겁니다.

부가적으로 4초간격으로 글자가 자동으로 바뀌는 등의 기능도 지원됩니다.
관련 영상 한번 보실까요? 메뉴판은 별개입니다 ㅎ..

산사 월드에서 글자 오브젝트를 놓고 이렇게 속성을 조정하면 되는데요.

strArr 은 지정한 시간 간격으로 계속해서 바뀌는 문장 목록을 의미하며 16글자로 제한됩니다.
DelayTime 은 글자가 바뀌는 시간 간격을 의미합니다.

16개의 멀티 메터리얼을 사용하였고 스크립트보다는 오브젝트 제작에 꽤 시간이 많이 할애된 기능인데요.
산사 스토어에서 산사달러 단위 $10 ( 미화로 약 10센트, 한화로 100원 가량 ) 에 판매를 시작했습니다.
산사 사용자가 별로 없어 외화벌이가 될지 안될지는 모르겠네요 :)

만약 나중에 한화로 환전한다 하더라도 적법한 과정을 거치려고 합니다 ㅎ.. ( 팔리려나... )

몇강이나 될지 모를 분량이라 자세히 파고 들어가지는 않고요,
혹시나 스크립트 학습하실 분들이 계실지 몰라서 소스만 공개합니다.

using System;
using Sansar;
using Sansar.Script;
using Sansar.Simulation;
using System.Collections.Generic;
using System.Linq;

public class RotateTextBoardScript : SceneObjectScript
{   
    public List<string> strArr;
    public double DelayTime = 4.0;
    private int Step=0;

    public override void Init()
    {
        if (strArr.Count == 0)        
        {
            Log.Write(LogLevel.Error, "strArr 속성이 하나 이상 존재해야 합니다.");
            return;
        }
        StartCoroutine(RotateTextBoard);
    }

    // ChatMessage 콜백 함수
    private void RotateTextBoard()
    {
        while (true)
        {
            display_textboard(strArr[Step]);
            Step++;
            if (Step >= strArr.Count) Step = 0;
            Wait(DelayTime);
            if (strArr.Count == 1) break; //  반복하지 않는다면 코루틴 종료
        }
    }

    private void display_textboard(string Message)
    {
        string str = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
        MeshComponent mesh = (MeshComponent)ObjectPrivate.GetComponent(ComponentType.MeshComponent, 0);
        IEnumerable<Sansar.Simulation.RenderMaterial> mats = mesh.GetRenderMaterials();
        try
        {
            int st = 0;
            int ed = 16;
            int sprite;
            char c;
            for (int i = st; i < ed; ++i)
            {

                if (i >= Message.Length) sprite = 0;
                else
                {
                    c = Message[i];
                    sprite = str.IndexOf(c);
                    if (sprite == -1) sprite = 0;
                }
                Sansar.Simulation.RenderMaterial mat = mats.ElementAt(i - st);
                MaterialProperties p = mat.GetProperties();
                p.FlipbookFrame = sprite;
                mat.SetProperties(p);

            }
        }
        catch (Exception Ex)
        {
            ScenePrivate.Chat.MessageAllUsers("Error: " + Ex.Message);
        }
    }

}

뭐 당연히 NPC위에 이런 대사 같은 것도 가능하겠지요? '밥줘-! 멍!'

오늘도 하나의 구경거리가(?) 되었나 모르겠습니다.
미래의 가상현실 기술이 산사가 아니더라도 이런 류의 기술이 사용될 것을 생각하며.
오늘도 방문해주셔서 감사합니다. :)