제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다.
               ContractName 
Microsoft.VisualStudio.Text.ITextDocumentFactoryService 
               RequiredTypeIdentity

Microsoft.VisualStudio.Text.ITextDocumentFactoryService


위와같은 오류가 난다면, 비주얼 스튜디오를 종료 후..

C:\Users\컴퓨터이름\AppData\Local\Microsoft\VisualStudio

경로로 이동하여, 자기가 사용중인 비주얼 스튜디오 버전에 맞는 폴더로 이동 후,

ComponentModelCache 폴더를 제거해 주면 됩니다.


저작자 표시 동일 조건 변경 허락
신고




가장 쉬운방법은 유니티 자체 제공기능을 사용하면 됩니다.


Colored By Color Scripter

1
Application.CaptureScreenshot(캡처파일이름);


위 함수를 사용하면, 쉽게 파일로 저장이 가능합니다.

단, 저같은 경우 해당 함수를 사용하였을때 문제가 발생하여 따로 캡쳐를 만들어 썼는데요.. 문제점으로 위에 함수로 바로 화면을 캡쳐하여, 메일에 파일첨부로 보내려고 했었는데.. 위에 함수로 하게되면 정상적으로 캡쳐가 안되거나, 첨부가 제대로 안되는등의 문제가 발생하였습니다. 해서 아래와 같이 따로 만들어서 사용하였습니다.


1
2
3
4
5
6
Texture2D tex = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, true);
tex.ReadPixels(new Rect(0f, 0f, Screen.width, Screen.height), 0, 0, true);
tex.Apply();
captureScreenShot = tex.EncodeToPNG();
DestroyImmediate(tex);
File.WriteAllBytes(captureFileName, captureScreenShot);


화면크기로 텍스쳐를 생성하여, 강제로 픽셀을 넣어줘서 변환하는 방식인데.. 위에 방식이 딱히 문제없이 잘 작동하여, 저는 위와 같이 사용하였습니다.

저작자 표시 동일 조건 변경 허락
신고




상황 설명:

  1. PoolManager를 사용하며, 각종 이펙트 이외에도 UI 관련 데이터들도 Pooling 처리를 합니다.
  2. 해당 Pool들은 DataObject -> Pools -> Effect, UI 등등으로 나뉘어 있습니다.
  3. UI 관련 풀링 오브젝트를 사용 후, reparent 처리하다보면, DataObject 자체가 UIRoot 하위로 강제 이동되고, Layer 자체가 UI로 변경되는 현상입니다.


해당 문제의 원인을 찾다보니, NGUI 자체에 해당 원인이 있는것으로 파악하였습니다. 보통 UI관련 풀링에서는 Sprite, Texture 등만을 심플하게 가지고 풀링처리를 하게되는데, NGUI 코드는 UIPanel 하위에 Widget들이 존재하지 않으면, 강제로 UIRoot를 찾아버리는 코드가 있습니다. 그리고 Parent를 UIRoot로 세팅해 버립니다.


해당 문제로 인해, UIPanel 없이 단독으로 Sprite, Texture 를 풀링하여 쓰다보면, 갑자기 전체 풀링 데이터가 오작동가능한 버그가 발생가능합니다.


NGUI 관련 데이터를 풀링처리하여, 사용중이다.

해당  풀링 오브젝트에 UIPanel이 붙어있지않다... 하면 이런 현상이 발생가능합니다.

해결방법은 위에 설명했듯이 쉽습니다. UI 풀 오브젝트등에 UIPanel을 붙여주면 간단하게 해결됩니다. 아니면 풀링하는 오브젝트내에 따로 붙여도 되지만, 풀링 오브젝트는 사실 다른 하위 UI에 임시로 쓰는 목적이기에 Panel 굳이 하지 않아도 되는 상황이 많기에, 한곳에만 추가해주면 될듯합니다.

저작자 표시 동일 조건 변경 허락
신고




