블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
안녕하세요 유니티스터디에서 도움만 받는 잉여 회원 입니다.
 
로딩 페이지 구현? 에 고생해서 정식으로 유니티스터디를 통해서 올립니다.
 
 AsyncOperation.progress라는 놈이 pc에서는 제대로된 값을 얻을 수 없어서 삽질을 많이 하셨습니다 ㅠㅠ
 
using UnityEngine;
using System.Collections;
public class EnterLoadPage : MonoBehaviour {
 
 public UISlider  Script;
 public UISlider  ScriptPercent;
 public UILabel  textScript;
 
 AsyncOperation   async;
 
 bool IsLoadGame = false;
 
 public IEnumerator StartLoad( string strSceneName )
 {
        if (IsLoadGame == false) 
        {
            IsLoadGame = true;
            
            AsyncOperation async = Application.LoadLevelAsync ( strSceneName );
        
            while(async.isDone == false) 
            {
                float p = async.progress *100f;
                int pRounded = Mathf.RoundToInt(p);
    
                textScript.text = pRounded.ToString();
 
                //progress 변수로 0.0f ~ 1.0f로 넘어 오기에 이용하면 됩니다.
                ScriptPercent.sliderValue = async.progress;
                
                yield return true;
           }
        }
    }
 
 void Start()
 {
       StartCoroutine( "StartLoad", "SceneGame" );
 }
 
 float fTime = 0.0f;
 
//로딩 페이지에서 연속으로 애니메이션 만들때 Update 함수 내에서 만들면 됩니다.
 void Update () {
  fTime += Time.deltaTime;
  
      if( fTime >= 1.0f )
      {
            fTime = 0.0f; 
      }
  
        Script.sliderValue = fTime;
  }
}
 
 
사용법은
 
Scene과  로딩 부하가 심한 Scene 사이에 해당 ScenePage를 추가 하여 사용하시면 됩니다.
 
ex)
 
SceneMenu -> SceneLoadingPage -> SceneGame
 
 
읽어 주셔서 감사합니다.



출처 : http://www.unitystudy.net/bbs/board.php?bo_table=tip&wr_id=52

반응형
Posted by blueasa
, |

WWW로 Texture를 다운받을 때, DDS, BMP,TGA는 다운이 안되길래 검색해보니..

WWW로는 PNG, JPG만 된다고 한다..

다른 포멧도 지원해주는 플러그인이 있길래 링크해놓는다.


