1. 프로파일러를 이용해서 병목현상 체크하기.
- Window > Profiler 메뉴를 이용한다.

2. 컬링 기법 이용하기.
- 프러스텀 컬링 (Frustum Culling) : 레이어별로 컬링 거리를 따로 지정 가능하다.
- 오클루전 컬링 (Occlusion Culling) : Window > Occlusion Culling 메뉴를 이용한다.

3. 드로우콜 체크하기.
- 드로우콜은 게임 오브젝트에 설정된 재질의 셰이더 패스당 하나씩 일어난다.
- 렌더러에 사용한 재질의 수만큼 드로우콜이 발생한다.
- 드로우콜의 발생을 최소화하기 위해서는 성질이 동일한 물체들은 하나의 메쉬와 재질을 사용하도록 통합하는 것이다.
(이를 위해 최상위 오브젝트에 사용할 수 있는 CombineChildren 컴포넌트가 Scripts 패키지에서 제공된다.)
- CombineChildren 컴포넌트를 사용할 경우, 하위 오브젝트가 모두 하나가 되어서 빛의 계산을 모두 수행하는 등 불필요한 계산이 발생하는 단점도 있다.
- 같은 셰이더를 사용하더라도 다른 텍스처를 사용하면 드로우콜이 증가한다.
- 위와 같은 경우, 텍스처를 모두 합친 큰 텍스처(텍스처 아틀라스)를 만들어 서로 공유하면 드로우콜을 줄일 수 있다.

4. 배칭기능 사용하기.
- Edit > Project Settings > Player 에서 설정.
- 정적 배칭을 사용할 경우, static으로 설정된 게임 오브젝트에서 동일한 재질을 사용하는 물체가 있는 경우 자동으로 통합한다.
- 정적 배칭을 사용할 경우, CombineChildren처럼 통합되는 오브젝트를 모두 하나의 커다란 메쉬로 만들어서 따로 저장하게 된다. (메모리 사용 증가)
- 동적 배칭은 움직이는 물체를 대상으로 동일한 재질을 사용하는 경우, 자동으로 메쉬를 통합하여 드로우콜을 줄여주는 기능이다.
- 동적 배칭은 계산양이 많으므로, 정점이 900개 미만인 오브젝트만을 대상으로 수행된다.

5. 권장 텍스처 사용하기.
- 아이폰 (PowerVR) : PVRTC
- 안드로이드 (Tegra) : DXT
- 안드로이드 (Adreno) : ATC
- 안드로이드 (공통) : ETC1

6. 오버드로우
- 겹치는 부분의 픽셀을 다시 그리는 것을 오버드로우라고 한다.
- 오버드로우를 줄이는 가장 좋은 방법은 큰 영역을 차지하는 물체를 먼저 그리도록 하는 것이다.

7. 물리엔진
- 유니티에서는 물리 엔진 작업을 렌더링 작업과 별개로 수행한다.
- 물리 엔진 작업은 FixedUpdate() 함수에서 수행되며, 0.02초로 매우 짧아서 FixedUpdate() 함수가 여러 번 수행된 후 Update() 함수가 호출된다.
- 따라서 FixedUpdate() 함수의 코드에는 필요한 기능만 넣도록 한다.
- 게임 진행에 문제가 없다면 Edit > Project Settings > Time 메뉴에서 FixedUpdate() 함수의 실행 주기를 늘리는 것도 좋다.

8. 충돌체의 이동
- 리지드 바디가 없는 고정 충돌체를 움직이면 CPU에 부하가 발생된다.
- 이 경우, 리지드 바디를 추가하고 IsKinematics 옵션을 준 후 움직이는 것이 좋다.

9. Maximum Allowed timestep 조절
- 여타 요인으로 시스템에 부하가 걸려 지정된 시간보다 오래 멈출 경우, 물리 계산을 건너뛰도록 설정하는 기능.
- Edit > Project Settings > Time 메뉴에서 설정.

10. Solver Iteration Count 조절
- 물리 관련 계산을 얼마나 정교하게 할 것인지 지정. ( 높을수록 정교해진다. )
- Edit > Project Settings > Physics 메뉴에서 설정.