유니티에서 클래스에 Editor를 상속하여, 해당 클래스의 인스펙터를 임의로 구성할 수 있습니다. 데이터를 구성하다보면, Array 데이터로 여러개의 데이터를 세팅할 경우가 생기는데.. 이부분에서 특별한 처리를 하지 않으면, Array의 갯수를 변경시켰을때, 기존의 정보가 유지되지 않는 경우가 발생하는데요. 이럴때 사용가능한 헬퍼클래스가 있습니다.


UnityEditor 에 ArrayUtility 클래스가 Editor에서 편하게 Array를 관리할 수 있게 해주는 것이구요.. 이미 고정크기로 초기화된 Array에 대해서 ArrayUtility.Add 등으로 넣어주면, 자동으로 Array의 크기가 증가하고, 기존의 값은 유지시킬 수 있습니다. Remove도 있구요.


Unity - Scripting API : ArrayUtility

저작자 표시 동일 조건 변경 허락
신고




유니티 최적화 관련 세미나등에 가보면, 간단한 팁중에 하나로 OnGUI() 가 느리다는 말이 참 많습니다. 저도 처음 유니티로 작업할때는 느린가보다~ 이랬었죠..


보통 간단한 화면 Fade In / Out 연출이나, 테스트 목적등으로 사용하기도 합니다. 그런데 이게 생각보다 많이 느리다고 생각했던게.. 제가 현재 만들고 있는 프로젝트가 인게임내에서 쾌적한 게임을 위해 나름 이펙트등 풀링 처리, 스킬등을 미리 프리렌더링하여 캐쉬한다던지.. 이것저것 인게임 플레이를 끊김없이 처리하기위해 노력을 했는데.. PC는 워낙 빨라서 느낌도 없었는데.. 모바일로 올리니, 간혈적으로 계속 뚝~ 끊기는겁니다..


뭘까.. 뭘까.. 프로파일러도 돌려보고했지만, 딱히 애매하더군요.. ( 유니티로 개발하시다보면 아시겠지만, 프로파일러에서 모든 부하가 걸리는 부분을 찾아낼수는 없습니다.. 생각보다 안나오거나 애매한것들이 많죠~ 그래도 거진 다 알수있지만요~ )


그러다가.. 저희가 게임내 연출을 위해 사용하는 유시퀀스라는걸 사용중인데, 이 내부에 생각보다 OnGUI를 사용하는곳이 많더군요. 코드들 중에는 나름 사용할때만 OnGUI 내부루틴을 처리하게 Bool로 체크하여, 필요없을시 리턴하게도 되어있었지만.. 생각보다 OnGUI 함수의 존재 자체만으로도 야금야금 갉아먹는 녀석이더군요..


아마 제 생각에는 OnGUI 함수만으로도 한번씩 GC가 발생하는게 아닌가 생각하지만, 그것까진 확실히 모르겠습니다.. 결론은 생각보다 존재 자체만으로 느릴수있다!! 였습니다..

해당 함수들을 다 걷어내기가 그래서 (해당 Extension 들 원본소스등에도 좀 있고해서..) 사용하지 않을때는 관련된 모든 오브젝트들을 Disable 처리해놓고 사용할때만 Enable 처리하여 사용하였습니다. 이렇게 처리하니 생각보다 괜찮은 느낌이었습니다.


최적화 팁으로 많이 나오는 OnGUI 사용하지 말자~! 매우 느리다..!  지나가는 말이 아니라, 정말로 느리니~ 프로젝트 작업하실때 꼭 참고하시기 바랍니다~!

저작자 표시 동일 조건 변경 허락
신고

'유니티' 카테고리의 다른 글

Editor 에서 Array 관리  (0) 2014.10.20
벼룩같은 존재.. OnGUI()  (0) 2014.10.04
디바이스에서 콘솔로그 보기  (0) 2014.10.03
Unity Tweener  (0) 2014.10.03

티스토리 툴바