'분류 전체보기'에 해당되는 글 495건
- 2014.01.16 [펌] 유니티 엔진 - 오브젝트 풀 시스템
- 2014.01.16 [펌] 유니티 엔진 팁 - 로딩시간 최적화에 대해서
- 2014.01.16 [펌] 유니티 엔진 팁 - 비동기 로딩 흉내내기
- 2014.01.16 [펌] 유니티 엔진 팁 - GUI시스템
- 2014.01.16 [디버깅] Cocos2dx 이클립에서 안드로이드 네이티브 디버깅
- 2014.01.16 열혈강의 cocos2d-x
- 2014.01.15 c언어 공부할때 참고 사이트
- 2014.01.15 관련 자료
- 2014.01.15 안드로이드 NDK 책
- 2014.01.14 [Box2D] Box2D 기본 예제 디버그 모드 및 스프라이트 생성
출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=280
·미리보기 | 소스복사·
유니티 엔진에서 사용 할 수 있는 오브젝트 풀 스크립트 입니다. c#으로 코딩했기 때문에 꼭 유니티가 아닌 프로젝트에서도 사용 할 수 있습니다. 모바일 게임을 만들다 보니 실시간으로 객체를 생성하는것이 굉장한 부담으로 다가오더군요. 그래서 이런 풀 시스템을 사용하여 미리 적당한 개수를 만들어 놓고 꺼내오고, 넣어주고 하는 방법을 사용했습니다. 이걸 쓰기 전에는 몬스터가 나올때 마다 딜레이가 생겼었는데, 풀을 쓰고나니 처음에 로딩시간이 약간 더 걸린다는 단점이 있지만, 게임 플레이중에는 아주 쾌적하게 돌아가더군요.^_^) 더불어 메모리 사용량도 예측 가능하게 됐죠. 이 시스템을 사용하는 이유가 객체의 재사용 측면도 있지만, 그것보다는 객체 생성/해제시 딜레이를 없애준다는 점이 더 큰 성과인것 같습니다. 예제가 들어있는 패키지 파일은 첨부파일로 올렸습니다. 집에서 시간날때 만든것이고요, 소스코드 수정/배포/사용등은 사용하는 사람의 자유입니다. 시간없을땐 그냥 휙휙 긁어다가 사용해서 야근을 줄이세요~ㅎㅎ 더 좋은 방법이 있으면 댓글로 조언 남겨주시면 감사하겠습니다. |
'잡다한것들전부 > 팁' 카테고리의 다른 글
| [펌] 유니티 안드로이드 빌링 api3 적용 팁입니다. (0) | 2014.01.16 |
|---|---|
| [펌] 유니티 엔진 팁 - 광고 모듈 붙이기 (0) | 2014.01.16 |
| [펌] 유니티 엔진 - 오브젝트 풀 시스템 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - 로딩시간 최적화에 대해서 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - 비동기 로딩 흉내내기 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - GUI시스템 (0) | 2014.01.16 |
'잡다한것들전부 > 팁' 카테고리의 다른 글
| [펌] 유니티 엔진 팁 - 광고 모듈 붙이기 (0) | 2014.01.16 |
|---|---|
| [펌] 유니티 엔진 - 오브젝트 풀 시스템 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - 로딩시간 최적화에 대해서 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - 비동기 로딩 흉내내기 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - GUI시스템 (0) | 2014.01.16 |
| [함수] 유니티 함수 Vector3.Lerp에 대해서 알아보자. (0) | 2014.01.12 |
[유니티 엔진 팁 - 비동기 로딩 흉내내기] 비동기 로딩 흉내내기. - 유니티에서는 멀티쓰레드 로딩을 지원하지 않습니다. Resources.Load같은 유니티 함수들은 메인쓰레드에서만 작동하게 되어 있다고 하네요. - 비동기 로딩을 흉내내는 방법은 몇가지가 있는데 1) assetbundle 시스템을 이용하는 방법, 2) scene의 background로딩 기능을 이용하는 방법, 3) 코루틴을 사용하여 비슷하게 흉내내는 방법등이 있습니다. 1) assetbundle은 리소스가 바뀔때마다 매번 만들어 줘야 하는 번거로움이 있습니다. 2) scene의 background로딩 기능은 메뉴얼 대로 했는데도 제대로 작동하지 않는것 같더군요. background로딩을 걸어놓고 다른 scene의 OnGUI등에서 매프레임마다 변수를 출력해봤는데 자연스럽게 랜더링 되지 않고 중간중간 블럭이 걸렸습니다. 3) 코루틴을 사용하여 로딩하는 방식 : 한번에 로드하는 오브젝트의 크기를 최소화 하여 잘게 나눈 후 "로딩 -> yield -> 로딩 -> yield" 를 반복하여 처리하였습니다. - yield를 할때 화면 랜더링이 한번 이루어지기 때문에 비동기 로딩처럼 보일 수가 있죠. - 테스트결과 랜더링이 블럭되는 시간이 짧기 때문에 자연스러움은 있지만, 전체적인 로딩시간은 오히려 더 길어지는 문제가 발생하였습니다! 아마도 화면 랜더링을 하는 시간 때문인지 yield후 다음 오브젝트 로딩까지의 딜레이가 조금씩 생기더군요. 이런것들이 여러개 모이니 전체적인 로딩시간이 몇초정도 더 길어지게 되었습니다. (PC에선 몇초가 큰 의미 없겠지만 모바일에선 길게 느껴지더군요.ㅠ_ㅠ) 결국 GUI, sound, object등 큰 줄기로만 구분하여 중간중간 로딩 진행상황만 표시해주는것으로 처리하였는데, 이렇게만 해줘도 중간에 무한 대기 상태로 빠지지 않기 때문에 유저입장에서 볼 때 로딩이 약간 빨라진듯한 느낌이 들게 됩니다. |
'잡다한것들전부 > 팁' 카테고리의 다른 글
| [펌] 유니티 엔진 - 오브젝트 풀 시스템 (0) | 2014.01.16 |
|---|---|
| [펌] 유니티 엔진 팁 - 로딩시간 최적화에 대해서 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - 비동기 로딩 흉내내기 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - GUI시스템 (0) | 2014.01.16 |
| [함수] 유니티 함수 Vector3.Lerp에 대해서 알아보자. (0) | 2014.01.12 |
| 유니티 Vector3 를 상수 선언 하고 싶을때. (0) | 2014.01.09 |
이번에 유니티 엔진으로 아이폰/안드로이드 게임을 개발하면서 겪었던 문제점 및 해결방법들 입니다. 특별한게 있는건 아니지만 공유하는 측면에서 올려보겠습니다~ 1. 유니티 GUI시스템. 유니티를 쓰는 사람들의 말을 들어보면 Unity3D의 기본적인 GUI는 가급적 사용하지 말것을 권장하고 있습니다. 빈 OnGUI함수조차도 성능을 저하시킨다고 하네요. 저희 프로젝트에서는 EzGUI라는 써드파티 라이브러리를 구입하여 사용했습니다. 장점으로는... - UI이미지들을 텍스쳐 아틀라스(atlas)로 만들어서 좌표를 따다 쓰는 방식이라, 한번의 drawcall로 모든 UI가 그려지기 때문에 성능이 좋음. - 디자이너가 작업시 위지윅 방식이 가능함(에디터내에서 직접 보면서 배치할 수 있음). 단점은... - 스킨시스템은 지원 안됨(모서리만 따서 늘려쓴다던가 하는 방식). - atlas(아틀라스:텍스쳐들을 모아놓은 하나의 큰 텍스쳐)를 만들때 이미지 배치가 수시로 바뀜. 어차피 uv좌표를 직접 입력하진 않기 때문에 문제는 없지만 웬지 개운하지 않음. 특시 prefab과 연결시켜 놓으면 값이 꼬이는 문제가 발생하여서 연결을 끊고 atlas를 만들어야 해서 번거로움이 심했음. (이 부분은 저희가 잘못 사용한것일지도 모르겠습니다. 정식 강좌를 본것이 아니라 인터넷에서 그때그때 찾아 한 것이라^^) - 업데이트 소식이 없음. 디자이너와의 분업 측면 - 디자이너가 레이아웃을 잡고, prefab으로 만든 후 패키징 하여 프로그래머에게 전달하여 작업함. 큰 무리는 없었지만 Unity3D에디터에 캐시파일이 남아서 인지, 가끔 종료한 후 다시 열어줘야 새로운 내용이 적용되었음. - 공식 사이트나 포럼에서도 분업에 대한 정확한 메뉴얼을 찾지 못하여 이 방식이 올바른것인지는 애매하였음. - 공동작업에 대한 고려가 많이 부족하다는 느낌을 받음. 해상도 작업 - 기본적으로 여러 해상도에 대한 지원이 부족한듯 함. - 화면 크기가 바뀌었을때 이미지 스케일이 원하는 대로 나오지 않았기 때문에 직접 로직을 작성하였음. - 안드로이드에서 가장 많이 사용하는 480*800을 기준으로 이미지작업을 하고, 화면 세로 크기의 비율을 구해서 모든 UI오브젝트들의 스케일에 적용시켜주었음. - 일부UI 컨트롤에는 적용시키지 말아야 할 경우도 생김 (예를 들면 슬라이더바같은 경우 바와 knob으로 구성되는데 부모-자식 관계에 있다보니 스케일이 이중으로 적용되어서 의도한것과 다르게 나타났다. 따라서 이런 경우에는 자식 오브젝트들의 스케일 적용은 건너뛰는 루틴을 넣어야 했다). 폰트작업 - BMFont라는 툴로 ttf파일에서 텍스쳐와 좌표값을 뽑아낸 뒤 불러다 쓰는 방식임. - 한글 입/출력은 잘 됨. - 폰트 색상 조절은 원하는 컬러의 material을 만들어서 사용하는 방식이며, 크기 조절은 오브젝트의 스케일값으로 조절이 가능함. * 다음프로젝트에는 NGUI를 사용할 예정입니다~ |
'잡다한것들전부 > 팁' 카테고리의 다른 글
| [펌] 유니티 엔진 팁 - 로딩시간 최적화에 대해서 (0) | 2014.01.16 |
|---|---|
| [펌] 유니티 엔진 팁 - 비동기 로딩 흉내내기 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - GUI시스템 (0) | 2014.01.16 |
| [함수] 유니티 함수 Vector3.Lerp에 대해서 알아보자. (0) | 2014.01.12 |
| 유니티 Vector3 를 상수 선언 하고 싶을때. (0) | 2014.01.09 |
| [펌][C# 강좌] 직접 만들어보는 메모리 풀 클래스 (0) | 2014.01.05 |
|
'잡다한것들전부 > 팁' 카테고리의 다른 글
| 공부하고 싶은 것들 정리.(구글킵) (0) | 2014.07.30 |
|---|---|
| [디버깅] Cocos2dx 이클립에서 안드로이드 네이티브 디버깅 (0) | 2014.01.16 |
| cocos2d-x 멀티 터치 처리하기 (0) | 2014.01.14 |
| autoRelease 및 retain() , release(), retainCount() (0) | 2014.01.13 |
| CCNode 및 CCArray 의 메모리 관리 (0) | 2014.01.13 |
| cocos2d-x multi-resolution (0) | 2014.01.13 |
1월 24 일날 출시
사면도움이 될듯
'보고싶은책' 카테고리의 다른 글
| 사고 싶은 책 (0) | 2014.08.21 |
|---|---|
| c# 기본서 추천(c# IN DEPTH) (0) | 2014.01.19 |
| 열혈강의 cocos2d-x (0) | 2014.01.16 |
| 안드로이드 NDK 책 (0) | 2014.01.15 |
| “Game Programming Gems 1권 – 3.3 A* 길찾기 알고리즘의 기초” (0) | 2014.01.14 |
| 프로그래머를 위한 책 (0) | 2014.01.13 |
http://www.soen.kr
'잡다한것들전부 > C, C++, C#' 카테고리의 다른 글
| c++ 책을 샀습니다. (0) | 2014.08.04 |
|---|---|
| c# 표준 코딩 규칙 (0) | 2014.07.24 |
| c언어 공부할때 참고 사이트 (0) | 2014.01.15 |
| [펌]C언어 자료구조 - 연결리스트(Linked List) (0) | 2014.01.13 |
| [펌] 단순연결리스트(Single Linked List) 예제 (0) | 2014.01.13 |
| c++에서 bool 형 값 true false 실수할 수 있는 부분 (0) | 2014.01.13 |
http://www.raywenderlich.com
'잡다한것들전부 > 2D 관련 자료' 카테고리의 다른 글
| 유니티 2디 간단 사용영상 (0) | 2014.01.22 |
|---|---|
| 관련 자료 (0) | 2014.01.15 |
안드로이드 NDK 네이티브 프로그래밍(위키북스 임베디드 & 모바일 시리즈)
유일한 국내 번역 안드로이드 NDK 책?
'보고싶은책' 카테고리의 다른 글
| c# 기본서 추천(c# IN DEPTH) (0) | 2014.01.19 |
|---|---|
| 열혈강의 cocos2d-x (0) | 2014.01.16 |
| 안드로이드 NDK 책 (0) | 2014.01.15 |
| “Game Programming Gems 1권 – 3.3 A* 길찾기 알고리즘의 기초” (0) | 2014.01.14 |
| 프로그래머를 위한 책 (0) | 2014.01.13 |
| Code Complete (0) | 2014.01.13 |
전체소스
#ifndef __CH4_BASICSETUP__
#define __CH4_BASICSETUP__
#include "cocos2d.h"
#include "Recipe.h"
#include "Box2D/Box2D.h"
#include <GLES-Render.h>
//32 픽셀 = 1미터
#define PTM_RATIO 32
class Ch4_BasicSetup : public Recipe
{
private:
b2World* world;
GLESDebugDraw *m_debugDraw;
public:
virtual CCLayer* runRecipe();
void addLevelBoundaries();
void step(float dt);
virtual void draw();
void addNewSpriteWithCoords(CCPoint p);
void ccTouchesEnded(CCSet * touches, CCEvent * event);
};
CCLayer* Ch4_BasicSetup::runRecipe()
{
Recipe::runRecipe();
this->setTouchEnabled(true);
/* Box2D 초기화 */
// 중력의 방향을 결정한다.
b2Vec2 gravity = b2Vec2(0.0f, -30.0f);
// 월드를 생성한다.
world = new b2World(gravity);
world->SetAllowSleeping(true);
world->SetContinuousPhysics(true);
//디버그 드로잉 초기화
m_debugDraw = new GLESDebugDraw( PTM_RATIO );
world->SetDebugDraw(m_debugDraw);
uint32 flags = 0;
flags += b2Draw::e_shapeBit;
m_debugDraw->SetFlags(flags);
//레벨 경계 생성
this->addLevelBoundaries();
//블록생성을 위한 배치 노드 생성
CCSpriteBatchNode *batch = CCSpriteBatchNode::create("blocks.png", 150);
this->addChild(batch, 0, 0);
//새로운 블록 추가
CCSize screenSize = CCDirector::sharedDirector()->getWinSize();
this->addNewSpriteWithCoords(ccp(screenSize.width/2, screenSize.height/2));
//스텝 메서드 스케줄링
this->schedule(schedule_selector(Ch4_BasicSetup::step));
return this;
}
//양쪽 사각형 영역 설정
void Ch4_BasicSetup::addLevelBoundaries()
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
// 가장자리(테두리)를 지정해 공간(Ground Box)을 만든다.
// 바디데프에 좌표를 설정한다.
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0,0);
// 월드에 바디데프의 정보(좌표)로 바디를 만든다.
b2Body *groundBody = world->CreateBody(&groundBodyDef);
// 가장자리(테두리) 경계선을 그릴 수 있는 모양의 객체를 만든다.
b2EdgeShape groundEdge;
b2FixtureDef boxShapeDef;
boxShapeDef.shape = &groundEdge;
// 에지 모양의 객체에 Set(점1 , 점2)으로 선을 만든다.
// 그리고 바디(groundBody)에 쉐이프(groundEdge)를 고정시킨다.
// 아래쪽
groundEdge.Set(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0));
groundBody->CreateFixture(&boxShapeDef);
// 왼쪽
groundEdge.Set(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO));
groundBody->CreateFixture(&boxShapeDef);
// 위쪽
groundEdge.Set(b2Vec2(0, winSize.height/PTM_RATIO),
b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO));
groundBody->CreateFixture(&boxShapeDef);
// 오른쪽
groundEdge.Set(b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO),
b2Vec2(winSize.width/PTM_RATIO, 0));
groundBody->CreateFixture(&boxShapeDef);
}
//물리적 위치를 이용해서 그래픽 위치를 갱신
void Ch4_BasicSetup::step( float dt )
{
int32 velocityIterations = 8;
int32 positionIterations = 3;
world->Step(dt, velocityIterations, positionIterations);
for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())
{
if (b->GetUserData() != NULL) {
CCSprite *obj = (CCSprite*)b->GetUserData();
obj->setPosition( CCPointMake( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO) );
obj->setRotation( -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()) );
}
}
}
/* 디버그 그리기 데이터 */
void Ch4_BasicSetup::draw()
{
//텍스쳐 비활성화
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
world->DrawDebugData();
//텍스쳐 재활성화
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}
/* 텍스처 입힌 블록을 추가합니다. */
void Ch4_BasicSetup::addNewSpriteWithCoords( CCPoint p )
{
CCSpriteBatchNode *batch = (CCSpriteBatchNode*) this->getChildByTag(0);
//랜덤하게 텍스쳐 처리된 블록을 생성
int idx = (CCRANDOM_0_1() > .5 ? 0:1);
int idy = (CCRANDOM_0_1() > .5 ? 0:1);
CCSprite *sprite = CCSprite::createWithTexture(batch->getTexture(), CCRectMake(32 * idx,32 * idy,32,32));
batch->addChild(sprite);
sprite->setPosition(ccp( p.x, p.y));
//물체 정의 및 생성
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
bodyDef.userData = sprite;
b2Body *body = world->CreateBody(&bodyDef);
//동적 본체를 위한 또다른 상자 모양 정의
b2PolygonShape dynamicBox;
dynamicBox.SetAsBox(.5f, .5f);//1m 상자의 중간 지점
//동적 물체 픽스쳐 정의.
b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.3f;
body->CreateFixture(&fixtureDef);
}
//클릭시 물체 추가 생성
void Ch4_BasicSetup::ccTouchesEnded( CCSet * touches, CCEvent * event )
{
//멀티터치 처리
CCSetIterator it = touches->begin();
CCTouch* touch;
for( int iTouchCount = 0; iTouchCount < touches->count(); iTouchCount++ )
{
touch = (CCTouch*)(*it);
CCPoint location = touch->getLocationInView();
location = CCDirector::sharedDirector()->convertToGL(location);
this->addNewSpriteWithCoords(location);
it++;
}
}
#endif
'잡다한것들전부 > cookbook관련' 카테고리의 다른 글
| [Box2D] Box2D 기본 예제 디버그 모드 및 스프라이트 생성 (0) | 2014.01.14 |
|---|---|
| Box2d 사용시(처음에 시작시 체크하지 않았을시) (0) | 2014.01.14 |
gameobjectpool.unitypackage
RecipeCollection01.zip