11. Sleep 조절
- 리지드 바디의 속력이 지정된 수치보다 작을 경우, 자동으로 휴면 상태에 들어간다.
- Edit > Project Settings > Physics 메뉴에서 설정.
- Physics.Sleep() 함수를 이용해서 강제 휴면 상태를 만들 수도 있다. 
(Awake()함수에서 사용하면 레벨이 로딩되기 전까지 물리 엔진 사용을 자제시킬 수 있다.)

12. 유니티 라이브러리 사용 시 주의사항
- 유니티의 핵심기능은 모두 c++로 작성되어 있다.
- 예를 들어 transform.position 에서 transform은 c#의 속성으로 정의되어 있고 position은 c++영역에 작성되어 있다.
- 때문에 transform.position 구문을 자주 사용하는 것보다 미리 변수에 저장해두고 사용하는 방식이 좋다.
- FindObject 계열 함수들은 매우 느리다. ( 미리 찾아서 저장해두는게 좋다. )
- Instantiate 와 Destroy 함수를 이용한 프리팹의 생성과 소멸은 비용이 크다. ( 활성화와 비활성화를 이용하는 것이 좋다. )
- 가급적이면 Update 함수보다 CoRoutine 함수를 사용하도록 한다.
- 박싱과 언박싱은 부하가 큰 작업이다.
- 나눗셈보다는 곱셈이 몇십배 빠르다.
- magnitude 보다 sqrMagnitude를 사용해서 제곱근 계산을 줄이도록 한다.
- 삼각함수의 값은 상수로 저장해두고 사용하는 게 좋다.
- 고정 문자열은 readonly 혹은 const 키워드를 사용하여 가비지 컬렉션으로 부터 벗어나도록 한다.

13. 배열 관리
- Array : 아이템들의 크기가 일정하고, 순서가 변할 일이 없다면 일반 배열을 사용하는 것이 가장 빠르게 동작한다.
- ArrayList : 아이템들의 크기가 자주 변하고 순서도 자주 바뀌는데다, 모든 아이템이 레퍼런스형일 경우 사용한다.
- List<T> : ArrayList인데 저장하는 데이터가 밸류 타입이면 제네릭 List를 사용해야 박싱이 일어나지 않는다.
- Hashtable : 키와 값으로 구성된 사전류의 데이터를 관리할 때 해시 테이블을 사용하면 편리하다.
- Dictionary<K, V> : 해시 테이블과 동일한 기능을 수행하나, 데이터의 형식이 밸류 타입이면 제네릭 Dictionary를 사용해야 박싱이 일어나지 않는다.

 

게임 데이터를 게임이 종료된 후에도 사용할 수 있도록 저장하고 싶은 경우
기본 타입(type)의 데이터 말고 좀 더 복잡한 데이터를 저장하고 싶은 경우
위의 경우에 해당되신다면 이번 튜토리얼이 유용할 수 있습니다.

개요
유니티에서 데이터를 저장하는 게 생각만큼 쉽지 않는 건 사실입니다. 전체 씬, 플레이어 위치 정보 등을 저장하려는 경우에그 작업량이 만만치 않습니다. 이번 튜토리얼 그리고 후에 있을 튜토리얼을 통해 유니티에서 데이터를 저장하는 좀 더 쉬운 방법을 보여드리겠습니다. 이번 튜토리얼에서는 데이터를 저장하는 몇 가지 다른 방법들과 이렇게 저장된 데이터들을 RPC 연결 / 서버에 전달해서, 게임에 사용하는 방법을 보여드리겠습니다.

가장 기본적인 방법

기본적인 방법부터 시작해 보겠습니다. 단순한 데이터형(type)에 대해서는 여러분께서 잘 알고 계실 PlayerPrefs으로 저장하는 방법을 확인 하는 차원에서 한번 알아보도록 하겠습니다. PlayerPrefs는 기본형의 데이터를 문자열키 (string key) 값과 함께 저장할 수 있도록 해줍니다. 단순한 데이터를 저장하고 불러와 사용하기에 좋은 방법입니다. 

Image

게임 내의 값들

씬 전환 시에 데이터를 저장하고 이를 공유하고 싶은 경우에 좋은 방법 중 하나는 정적 클래스 (static class)를 만들어 이 클래스에 데이터를 저장하는 방법입니다.

Image

그리고 이 값을 읽고 싶을 때는 아래와 같이 사용하면 됩니다.

Image


