DRF는 XML 형태의 문서로 되어 있음.
다양한 기능을 지원하는 특수한 포멧이기 때문에
<이미지>
위와 같은 구조로 되어 있음.
STEP1. 기존 서식파일 가져오기
WebGl을 통하여 서비스 할 경우, 로컬에서 읽어들이는것이 아닌 웹에서 로드하는 방법으로 가져와야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
{
// Request and wait for the desired page.
yield return webRequest.SendWebRequest();
string[] pages = uri.Split('/');
int page = pages.Length - 1;
if (webRequest.isNetworkError)
{
Debug.Log(pages[page] + ": Error: " + webRequest.error);
}
else
{
_xmlstring = webRequest.downloadHandler.text;
ReadXML(_xmlstring);
}
}
| cs |
STEP2. XML 읽기
Xml을 읽는 방법은 여러가지가 있습니다. 아래와 같이 단순히 읽으면 됩니다.
1
|
XmlReader xmlReader = XmlReader.Create(new StringReader(text));
| cs |
하지만 문제점은 읽어서 활용하는 법입니다.
저렇게 읽어서 노드, 속성 가져와서 매칭하는 작업은 언제 끝날지 알수 없습니다.
문서가 복잡하면 복잡할수록 어려워지죠.
그래서 한방에 Deserialize 해야, 해당 클래스나 구조체를 통해서
paper.Size
paper.Width
같이 접근하기가 편리해집니다.
그러므로 구글에서 아래처럼 검색하면 나오는 사이트에서 XML을 C#코드로 변환시킵니다.
그 후에 아래와 같이 Desirialize 를 하면 ReportTemplate 클래스를 통하여 손쉽게 속성에 접근 가능합니다.
그 후에 아래와 같이 Desirialize 를 하면 ReportTemplate 클래스를 통하여 손쉽게 속성에 접근 가능합니다.
1
2
3
|
XmlSerializer xmlSerializer = new XmlSerializer(typeof(ReportTemplate));
ReportTemplate report = (ReportTemplate)xmlSerializer.Deserialize(xmlReader);
| cs |
STEP3. 읽어들인 ReportTemplate을 이용하여 Unity UI를 배치
- 자.. 중요한거니까 빨간색으로
저런 형변환 Webgl에서 지원안함. 수동으로 XML 까서 하나씩 넣어야함.. 에디터 모드에선 잘 실행됩니다..
STEP4. WebGL로 빌드하기 위한 설정
STEP5. 인쇄
Unity로 WebViewer를 만들어 인쇄하기 위해서는 2가지 방법이 있다고 생각된다.
Case 1. 동적으로 페이지만큼 유니티 화면을 늘려서 전부 한 화면에 표시한 다음에 브라우저 인쇄호출
Case 2. 화면에 보여주는건 한 페이지만 보여주고, 인쇄버튼 클릭시 화면에 안보이는 카메라가 렌더링 시키면 이미지 저장 후 웹에서 브라우저를 통한 이미지 인쇄호출
Unity로 WebViewer를 만들어 인쇄하기 위해서는 2가지 방법이 있다고 생각된다.
Case 1. 동적으로 페이지만큼 유니티 화면을 늘려서 전부 한 화면에 표시한 다음에 브라우저 인쇄호출
Case 2. 화면에 보여주는건 한 페이지만 보여주고, 인쇄버튼 클릭시 화면에 안보이는 카메라가 렌더링 시키면 이미지 저장 후 웹에서 브라우저를 통한 이미지 인쇄호출
첫번째 케이스를 통해서 인쇄하면 별다른 옵션 및 버튼 없이 인쇄가 가능하다는 장점이 있지만.
복잡한 용지의 경우에 렌더링되는 컨트롤이 많아져서 메모리 점유율도 높아지고, 버벅이는 단점이 있다.
대량의 페이지를 인쇄하게 되는 케이스라면 사용하기 애매한 방법이다. 또한 유니티로 보여지는 화면이 그대로 인쇄되기 때문에 UI를 화면내에 넣을수도 없고, WebGL로 출력된 파일의 화면 사이즈도 용지가 생성된 크기에 맞쳐서 딱맞게 늘려줘야 한다.
두번째 케이스는 브라우저의 인쇄 기능을 사용하면 현재 보이는 화면만 인쇄가 가능하기 때문에 이미지 변환이나 렌더링카메라 설정 추가 등을 해야하지만. 한번에 한화면만 그리기 때문에 아무리 복잡해도 성능상 문제가 없다. 또한 UI를 화면내에 넣더라도, 실제로 출력되는건 전용 렌더링 카메라의 내용이기 때문에 문제가 없다.
그래서 두번째 케이스를 이용하기로 한다.
위에서부터 순서대로
메인카메라
캔버스 - UI
양식캔버스(World Space) - 실제 양식을 보여주기 위한 캔버스
페이퍼
실제양식디자인
렌더카메라 - 현재 양식을 표시하기 위한 카메라
렌더카메라를 전역으로 하나만 두고 Paper가 생성될때마다 위치 및 크기조절을 해도 상관없지만 각 Peper에 맞는 카메라를 전용으로 두는것이 개발하기 편리할것 같아서 저런 구조로 설정했다.
동일한 양식(예를들어 테이블의 내용이 길어질경우) 에따라 페이퍼는 여러개가 생성될꺼고, 그 페이퍼를 렌더링이 끝나게 되면 캡쳐를 하게 되는 형식이다. 그 캡쳐된 데이터를 이미지로 서버에 저장하던가, 데이터째 전달하던가 하게 된다.
양식을 캡쳐하려면 카메라가 용지의 영역을 꽉차게 바라봐야 하는데.
렌더링카메라의 Projection 속성을 Orthographic를 사용하고, Size를 용지 가로 세로중 긴부분의 길의 반으로 설정한다. 그러면 한쪽 방향으로 꽉찬 화면이 카메라에 렌더링된다.
그후 아래와 같은 코드로 캡쳐를 하게 되면 인쇄에 필요한 이미지 파일을 얻게 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
RenderTexture rt = new RenderTexture(paperWidth, paperHeight, 24);
camera.targetTexture = rt;
Texture2D screenShot = new Texture2D(paperWidth, paperHeight, TextureFormat.RGB24, false);
camera.Render();
RenderTexture.active = rt;
screenShot.ReadPixels(new Rect(0, 0, paperWidth, paperHeight), 0, 0);
camera.targetTexture = null;
RenderTexture.active = null; // JC: added to avoid errors
Destroy(rt);
byte[] bytes = screenShot.EncodeToPNG();
string filename = ScreenShotName(paperWidth, paperHeight);
System.IO.File.WriteAllBytes(filename, bytes);
Debug.Log(string.Format("Took screenshot to: {0}", filename));
| cs |
ps.. 취소될가능성이 있어서 지금까지 했던 작업 그냥 올려놓음...


댓글 없음:
댓글 쓰기