Task #5: Loading DDS, BMP, TGA and other textures via WWW class in Unity3d

  
  This article describes the task: Load images via WWW class. Current version of Unity3d allows you to download images via WWW class only in PNG or JPG format (read more here:http://docs.unity3d.com/Documentation/ScriptReference/WWW-texture.html). But we should implement image loading in such formats as DDS, BMP, GIF, PSD, TGA etc. 


  Demo of application is shown on fig. 1.
Figure 1. – Demo of application
  
  All these image formats are supported by DevIL library (read more here:http://openil.sourceforge.net/features.php).
  There is no need for full application description, because DevIL library is well documented and has a lot of examples. I will show only the short description of implementation:
  • Load texture using WWW class;
  • Get bytes data using «bytes» field of WWW class;
  • Create DevIL texture from this data;
  • Get Color32[] array from DevIL texture;
  • Create Texture2D object based on this color array;

  To illustrate implementation I created a demo application. I want to notice that this application loads also MipMaps data from the texture, and creates proper Texture2D. 
  If you need more detailed description, or implement image loading not supported by unity3d, please write it in comments.


  Application demo you can download here:
  Source code you can download from here:



출처 : http://denis-potapenko.blogspot.kr/2013/04/task-5-loading-dds-bmp-tga-and-other.html

반응형

'Unity3D > Plugins' 카테고리의 다른 글

Unity3D WebView  (0) 2015.01.21
유니티 3D상에서 WebView 띄우기  (0) 2015.01.20
Log Viewer  (0) 2014.01.09
Mobile Movie Texture  (0) 2013.12.03
원격 로그 플러그인  (0) 2013.11.20
Posted by blueasa
, |
이번에 감사하게도 페이스북 데브코리아 페이지의 이벤트에 담첨되어, 유나이트 코리아에 무료로 참석하게 되었습니다.

많은 인파가 몰려서 약간 정신 없기도 했었던 컨퍼런스 였지만 유익한 정보를 많이 얻어갈 수 있어서 참 기분이 좋았습니다.

유니티 5.0에서 추가되는 기능들에 대한 설명을 들을 수 있었구요.

뉴비 프로그래머인 저에게 도움이 되는 기술적인 테크닉을 알려주는 세션도 있었습니다.

이 좋은 내용들을 어떻게 나눌까 고민하다가 

즉흥적으로 메모했던 부분들을 첨부할까 합니다. 

좀 내용이 일관적이지 않고 앞뒤가 맞지 않지만 키워드 정도는 참고 가능하실지도 모를까 싶어 올립니다.

다음에도 이런 좋은 이벤트가 많이 열려서 데브코리아에 항상 상주하시는 개발자 분들과의 소통이 많이 되었으면 좋겠습니다. 

감사합니다!

ps1. 첫째날 세션4 유니티를 이용한 아키텍쳐 강의 프로젝트 파일을 다운받을수 있는 주소와
둘쨋날 세션4 더욱 강력한 C# 활용 강의 프로젝트 파일 주소를 받을 수 있었는데
혹시 몰라서 댓글 달아주시는 분께 비밀댓글로 알려드리도록 하겠습니다.


Day1 
세션 1.
메가님 그리고 그 이상을 뛰어넘어.
유니티 Pierre Paul Giroux


엔트리, 엑셉트 노드 추가.
스테이트 머신의 전환이 심플하게 가능해짐

idle이 여러게일 경우 많은 상태가 필요해 꼬이기 마련.
이걸 해결할수 있는 방안.

디시즌 노드를 FSM에 추가함.

아이들 머신이 자급자족이 가능.. (여러게의 아이들)

스테이스 모델들끼리 공유가 가능.
에셋스토어에서 판매가능

스테이트머신 비헤이비어 추가.

onStateEnter
엔트리에 들어갈때

onStateUpdate
엔트리 업데이트.
모든 프레임에서 이루어짐

onStateExit
끝날때

OnStateMove

onStateIK

스테이트머신이 자립.

애니메이션 연동해 이팩트 호완 가능..

이팩트 또한 연동작업이 가능.

메카님 코드를 완전히 공게

네비게이션 빌더.

프리뷰 화면 줌아웃 페이드 인 가능.

블랜드 쉐이프

캐릭터 표정 원프레임 애니메이션을 활용.

다이렉트 블랜드 트리 추가됨 5.0
(웃으면서 눈깜밖임, 입 벌리며 웃기)

5.0추가 되는 기능  정리..

스테이트 머신 전환 
간단하게 스테이트머신 로직 활용.

스테이트머신 비헤이비어
코드 로직을 스테이트 내에 바로 넣을수 있게 해줌.
idle, 트레일 렌더러 추가.

루트모션 애니메이션
2d게임에서 애니메이션 활용.
2d 네비게이션.

디렉트블랜드 트리
애니메이션 가중치를 직접적으로 연결.

루트 애니메이션 이슈..

Question..

애니메이션이 많아질 경우.. 메모리 문제 발생..

애니메이터는 프로그램 시작시 모두 로드가 됨.

애니메이션 옵티멀 기능을 꼭 사용해봐라.

예를 들어서 굉장히 괜 애니메이션이라도. 애니메이션이 1메가라면..

옵티멀 압축모드 사용해봤는지?

2.0 ~ 3.0시절의 애니메이션 기능이 사라진 경우에 대한 질문

애니메이터에서 연결되어서 사용되야 함.

애니메이터 사용시 메모리 할당이 많이 되어서 문제다..

레거시 모드... -> 중장기 적으로는 없애는 기능..


세션2.
유니티로 멀티플레이 게임 만들기, UNET
유니티 Erik Juhl

멀티 플레이 파운데이션 

피드백 받으려고 함

MMO까지 가능한 파운데이션을 제공해주려 함.

멀티 플레이 파운데이션은 뭔가?

전문가 적인 인프라 툴

로우레벨 api 소켓처럼 인터페이스가 됨

하이레벨 api 도 제공함.

네트워크 엔지니어 아니더라도 개발을 하려면 하이레벨이 정답.

메치 메이커. 

비전

phase 1
multiplayer foundation
not in 5.0 but releaed in unity 5.x

phase 2
server authoritative gameplay
being re

phase 3
..

why create the multiplayer foundation.
하이레벨로 먼저 개발해서 제공.. 네트워크 개발자들이 불만.. (레거시 시스템)

빠른 숙도가 요구되는 게임은 UDP 

MMO 동자원 문제.

이벤트 드리븐 IO

하이레벨 스크립트 api

서버와 클라이언트 하이레벨에섯 지원

네트워크 메시지를 주고 받을수 있고

클라이언트 서버모델이 기본적으로 설치되어 있음

클라이언트에서 서버로 바로 메시징

서버에서 클라이언트로 이동

클라이언트들끼리의 통신은 없음.
(로우레벨을 사용하여야 함)

Engine and ediotr integration

세션3
Asset Store 등록과 절차 소개
유니티 조현태

1. 에셋스토어 소개
2. 에셋스토어 활용법
3. 에셋 스토어 등록방법

에셋 스토어란 ?

장난감 상점..

에셋 = 장난감 = 리소스
게임을 제작할 때 필요한 모든 리소스
아트, 프로그래밍, 사운드, 템플렛

에셋 + 게임 제작 병행
- 에셋 스토어의 판매수익을 바탕을 게임 제작
제작한 게임 내의 자체 제작한 에셋을 에셋 스토어에서 판매.



에셋 스토어 활용.
다양한 애니메이션 셋
Mixamo <- 유명한 애니메이션 에셋.
수백게의 모델과 수천게의 애니메이션 제공

Particle Playground <- 파티클 에셋.

게임사운드 

Retro sound fx, 
효과음, 
배경음악, 각족 오디오 툴, 보이스 바니(캐릭터 대사를 글로 작성해 보내면 녹음해서 보내줌)

효율적인 프로그래밍

스크립팅 툴
플레이 메이커, uscript, nodify

쉐이더 프로그래밍 툴
shader forge
strumpy shader editor
shader fusion

AI스크립팅 툴
Befave 2 for unity
plyGAme
plyBlox

에셋 스토어 등록

1. 한번 올린 에셋은 영구적으로 판매가능
2. 서포트는 판매자가 직접 제공
3. 수익은 판매자와 유니티가 7:3으로 배분
2주에 한번씩 송금.

에셋 스토어 계정 만들기 - > 퍼블리셔 셋팅 -> 팩키지 올리기 -> 등록완료 검수를 기다림.


1. 가입하기

E-mail
password, 
repeat password, 
firstname, lastname, 
organization or company, 
address1, 
address 2, 
zip or postal code, 
city, 
country, 
phone number, 
vat number

2. 퍼블리셔 셋팅

퍼블리셔 유얼 에셋 버튼 클릭 -> 다운로드.

Asset Store Tools

publisher account

unity3d.com 홈페이지 가서 에셋 스토어의 publisher login 

paypal 페이팔 가입해서 2주에 한번 송금받는 방법. 
wire  한번 송금에 20 달러 250이하는 안됨


Asset Store Tools 에서
에셋스토어 등록.


세션4
유니티를 이용한 아키텍쳐
유니티 Rustum Scammell
Architecting GAmes in Unity
Common pattern.

Broken Windows
fix the windows
int new tork city, albuquerque and the netherlands, improving the physical appearance of a beighbourhood has been shown to reducecrime and increase quality life
people are influenced by their environment
social norms and conformity
routine monitoring

에셋 리스트 폴더관리.

good architecture = good standardss
use c#
Naming conventions.

switch-case 복잡함.

delegates 런타임 메모리가 항당되어 별로.....

delegates[] 사용!


Implementing Gameplay

싱글턴,

Pool Based Object.

bast-Practices

use c#
naming conventions
logical folder structure
zero-toler

Day2
기조연설 2
SquareEnix 드래곤 퀘스트의 모바일 개발과 전개

hatakeis@square-enix.com

스퀘어닉스 그룹.


모바일 사업 
- ios app 120 titles
- android os 80 titles

장점.

Single DL Contents(Premium)
싱글다운로드가 장점이다.

Free to Play Contents(Freemium)

드래곤 퀘스트

28년전 처음 출시.

국민적인 RPG.

드래곤 퀘스트 8 출시. 
유니티로 개발.

드래곤퀘스트  포탈
DQ overall information site
Platform Application of DQ1~ 3 treated as In-app purchse
DQ liaison page for smart phone

DL Status of DQ portal

over 4,000,000 for only 3 month

배경으로는 드래콘 퀘스트 1을 기간한정 무료 프로모션을 함.

드래곤 퀘스트 1의 무료 배포의 의미는..

드래곤퀘스트 1의 다운로드가 아닌 드래곤퀘스트 포탈의 다운로드...

드래곤 퀘스트 포탈에서 다운로드 받음... 인앱결제도 여기서..

400만명에게 다양한 프로모션이 가능해짐.

가장 마케팅적으로 좋은 솔루션은 푸쉬...

푸쉬 알림을 함으로서 스토어에 구입하려는 사람이 많음(구체적인 숫자는 노코멘트)



What's the titles with using Unity... 

스퀘어 에닉스 테크니컬 메니저(발표자 바뀜)

드래콘 퀘스트 8 포팅하는데 있어 유니티와 어떻게 활용을 했는지

모바일 개발을 위해서 모바일 개발의 트렌드에 대해 얘기를 한다.



1. 모바일 게임업계의 현제와 미래
2. 유저인터페이스와 게임디자인 (드래곤 퀘스트 8 에서 인터페이스와 디자인)
3. 스퀘어 에닉스와 유니티의 관계 스퀘어 에닉스가 유니티에서 포팅한 게임의 겟수.


먼저 모바일 게임의 현재와 미래..

진화하는 속도가 빨라지고 있다.

지금 현재와 미래의 전망.

현재 휴대폰 사양
cpu 32bit, 64bit,
gpu multi-core
graphics api
opengl es 1.1, 2.0 , 3.0
ram 1.0GB 
storage
64GB

콘솔과 같은 형태로 개발이 가능해지고 있다.

대용량 디바이스의 등장.. 과 우리가 어떤 타이틀을 만들것인가?


드래콘 퀘스트 8 포팅...

콘솔 타이틀을 손바닥 크기로.. 프레임 안정적.

콘트롤러의 수요..가 있고 대응하고 있음.... 

폰에서 피씨로 포팅... 그러기 위해서는 컨트롤러 대응 해야됨.


일본 스마트폰 시장 50% 점유율

역포팅 작업중.. pc 플스 엑박.. 닌텐도

유저 인터페이스 디자인.


세로 화면을 기준으로 개발..
플레이어가 편하게 실행 

전철에서 게임을 플레이 하는것을 타겟으로..

게임의 메인 유아이를.. 잘쓰는 손에 맞춰서 변경할 수 있도록 함.

이런부분을 세세하게 케어 해줘서 플레이를 손쉽게 즐길수 있또록 함.


게임 데이터.

스마트폰을 사용할때는 보통 멀티테스킹 작업.. (메일, 웹, etc)

어플리케이션을 많이 기동할수록 램이 부족해짐..

램이 부족해지면 백그라운드 프로그램 종료..

그래서

오토세이브를 생각했다.

자동으로 종료가 되면 자동저장이 된다.

자동저장이 없을때 많은 불만사항들이 생겼지만..

구현해서 적용 후 많은 호평을 받았음.



스퀘어 에닉스와 유니티의 관계..


유니티를 이용한 타이틀 9개
성검전설, 드퀘8, 데드맨즈 크로즈, 

왜 유니티를 사용하는 기회가 늘어났는지

유니티가 왜 활용하기 쉬운지..

많은 사용자로 인해 쉬운 대응이 가능.

커스텀마이징이 뛰어남.(?)

개발환경의 원 페키지 화.

소스를 재활용 해서 사용이 가능.


세션 1
유니티에서 웹개발의 미래
유니티 Jonas Echterhoff

아시아 시장이 사용량이 가장 많다.

HTML5 로 오면서 플러그인이 필요가 없어졌다.
(플러그인이 내장되어 있다.)

왜?

보안, 통제권 떄문에 브라우저 회사는 플러그인을 좋아하지 않는다.

플러그인은 점점 통제권이 사라지고 있다.

Web GL을 발표했다.

하드웨어 가속을 할수 있는 라이브러리.. (브라우저 내에서)

브라우저에 빌트인 되어 있기 때문에 플러그인이 필요 없다.

자바 스크립트를 사용하는 플러그인

유니티에 내장된 opengl api를 거의 수정하지 않음.

open web standard

파피어 폭스, 크롬, 인터넷익스플러러, 오페라 에서 가지고 있다.

사파리 같은 경우는 기본값이  disable 되어있어 제외.

유니티 솔루션을 구현하는 가장 좋은 솔루션이다. 

언어적 플러그인적 장벽이 없다..

항상 이 기능을 가지고 싶어 했다.

2년 전부터 구현하려고 함 HackWeek에서 시도를 시작

HackWeek란 2년에 한번씩 코펜하겐에 모여 새로운 아이디어 프로젝트 실험.

일주일 동안 테스트를 함.

데드 트리거 2 를 webGL로 구현.. 

와우... 잘 돌아감..


기술적으로 어떻게 되느냐?


유니티에서 웹 지엘을 사용하기 위해서는..?

웹 지엘은 자바 스크립트 api 이다.


유니티 엔진 코드는 C/ C++ 작성되어 있음.

c#이나 유니티 스크립트를 자바스크립트로 바꿔야 함.

Emscripten 크로스 컴파일러.

크랭 컴파일러를 이용해서 C++ 코드를 LLVM bitcode로 바꿔줌.

c 코드를 webgl로 바꾸는데 도움.. 서칭이 필요.


asm.js

자바 스크립트는 다이나믹 해서 코드 최적화가 어려움.

자바 스크립트의 서브 셋.

자바 스크립트를 AOT complie를 할수 있도록 함.

자바 스크립트의 빠른 실행을 하게 해줌.

자바스크립트의 서브셋 이기 때문에 완벽한 호완이 가능.

브라우저의 지원 여부에 상관없이 실행 가능.(webGL만 된다면..)

모질라에서 개발한 기술.

파이어폭시에서도 지원 가능.



지금은 파이어폭스에서만 지원함.




유저코드는 어떻게 해야하나?

C#을 어떻게 자바스크립트로 바꿔야 하나?


IL2CPP

C# -> C++로 만들어줌.

이코드를 asm.js를 사용

종합.
c# 스크립터를 웹에서 자바 스크립트로 변환이 가능..



C# -> .net 바이트 코드로 변환됨. 
이 닷넷 바이트 코드를 IL2CPP를 통해 C++코드로 변경.-> asm.js 를 활용해 자바스크립트로 변경.

|0 <- asm.js 에서 인티져로 사용하도록 함.


-> 최적화 패스를 함.


unity webgl 유니티 5.0에서 web gl을 어떻게 지원할 것인가?

초기 버전을 unity 5.0에서 구매 가능할거임.

처음에는 제약사항들이 많은거임.

데스크탑 버전과 파이어 폭스만 지원할 예정. -> 계속 늘어감.


5.0에서 제한되는 기능

video

runtime substance generation

networking ( www class is supported, but no .NET sockets)

마이크, 웹켐

스크립팅 디버깅



퍼포먼스는?

네이티브 코드만큼 빠를수가 없음.

얼마나 퍼포먼스가 떨어지는가?

브라우저에 따라 다름.(브라우저 마다 자바 스크립트 엔진이 다름)

asm.js를 지원하기 위한 움직임이 있어 확장할 가능이 있음.

멀티 쓰레딩을 사용하면 느려짐


최소한 네이티브 보다 50% 이상의 퍼포먼스를 보여준다.

데스크탑 pc의 50% 퍼포먼스는 그나마 많은것을 할 수 있다.

gpu 완전 지원이 되기 떄문에 고차원적인 렌더링을 많이 할 수 있따.

계속해서 발전이 될것이다.

유니티 프로파일러 100% 지원가능..


웹지엘 플러그인을 지원함.

unity 5.x 에서 기능적인 제약들을 없앨수 있도록 노력할것이다.

앞으로 더 많은 브라우저들이 webgl들을 지원해줄수 있을것으로 본다.

유니티 웹 플레이어는?

아직까지 가장 강력한 가장 광범위하게 지원되고 잇는 플러그인 이다.

두 기술을 동시에 지원할 계획 

유니티 웹 플레이어는 언젠가는 지원이 되지 않을 것인가?

마소는 웹지엘 작업중
애플도 지금 현재 웹 지엘 수정중

올해는 웹지엘 2.0이 나올텐데.

멀티쓰레딩 지원에 대해서는...? 브라우저 벤더들이 지원을 하려고 하고 있다는 얘기를 들었다.

지원이 되면 네이트브와의 퍼포먼스 차이를 줄임.

세션 2

유니티짱 한국에 상륙.
유니티 짱에 대한 이야기..

케릭터가 귀여우면 텐션이 올라간다?!

2년전에 유니티짱 프로토 타입 만들었지만 문제가..

캐릭터가 성공하지 못함..

일단 그리기가 어려움..

와닫는 부분이 없다. 제작이 힘든 부분. 임팩트가 없음..

유니티짱 프로토 타입 실패를 보고.. 2가지 요소를 생각..

그리기 쉬운 캐릭터, 그리기 어려운 캐릭터 

그리기 쉬우면 팬의 엑티비티가 높아진다..



셋팅 에셋. (표정, 움직임)

shared world


setting asset makes her live 

디자인을 100% 의도하고 만들었다..


액션 게임에서도 활용가능한 에셋을 제작하고 했음.

움직임을 보였을때 즐겁게 움직임을 보였으면 좋겠다.

배색도 중요.. 배색만 보고도 유니티 짱인지 알게 만드는것?


유니티 짱에 포함된 에셋

character model
shaders
animations

4 5 voices
locomotions
facial control sample

유니티 짱 라이센스.

전년도 수익 천만에 이하의 아래

금액을 넘게 되면 상의를 해달라..


2차 조작.. 동호인 활동 허가

기술적인 데모 아카데미 데모에서 사용 가능.




수익 상한선을 넘었을때 상의 바람.
야한거 안됨...;;

정치적인 메시지 전달 안됨


케릭터 개조할경우 라이센스를 숨겨야 함.

기술적인 언급은 없었음... 



세션 3

Unity Test Tools
유니티 tomek paszek
이시간은 살짝 졸았내요;;

tomek paszek toolsmith
테스트 인프라 개발 관리.


테스트의 개괄적인 내용.

테스트를 자동화 시켜야 하는 이유?

테스트의 목적인 리그레이션을 찾기 위함임.

테스트 자동화는 퀄리티 계약을 하는것과 같다..

코드를 납품하는 회사의 퀄리티 계약 'ㅅ'.




테스트를 자동화 하기 때문에 더많은 테스트를 할수 있다.

개발의 막바지에 갈수록 비용이 많이 든다.



Unity Test Tools goals

fill out the gap in the industry
evanglize testability
버그 레포트를 제출하는 세로운 방법.


자동화 피라미드

UI
Integration
Unit

유니티 테스트 툴

유닛 테스트 러너

어세션컴포넌트

인테그레션 테스트 러너



Unit Test Runner 사용 방법

  
코드를 리컴파일 할때마다 테스트 하도록 셋팅.


세션 4

더욱 강력한 C# 스크립트 활용
정해종


유니티 허브 프리데브로 활동중.


큐어스노우대표 + 게임개발자



Big Script -> Small Script


Master 클래스..


모노 비헤이비어 상속 -> 모노 비헤이비어를 상속 받는 마스터 클래스.


All round variable
로컬 변수

all round variable - local sharing
로컬 공유



Class RabitAttack : 모노 -> RabitAttack : Master


마스터 클래스에서 공용변수를 공유

vars.setBool(), vars.getBool() api 를 제작하여 활용.


전역 공유

varAll.




오브젝트 변수들을 저장하고 싶은 경우에는?

파일 입출력 할 경우.

var.setFloat("speed", 1.of);
var.setString("name", '홍길동");
var.


아웃풋된 파일을 로드해서 적용.
var.LoadFile("경로/파일명.txt");
var.getInt("monsterCount");

데이터베이스를 따로 구축하지 않고 파일입출력을 활요해서 적용.



데이터를 데이터베이스로 보내는 기능도 있음
var.SetString("id","test");
var.SetString("password"","1234");
var.SendHttp("주소");

http 응답을 기다려야함..

변수의 값이 바뀌었는지 확인.


Master Find - catched find 만능 변수 객체
var.FInd

한번만 찾고 변수가 바뀌지 않는 이상 비용이 크게 들지 않음.

MasterName 

NGUI 클래스에 마스터 클래스 넣고 이름 설정해서 찾기하면 비용이 적게 든다.

All round Variable - modify detection
만능 변수 객체 - 변수 수정감지

OnVariableChange(string name)
{
}

만능 변수 객체 - 문자열을 이용한 변수 설정.
all round Variable - set by string

var.FromString("int a = 1; int b = 2; string = "ttttt";);
마스터 클래스에서 변수가 설정됨.




애니메이터 사용하기


다중 오디오 사용하기.


타이머 설정
코루틴 몰라도 사용 가능.

암호화 되는 playerPrefs 사용.



출처 : http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=45126&page=0&sca=&sfl=&stx=&spt=0&page=0&currentId=44#c_45143

반응형
Posted by blueasa
, |


Link : http://www.moknol.com/2013/12/blog-post_16.html


Link : http://unity-chan.com/

반응형

'Unity3D > Link' 카테고리의 다른 글

Tree Pack(FBX)  (0) 2014.09.03
awesome-unity - UNITY 관련 자료 모음 GitHub 프로젝트  (0) 2014.08.14
모바일 게임 버전 관리 정책  (0) 2014.02.25
유니티 C# 관련 사이트  (0) 2012.10.24
유니티 튜토리얼 사이트  (0) 2012.10.24
Posted by blueasa
, |
반응형
Posted by blueasa
, |

Unity SVN 연동

협업/SVN / 2014. 4. 11. 10:08

링크 : http://kieuns.com/wiki/doku.php?id=language:unity:9-svn-%EC%97%B0%EB%8F%99

반응형

'협업 > SVN' 카테고리의 다른 글

Unity3D SVN 연동 방법  (0) 2014.01.03
Unity3D SVN 연동방법  (0) 2012.12.25
Posted by blueasa
, |

This is something I use to capture errors and log-information from games that are out in the wild, and report them back home to my server.

using UnityEngine;
using System.Collections;


public class ErrorReporter : MonoBehaviour
{

string debugText = "";
string postURL = "";

void Awake ()
{
Application.RegisterLogCallback (new Application.LogCallback (CaptureLog));
}

IEnumerator SendDebugToServer ()
{
WWW www = new WWW (postURL, System.Text.ASCIIEncoding.ASCII.GetBytes (debugText));
yield return www;
}

void CaptureLog (string condition, string stacktrace, LogType type)
{
string sep = "------------------------------------------------------------------------------\r\n";
debugText = sep + type.ToString () + " " + Time.realtimeSinceStartup.ToString () + "\r\n" + condition + "\r\n" + stacktrace + debugText;
if (type == LogType.Exception) {
StartCoroutine (SendDebugToServer ());
if (!Application.isEditor) {
SomethingReallyBadHappened ();
}
}
}

void SomethingReallyBadHappened ()
{
//NB: Try and recover or fail gracefully here.
}

}



On the server side, you could use a very simple piece of PHP to receive the request and write it to a file.


$data = file_get_contents('php://input');
$file = "reports/report_" . time() . ".txt";

$fp = fopen($file, "w") or die("Couldn't open $file for writing!");
fwrite($fp, $data) or die("Couldn't write values to file!");

fclose($fp);
echo "Saved to $file successfully!";


출처 : http://entitycrisis.blogspot.kr/2011/01/error-reporting-from-your-unity3d-game.html

반응형

'Unity3D > Crash Report' 카테고리의 다른 글

[펌] iOS Crash Reporting Tools 소개  (1) 2017.12.11
참조 자료  (0) 2014.04.08
Posted by blueasa
, |

참조 자료

Unity3D/Crash Report / 2014. 4. 8. 17:35

[Unity Asset] Crash Reporter($10) : https://www.assetstore.unity3d.com/#/content/8215


[Unity] CrashReport Class : http://docs.unity3d.com/Documentation/ScriptReference/CrashReport.html


[Unity] Application.RegisterLogCallback : http://docs.unity3d.com/Documentation/ScriptReference/Application.RegisterLogCallback.html



Link : http://answers.unity3d.com/questions/207913/crash-reporting-for-unity-game.html

반응형

'Unity3D > Crash Report' 카테고리의 다른 글

[펌] iOS Crash Reporting Tools 소개  (1) 2017.12.11
Error Reporting from your Unity3D game.  (0) 2014.04.08
Posted by blueasa
, |

어플리케이션의 스테이트에 따라서 특정한 처리가 요구될 경우가 있습니다.

이를 위해 안드로이드. iOS 양쪽 모두 통용되는 메소드를 지원하고 있습니다. 

 

OnApplicationPause(bool pause) : 홈키로 어플을 내려 pause 상태로 만들었을 때의 처리

OnApplicationQuit() : 어플을 종료할 때의 처리

 

메소드의 이름만 보면, 안드로이드 쪽에 가깝군요. 하지만 Unity3D는 여러가지 면에서 iOS를 더 사랑하는 것 같습니다.

(푸시 지원 해주는 것만 봐도...) 간략한 예제를 통해서 어떤 식으로 쓰이게 되는지 알아보도록 하겠습니다.

 

 

1) OnApplicationPause

 

bool bPaused = false;  // 어플리케이션이 내려진 상태인지 아닌지의 스테이트를 저장하기 위한 변수

 

void OnApplicationPause(bool pause)

{

  if (pause)

  {

    bPaused = true;

    // todo : 어플리케이션을 내리는 순간에 처리할 행동들 /

  }

  else

  {

    if (bPaused)

    {

      bPaused = false;

      //todo : 내려놓은 어플리케이션을 다시 올리는 순간에 처리할 행동들 

    }

  }

 

 

2) OnApplicationQuit

 

void OnApplicationQuit()

{

  // todo : 어플리케이션을 종료하는 순간에 처리할 행동들

}



출처] [Unity3D] 어플을 내렸을때, 어플을 종료할때의 처리|작성자 베르제


반응형

'Unity3D > Script' 카테고리의 다른 글

ScreenWipe CrossFade with C#  (0) 2014.04.22
A simple cross fade shader for Unity  (0) 2014.04.22
Unity Singleton  (0) 2014.03.24
Platform Dependent Compilation  (0) 2014.03.11
Generic Based Singleton for MonoBehaviours完全版(?)  (0) 2014.03.05
Posted by blueasa
, |

개요

얼마 전 Justin Yoo님의 논리 연산자와 이진 연산자의 차이에 대한 블로그 포스트가 그 분의 의도와는 다르게 페이스북 ‘생활코딩’ 그룹에 콜로세움(?)을 세운 사건이 있었습니다. 저는 포함되지 않아서 아쉬운 내용이 조금 있었지만 많은 분들에게 도움이 될만한 글이며 크게 문제가 될 부분은 없다고 생각했는데 다른 의견을 가진 분들이 많이 있었습니다. 급기야 C#의 논리 연산자와 이진 연산자 내부 동작이 C/C++과 같지 않다는 오해까지 번져나갔습니다. C/C++에만 익숙한 분들이 겉모습이 비슷하긴 하지만 C#에서는 논리 연산자는 오직 System.Boolean 값 사이에만 사용 가능하며(연산자 사용자 정의는 논외로 하겠습니다. 일이 너무 커져요…) 조건식 결과 역시 System.Boolean 형식만 가능함을 알지 못했기 때문입니다. 마찬가지로 C#만 경험한 분들은 C/C++에서 if 구문과 조건부 삼항 연산자(?:)에 다양한 형식의 식이 사용된다는 점을 몰랐겠죠.

그리고 2주 쯤 전에 회사에서 코드 리뷰를 할 때 동료 사원 한 분이 플래그 열거형의 필드 값을 10진수가 아닌 16진수를 사용해 정의한 이유를 물어보셨는데 당시 시간 여건 상(점심시간이 다가오고 있었어요!) 충분한 설명을 해 드리지 못했습니다. 그래서 해당 내용과 Justin Yoo님의 포스트에 포함되지 않은 내용을 함께 정리해 봅니다. 언어는 C#을 기준으로 진행하지만 개념적인 부분은 다른 프로그래밍 언어에도 그대로 적용됩니다.

C#의 논리 연산자와 이진 연산자 내부 동작이 궁금하면 C++로 작성된 CLI 소스 코드를 확인하는 것을 권합니다.

이 글을 먼저 읽고 Justin Yoo님의 포스트를 읽으시면 더 이해가 쉬울 거라 생각됩니다.

1비트(bit) 데이터

Flags를 말 그대로 풀이하면 여러 개의 깃발입니다. 프로그래밍에서 깃발은 올려진 상태 또는 내려진 상태를 나타내는 데이터를 의미합니다. 다시 말해 0 또는 1, 참 또는 거짓, 예 또는 아니오 등의 상태를 표현하기 위해 사용됩니다. 서로 다른 두 개의 상태를 표현하기 위해 컴퓨터는 0 또는 1을 나타내는 한 개의 비트를 사용합니다. 일반적으로 컴퓨터가 데이터를 처리하는 최소 단위는 8개의 비트로 이루어진 바이트(byte)입니다. 그리고 매우 자주 사용되는 자료형인 System.Int32의 크기는 4바이트, 즉 32비트입니다. 32비트 공간에는 1개의 32비트 크기의(도메인에 정의되는) 정보를 저장할 수 있습니다. 16비트 크기의 정보는 2개를, 8비트 크기의 정보는 4개를 저장할 수 있지요. 마찬가지로 1비트 크기의 정보는 32개를 저장할 수 있습니다.

1
2
3
16 x  2 ++++ ++++  ++++ ++++  ---- ----  ---- ----
 8 x  4 ++++ ++++  ---- ----  ++++ ++++  ---- ----
 1 x 32 +-+- +-+-  +-+- +-+-  +-+- +-+-  +-+- +-+-

16진수

정수 데이터의 각 비트 값을 표현하는 데에는 10진수보다는 16진수가 더 다루기 쉽습니다. 이유를 설명하기 전에 16비트 데이터의 모든 비트 값을 10진수와 16진수로 나타낸 표를 먼저 확인하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
                        Dec     Hex
------------------- ------- -------
0000 0000 0000 0001       1  0x0001
0000 0000 0000 0010       2  0x0002
0000 0000 0000 0100       4  0x0004
0000 0000 0000 1000       8  0x0008
 
0000 0000 0001 0000      16  0x0010
0000 0000 0010 0000      32  0x0020
0000 0000 0100 0000      64  0x0040
0000 0000 1000 0000     128  0x0080
 
0000 0001 0000 0000     256  0x0100
0000 0010 0000 0000     512  0x0200
0000 0100 0000 0000    1024  0x0400
0000 1000 0000 0000    2048  0x0800
 
0001 0000 0000 0000    4096  0x1000
0010 0000 0000 0000    8198  0x2000
0100 0000 0000 0000   16384  0x4000
1000 0000 0000 0000   32768  0x8000

10진수의 경우에는 별다른 패턴이 없지만 16진수는 4개 비트 마다 1, 2, 4, 8이 자릿수가 변경되며 반복되는 것을 볼 수 있습니다. 8진수를 사용해도 1, 2, 4가 반복되지만 3개 비트 단위로 반복되는 것보다 4개 단위로 반복되는 것이 8비트, 16비트, 32비트, 64비트 데이터를 표현하기에 좀 더 편리합니다. 그래서 4비트가 넘어가는 플래그 데이터를 정의할 때 16진수가 주로 사용됩니다.

이진 연산

플래그 데이터를 다룰 때에는 산술 연산이 아닌 이진 연산을 사용합니다. 이진 연산을 이용해 플래그를 조합하거나 제거하고 데이터에 특정 플래그가 포함되어 있는지 검사합니다.

이진 OR 연산

플래그 데이터를 조합하는 데에 이진 | 연산자를 사용합니다. 이진 OR 연산은 두 개의 데이터에 대해 각 비트 별로 논리합 연산을 수행합니다. 두 비트 중 하나 이상의 값이 1이면 결과 비트는 1이고 두 비트 모두 0이면 결과 비트는 0입니다. 이진 OR 연산을 사용해 어떻게 플래그 데이터를 조합하는지 살펴봅니다.

1
2
3
4
5
6
7
8
var a = 1;     // 1(0001)
var b = 2;     // 2(0010)
 
var c = a | b; // 3(0011)
var d = a + b; // 3(0011)
 
var e = a | c; // 3(0011)
var f = a + c; // 4(0100)

위 코드를 보면 a와 b는 중복되는 비트가 없는데 이런 경우는 | 연산 결과는 + 연산 결과와 같습니다. 그래서 c와 d는 값이 같습니다. 하지만 중복되는 비트가 있으면 두 연산 결과는 같지 않습니다. e의 경우 a가 가진 비트 값과 c가 가진 비트 값이 모두 유지되어 있지만 f는 두 개의 비트가 사라지고 하나의 비트가 생겼났습니다.

이진 AND 연산

데이터에 특정 플래그가 포함되어 있는지 검사하는 데에 & 연산자를 사용합니다. 이진 AND 연산은 두 개의 데이터를 각 비트 별로 논리곱 연산을 수행합니다. 두 비트 모두 1이면 결과 비트는 1이고 둘 중 하나 이상의 비트가 0이면 결과 비트는 0입니다. 이진 AND 연산을 사용해 플래그 포함 여부를 검사하는 방법을 살펴봅니다.

1
2
3
4
5
6
7
8
9
10
11
var a = 1;                // 1(0001)
var b = 2;                // 2(0010)
var c = 4;                // 4(0100)
 
var d = a | c;            // 5(0101)
 
var e = d & a;            // 1(0001)
var f = d & b;            // 0(0000)
 
bool hasA = (d & a) == a; // True
bool hasB = (d & b) == b; // False

abc는 서로 다른 비트 값을 가지는 플래그들이고 d는 a와 c의 조합입니다. 이 때 d가 특정 플래그를 포함하는지 여부를 알아보려면 대상 플래그와 논리곱 연산을 수행한 결과가 해당 플래그와 같은지 검사하면 됩니다.

이진 배타적 OR 연산

이진 배타적 OR 연산을 사용하면 데이터에서 특정 플래그를 제거할 수 있습니다. 이진 배타적 OR 연산은 두 개의 데이터에 대해 각 비트 별로 배타적 논리합 연산을 수행합니다. 두 비트의 값이 다르면 결과 비트는 1이고 두 비트의 값이 같으면 결과 비트는 0입니다. 아래 코드는 이진 배타적 OR 연산을 사용해 데이터에서 특정 플래그를 제거하는 방법을 보여줍니다.

1
2
3
4
5
6
7
var a = 1;           // 1(0001)
var b = 2;           // 2(0010)
var c = 4;           // 4(0100)
 
var d = a | b | c;   // 7(0111)
 
var e = (d ^ b) & d; // 5(0101)

d는 abc 플래그가 조합된 값입니다. d와 b의 이진 배타적 OR 연산을 수행한 결과와 d의 논리곱 연산을 수행하면 d에서 b 플래그를 제거한 값을 얻을 수 있습니다. 이때 주의할 것은 마지막 논리곱 연산을 빠뜨리면 안된다는 점입니다. 위 코드의 경우는 b가 가진 모든 비트를 d가 포함하고 있기 때문에 논리곱 연산 전후 값이 같지만 만약 d가 가지지 않은 비트를 가진 데이터(예를 들어 1010 비트를 가진 데이터)의 플래그들을 d에서 제거하려할 경우 논리곱 연산을 생략하면 잘못된 값을 얻게됩니다.

이진 보수 연산

이진 보수 연산을 사용해도 데이터에서 특정 플래그를 제거할 수 있습니다. 이진 보수 연산은 앞에 설명된 연산자들과는 달리 이항 연산이 아닌 단항 연산이며 각 비트에 대해 0은 1로, 1은 0으로 변환된 값을 반환합니다.

1
2
3
4
5
6
7
var a = 1;         // 1(0001)
var b = 2;         // 2(0010)
var c = 4;         // 4(0100)
 
var d = a | b | c; // 7(0111)
 
var e = (d & ~b);  // 5(0101)

이진 배타적 OR 연산의 예제와 동일한 작업을 하는 코드입니다. 제거하려는 플래그를 가진 데이터의 이진 보수 연산 결과와 논리곱 연산을 수행하면 원본 데이터에서 특정 플래그를 삭제할 수 있습니다. 이진 배타적 OR 연산을 사용한 플래그 제거와 결과는 동일하지만 성능은 조금 더 높습니다.

System.FlagsAttribute

.NET Framework 코드에서 플래그를 정의할 때 System.FlagsAttribute 특성을 가진 열거형(enum)을 사용합니다. System.FlagsAttribute 특성은 열거형의 멤버가 플래그 데이터 또는 플래그 데이터의 조합을 나타냄을 의미합니다. 이런 경우 하나의 변수에 여러 개의 이진 데이터를 담기 때문에 열거형의 이름은 주로 복수형 명사가 됩니다.

다음은 추적 출력 대상을 지정하는 System.Diagnostics.TraceOptions 열거형 정의입니다.

1
2
3
4
5
6
7
8
9
10
[Flags]
public enum TraceOptions {
    None                  =    0,
    LogicalOperationStack = 0x01,
    DateTime              = 0x02,
    Timestamp             = 0x04,
    ProcessId             = 0x08,
    ThreadId              = 0x10,
    Callstack             = 0x20,
}

System.FlagsAttribute 특성을 가진 열거형 멤버의 값이 반드시 하나의 비트 플래그만 가질 필요는 없습니다. 예를 들어 All = 0x3F와 같은 멤버를 추가로 정의할 수 있습니다. 또 이런 여러 플래그를 포함하는 멤버를 정의할 때 이미 정의된 멤버를 조합하는 것도 가능합니다.

1
2
3
4
5
6
[Flags]
public enum TraceOptions {
    ...
    All = LogicalOperationStack | DateTime | Timestamp |
          ProcessId | ThreadId | Callstack
}

이 열거형에 대해 플래그 조합하고, 포함 여부를 검사하고, 그리고 특정 플래그를 제거하는 예제입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TraceOptions options = TraceOptions.DateTime;
 
Console.WriteLine(options); // DateTime
 
// Add ProcessId and Callstack
options |= (TraceOptions.ProcessId | TraceOptions.Callstack);
 
Console.WriteLine(options); // DateTime, ProcessId, Callstack
 
// Remove DateTime
options &= ~TraceOptions.DateTime;
 
Console.WriteLine(options); // ProcessId, Callstack
 
Console.WriteLine((options & TraceOptions.DateTime) == TraceOptions.DateTime); // False
Console.WriteLine(options.HasFlag(TraceOptions.ProcessId)); // True

위 코드의 마지막 줄에 사용된 HasFlag() 메서드는  .NET Framework 4.0에 등장한 메서드입니다. 논리곱 연산자를 사용한 플래그 검사와 비교할 때 성능이 낮은 반면 코드를 좀 더 직관적이고 간편하게 작성하도록 도와줍니다. 아래는 HasFlag() 메서드의 내부 구현입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[System.Security.SecuritySafeCritical]
public Boolean HasFlag(Enum flag) {
    if (flag == null)
        throw new ArgumentNullException("flag");
    Contract.EndContractBlock();
 
    if (!this.GetType().IsEquivalentTo(flag.GetType())) {
        throw new ArgumentException(Environment.GetResourceString("Argument_EnumTypeDoesNotMatch", flag.GetType(), this.GetType()));
    }
 
    return InternalHasFlag(flag);
}
 
[System.Security.SecurityCritical]
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private extern bool InternalHasFlag(Enum flags);

저는 플래그 검사가 짧은 시간에 반복적으로 아주 많이 수행되지 않는다면 HasFlag() 메서드를 사용해 가독성 높은 코드를 작성하는 편을 선호합니다.

결론

이진 연산을 이해하고 플래그 데이터를 적절히 사용하면 메모리 효율을 높이고 메서드 매개 변수를 줄여주는 등 간결한 코드 작성에 도움을 줍니다. 지금보다 메모리가 많이 귀하던(물론 지금도 귀하죠!) 시절에는 하나의 비트로 표현될 수 있는 여러 개의 데이터를 각각 정수형 변수에 저장하는 것은 더더욱 피해야 할 과소비였습니다.



반응형

'Programming > C#' 카테고리의 다른 글

Standard Numeric Format Strings  (0) 2014.05.13
숫자 3자리마다 콤마(,) 찍기  (0) 2014.05.13
How to create Excel file in C#(Source)  (0) 2014.03.26
C# Excel Tutorial  (0) 2014.03.26
C# 에서 Excel 로 데이터 기록 및 읽기 [OleDB]  (46) 2014.03.25
Posted by blueasa
, |