이와 같은 클래스를 사용하는 방법의 단점은 인스펙터(Inspector)에서 값을 조절할 수 없다는 점 입니다. (싱글톤으로 매니져 클래스를 구성하면 이 점은 보완할 수 있습니다..)
- 인스펙터와 코드 모두에서 값을 조절하고 싶은 경우에는 DontDestroyOnLoadobject 함수를 이용하는 방법을 고려할 수 있습니다. (아래 코드 참고)

Image

그리고 아래와 같은 방법으로 값에 접근할 수 있습니다.

Image

좀 더 복잡한 데이터 저장하기

위의 예제에서 PlayerPrefs를 사용해서 high score를 저장하는 방법을 살펴봤습니다. 하지만 위에서 살펴본 방법으로는 많은 데이터를 저장하는 데에는 한계가 있습니다. 따라서 아래와 같이 high score를 저장할 수 있는 테이블을 정의해서 저장하는 방법을 고려해볼 때가 왔습니다.

Image

위의 예제를 살펴보면, List를 이용해서 ScoreEntry 클래스 정보를 담아 테이블처럼 사용합니다. 하지만 이 정보를 어떻게 저장해야 할까요? – 바로 BinaryFormatter를 사용하면 됩니다! BinaryFormatter를 사용해서 “파라미터를 갖지 않는 생성자”를 갖는 클래스라면 어떤 클래스도 바이트 배열로 변환하고, 변환된 배열을 다시 문자열 값으로 변환할 수 있습니다. (문자열 값으로 변환하면, PlayerPrefs에 저장할 수 있겠죠?) 아래 보이는 네임 스페이스들을 추가해줘야 한다는 점을 잊지 마시구요.

Image

유니티 오브젝트 저장하기

유니티 오브젝트들을 저장하는 방법은 생각보다 까다로울 수 있습니다. 그래서 대부분 유니티 오브젝트가 갖는 값을 유추해 볼 수 있는 클래스를 새로 생성하고 이 클래스의 값을 저장합니다. 예를 들면, RPC 호출을 통해 여러 개의 AnimationStates를 전달하고 싶은 경우에, AnimationStates를 대신할 수 있는 클래스를 생성해서 이 값을 전달하게 됩니다. 다른 유니티 오브젝트의 값을 전달하려는 경우에도 상황은 마찬가지겠지요.


RPC를 통해 전달하기

아래 코드를 보면, 어떤 클래스라도 문자열로 변환할 수 있도록 하는 방법을 보여줍니다. 이를 이용하면 RPC를 통해 모든 파라미터 값을 보낼 수 있겠죠?


문서화 되지는 않았지만, RPC 역시 byte[]을 보낼 수 있습니다. 이 값은 BinaryFormatter를 이용해서 우리가 원하는 값으로 바로 변환할 수 있도록 도와줍니다. 문자열로부터 변환하는 시간을 줄여주기 때문에 더 좋다고 할 수 있습니다.

이제 highscores 값을 다른 플레이어에 전달할 수 있도록 하는 능력이 갑자기 생겼네요.

Image

웹으로 전달하기

WWWForm 을 이용해서 웹 서버에 데이터를 전달하는 방법은 아주 쉽습니다. 하지만 위에서 보았듯이 Convert.ToBase64String()를 이용해서 바이너리 데이터를 문자열로 변환하는 방법이 제일 쉽지 않을까 생각되네요. (물론 여러분이 사용하시는 서버에 따라 달라질 수 있습니다)

파일로 저장하기

파일로 저장하는 방법도 물론 쉽습니다. 유니티가 제공하는 Application.persistentDataPath를 이용해서 파일을 저장할 위치를 정하고, MemoryStream 대신 FileStream 을 사용하면 됩니다.

Image

결론

이번 튜토리얼을 통해서, 데이터를 저장하고 게임 중에 이 값들을 이용하는 몇몇 새로운 방법들을 익히셨으리라 생각합니다.

 


 

익스포트(Export)모델링 데이타는 가급적 FBX 포멧을 사용하자.
: 유니티에서 3DSMAX 와 MAYA 포맷을 지원하지만 내부적으로는 표준 그래픽 교환 포멧인 FBX 로 변환해 관리한다. 가급적 FBX Exporter 툴을 사용해 FBX를 만든 후 유니티로 가져오는 것을 권장한다.

최신의 FBX 익스포터를 사용하자.
: 과거 버전에서 만든 파일을 임포트할 경우 결과가 달라질 수 있으므로 가능한 한 가장 최신의 FBX 익스포터를 사용한다.

FBX를 내보내기 전에 Resource Collector 를 사용해 텍스처를 Asset 폴더로 복사할 수 있다.



 

3차원 좌표계유니티는 기본적으로 Y축이 위를 향하는 왼손 좌표계를 사용한다.
: FBX 익스포터 옵션에서 Y UP 으로 설정되어 있는지 확인하도록 하자.



 

스케일(Scale)유니티에서 1의 단위는 1미터를 의미한다.
: Scale Factor 를 통해 모델링을 불러올 때 스케일을 조정할 수 있지만, 가급적 모델링 작업 때 이 단위를 감안하자.



 

노멀(Normal) 구성대부분의 유니티 셰이더는 기본적으로 뒷면은 그리지 않도록 설정되어 있다.
: 일반적으로 그래픽 소프트웨어는 양면을 다 그리는 반면 유니티 셰이더는 그렇지 않다. 이 때문에 면의 노멀 방향이 잘못되어 있을 경우 그래픽 소프트웨어에서 잘 보이는 물체가 유니티에서는 잘 안 보일 때가 있다.



 

텍스처(Texture)유니티에서는 이미지가 RGBA 압축된 DXT 이미지인 .dds 형식으로 변환하여 사용된다.
: 유니티에서는 이미지를 .dds 형식으로 변화하여 사용됨으로, tif, psd 같은 대용량 파일도 마음대로 사용해도 된다.

2의 제곱수 사이즈의 텍스처를 사용하자
: 2의 제곱수 이미지를 사용하면 밉매핑(mip-mapping) 이미지가 사용될 때, 아티팩팅(artifacting) 이라는 깜빡임 현상으로 인한 부작용이 거의 없어진다. 또한 컴퓨터 내부적으로 메모리가 2의 제곱수 블록 형태로 사용됨으로 메모리 최적화와 효율성에서 이득이 있다. 가능하다면 이미지는 항상 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048 등의 크기로 만들어야 한다.



 

재질(Material)재질(Material)이름과 텍스처 파일명과 같게 하자
: Unity3D 툴 재질에 텍스처가 자동으로 들어가게 하려면 이름이 같아야 한다.

유니티는 임포트 시점에 객체에 대해 기본 디퓨즈 텍스처만을 생성한다.
: 범프(bump)나 반짝임, 높이, 기타 특수 맵은 직접 추가해야 한다.



 

메시(Mesh)맥스 객체는 모서리 문제를 막기 위해 에디터블 폴리 대신 에디터블 메시로 병합해야 한다.
: FBX는 회전 모서리를 지원하지 않으므로 내보내는 과정에서 모델이 변경될 수 있다.



 

애니메이션(Animation)복잡한 애니메이션 계층구조는 유니티에 임포트할 때까지 정사영 방향으로 유지한다.
: 유니티는 비정사영 회전 매트릭스를 지원하지 않는다.

유니티는 현재 모프 타깃 같은 정점 애니메이션을 지원하지 않는다.
: 정점 단위로 객체에 영향을 주는 애니메이션은 항상 뼈대를 사용해 처리해야 한다.

각 비헤이비어(behaviour)나 타임 세그먼트의 시작 및 끝에 있는 변형과 객체에 대해 모두 키를 지정한다.

비헤이비어의 타임 세그먼트는 여러 객체가 같은 이름의 타임 세그먼트나 클립을 사용하지 않는 한 겹치지 않게 한다.
1. 티스토리 블로그에서 글쓰기 모드로 화면에서 게시할 게시판과 제목을 입력한 후 상단의 아이콘중 파일 아이콘을 클릭하여 다음과 같이 플래시 파노라마 파일을 첨부합니다.

 2. 우측상단의 HTML을 체크하여 글쓰기 모드를 HTML 모드로 변경한 후 아래 그림과 같이 첨부된 파노라마 파일의 태그중 cfile7.uf@에서부터 swf까지 태그를 복사합니다.

 

3. 아래 링크를 클릭하여 티스토리 주소변환기 유틸을 제작자 사이트에서 다운 받아 실행한 후 그림과 같이 티스토리 블로그 주소 항목에는 자신의 티스토리 블로그 주소를... 편집모드 파일주소 / 일반 파일 주소 항목에는 2번에서 복사한 태그를 붙여 넣고 변환 버튼을 누릅니다.

http://kkyblog.tistory.com/

 4. 아래 그림과 같이 생성된 다양한 태그중 첫번째 태그인 첨부파일 주소 항목의 우측 동그라미 아이콘을 클릭하여 태그를 복사합니다.

 5. 아래 그림과 같은 embed 태그에 복사한 첨부파일 주소를 붙여넣고 전체 태그를 복사합니다.

아래 태그를 사용하세요.

<embed width="100%" height="550" src="티스토리플래시주소" quality="high" allowScriptAccess="always" allowFullScreen="true" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"/><br /><br />


6. 티스토리 글쓰기 창으로 돌아가 모든 태그를 삭제한 후 5번에서 복사한 태그를 붙여넣습니다.

 

7. 저장버튼을 클릭하여 글쓰기를 마무리 합니다.

9. 포털사이트의 카페나 블로그로 게시할 때도 5번항목과 동일한 태그를 사용해서 등록하면 됩니다.

 

즐겨찾기 활용

메인화면 에서

1, 2, 3 메뉴중 3번을 클릭 즐겨찾기 옵션 설정 중간설정 을 많이 사용한다 스캔소요시간 3분 설정후 메인으로
거리에 따라 더 촘촘히 찍도록 한다.

장비 스캔 사거리 100m 오차율 3mm
배터리 1개 3시간 사용 가능
Point 초록>노랑>빨강 부터 점간격 넓어지고 오차율 심하다.
색상별 모서리 끝점 활용 ( X Y Z ) 3축을 사용하여 레지 할것 축 점간 거리가 멀수록 오차 적다.
레지 10 ~ 30 스캔데이터 작업후 한번에 정합 하면 작업 시간을 줄일 수 있다. 정합 확인 필수
스캔시 안개 수증기 근처 피할것
장비 절단 면을 보면 회전 중심축이 연결돼 있으므로 필히 분리하여 이동할것
삼각대 설치 : 두다리 잡고 선정 위치 안착 후 중간 다리로 중심 잡기 기본 삼각형을 만들어 준다.
중심 조절바 중간에 둘것 높거나 낮을경우 본체 분리 우려 ( 중심은 동그란 선 중심에 둘것 ) 액정사용시 정밀함
삼각대를 최대로 높이면 바람이나 진동시 흔들려 스캔을 다시 해야한다. ( 다리잡고 스캔할것 ) 바닥에 고정

러프 스캔 5~10 미터 간격 
로드뷰 처럼 연결 되게 스캔할것

----자신의 홈페이지(서버)에 있는 파노라마를 직접 게시할 경우-----------------------------------------------------


<embed pluginspage="http://www.macromedia.com/go/getflashplayer" height="550" width="100%" allowFullScreen="true" src="krpano플래시뷰어주소" flashvars="xml=xml파일주소" />
 

 

다운로드

KKY_티스토리_주소_변환기v1.7.7z
다운로드

 

티스토리 첨부파일의 주소를 변환하여 링크할수있도록 해주는 변환기 입니다.
EMBED IMG 링크 태그도 생성해줍니다.

1. 본인 티스토리 블로그 주소 붙여넣기
2. 편집모드 파일주소 / 일반 파일 주소 : 파일 첨부 주소 넣기(속성에 주소 나옴)
3. 변환 종류별 선택
4. 첨부파일 주소 : 첨부파일 주소 복사

소스코드
<embed width="100%" height="500" src="

첨부파일 주소 넣기

" quality="high" allowScriptAccess="always" allowFullScreen="true" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" allowNetworking="internal"/>

변경 사항
- filename 발견시 "여기에 링크 제목 작성" 대신 해당 파일 이름으로 입력됨.

#http:// 사용' 체크시
'오류가 발생했습니다. 다시 시도해주세요.' iframe , embed 둘다

또한 일부 태그 먹히지 않는 것들

'반복재생'
iframe 반복 재생 안됨
embad 사용시 invaild parameters 라고 뜨면서 안됨
결론 : 반복재생 자체가 둘다 안됨


'재생바 자동숨기기' iframe, embed 둘다 안됨

+ Recent posts