스터디/Unity 2018. 11. 3. 21:38

[Unity] 작업노트 - Playmaker 연습하기 2 - Game Artz님 강좌


한글 유튜브 강의를 살짝 들어봄

https://www.youtube.com/watch?v=gA1Yxkq_uQc (Game Artz님) unity playmaker 02

https://www.youtube.com/watch?v=T36lEjrS2cQ unity playmaker 03


- 플레이메이커 설치후 중요 셋팅

- 버튼 눌러서 캐릭터 조작하기


유니티 메뉴 Playmaker > Addons>> download addons

Ecosystem browser 추가 설치해야 기타 플러그인을 사용할 있음


UI> Canvas 생성

안에 UI > button 생성

버튼에 Add FSM



버튼을 눌렀을때 오른쪽으로 이동하도록 만들어보겠음

Ecosystem browser 에서 U gui proxy full 다운로드


그러면 이제 state 에서 transition


반드시 add script 해야함

Play maker u component proxy (script) 추가!



키보드로 캐릭터가 4방향으로 로 움직이도록 했고, 버튼 누르면 구 쪽으로 달려감

Smoothy Look At, Move Towards 액션 사용




카메라가 캐릭터 쫓아가도록 main camera 오브젝트를 player캐릭터 넣음

근데 그러면 귀여운 앞모습이 보이질 않잖아..흑




카메라에 FSM 추가해서 Smoothy Follow Action 추가하면 카메라가 오브젝트를 자연스럽게 쫓아가고 회전함





https://www.youtube.com/watch?v=XRUUGhWB1Wg unity playmaker 04

큐브 위에 마우스 클릭하면 큐브가 사라지면서 다음 큐브가 나타나는 예제







다음 단계로 버튼을 누르면 캐릭터가 다음에 나타나는 큐브를 바라보도록 응용 해보았다

그리고 Cube를 누르면 Cube쪽으로 쫓아가고, sphere를 누르면 그쪽으로 쫓아감

근데 Sphere를 누르면 state가 finish 되면서 cube를 바라보는 state로 자동 넘어가서 획 돌아가버리는 느낌.

이건 어떻게 해결해야할까? finish가 되면서 cube를 바라보지 않는 state를 캐릭터에 하나 더 추가해야하나?

암튼 현재는 일일히 event 1 2 3 4 만들어서 큐브1 클릭하면 큐브 2 액티베이트 되면서 이벤트 1 보내고 rotateCube라는 글로벌 게임오브젝트에 Cube2를 넣는다. 

다음 cube2 클릭하면 cube3 액티베이트, 이벤트 2 보내고 rotateCube Cube 3 넣고.. 이렇게 동일하게 반복하게 된다. 

 이때 event 1 2 3 4 따로 보내지 않고 nextcube라는 이벤트를 만들어서 공용화하고, 다음에 액티베이트 되는 큐브를 글로벌게임오브젝트에 넣도록 공용화(함수화?)하고 싶은데 어떻게 하는지 잘 모르겠다. playmaker의 액션 종류에 대해서 좀더 공부해야할듯


getter/setter 구분해서 쓰는거랑 gameobject랑 FSMgameobject랑 변수로만 만든 gameobject랑 너무 헷갈림 0ㅁ0...


그래도 로직을 만들면서 헤매기는 하는데 연두색 선으로 state의 이동에 대한 디버그를 하면서 할수있어서 좀 다행이다


텍스트 코딩으로 했으면 내 실력으로는 어림도 없는 구성이었을듯!


playmaker 만세!








스터디/Unity 2018. 10. 29. 01:52

[Unity] 작업노트 - Playmaker again!


11월의 프로젝트 가제 <Hidden> 유니티 플레이메이커를 적극 활용하기로 했다.


가능한 범위까지만 기능을 최소화해서 11 24일경 itch.io 프로토타이핑을 제출하는 것이 목표이고, 이후에 조금씩 업데이트를 예정.

근데 실제 게임 개발을 혼자서 해본적은 없기 때문에 내가 어디까지 가능한지를 수가 없는 것이 문제.

일단은 플레이메이커만 가지고 코딩없이 게임 개발을 완료한 사례들이 있다고 해서 믿고 가보기로 했다.


2016 9월에 에셋스토어에서 Playmaker 65->45달러로 할인해서 샀고, 기본 개념 공부 포스팅 http://binsworld.tistory.com/196 했는데 3 지났는데 나는 다시 반복중이고.....ㅠㅠ

에셋스토어에는 여전히 65->45달러 할인중이라고 적혀있고?ㅋㅋ

그래도 지난 3년간 유튜브 컨텐츠는 늘어서 다행.


우선은 블로그, 유튜브, 슬라이드쉐어 링크를 모았다



https://www.slideshare.net/agebreak/play-maker

[데브루키] 유니티와 Play maker 이용한 쉽고 빠른 게임 개발



 슬라이드 쉐어로 대강 플레이메이커 핵심 구성을 살펴봄



FSM

State: 상태

정해진 절차에 따라 액션을 반복적으로 수행하는 것이 기계 : Machine

플로우 차트처럼 제한된 상태로써 논리 전개


한 게임오브젝트 내에 복수개의 FSM 생성 가능 (레이어처럼 활용)

예) FSM1 : 캐릭터의 상태 변화 제어 (축소, 확대, 변신, 무적). -> FSM 2 : 행동 변화 제어 (이동, 달리기, 점프, 공격)


STATE

FSM에서 하나의 상태를 표현하는 객체

오브젝트의 상태를 정의한다 : IDLE, 이동, 점프, 공격, 죽음..

상태에는 action이 추가된다. 

상태에 따라 액션이 없을수도 있다

설정된 EVENT 가 발생하면, 다른 State로 전의 (Transition)한다


TRANSITION : state 간의 이동. Transition에 지정된 eventr가 발생했을때 다음 state로 넘어간다


ACTION

STATE에서 수행할 하나의 작업을 표현하는 객체 

플레이메이커에서 여러 액션 제공 : 텍스쳐 변경, 마우스클릭, 오브젝트 이동, 회전 등


EVENT

스테이트에서 정의한 이벤트가 발생하면, 이벤트에 연결된 STATE 전이된다.


VARIABLE

오브젝트를 체크할때는 GameObject 변수

위치와 방향들 - Vector 변수

외에 String Int Texture

FSM 아닌 곳에도 객체 참조하여 얻을 있음


 hutong에서 쇼케이스에 소개된 fsm 예시들을 살펴보면 어떻게 활용할수있는지 감이 온다

https://hutonggames.com/showcase.html





그리고 유데미에서 플레이메이커 강좌를 구매했다. 유튜브에서도 강좌들을 찾을수 있지만 아무래도 유료가 퀄리티가 좋고, 예제 파일이 제공되고, 궁금한걸 튜터에게 직접 물어볼수있다는 장점이 있다.

유튜브는 강좌가 많아서 대표적으로 한글 강의 하나, 영어는 제작사에서 만든걸 들을 예정


https://www.udemy.com/make-your-own-fps-without-code-using-unity-playmaker/

13000

10시간


https://www.udemy.com/cant-code-who-cares-make-games-anyway/

13000

15시간


여러 강좌중 어떤걸 해야하는지 비교하던 와중에 유데미에서 둘을 번들로 묶어서 22000 어때?라고 물어서 그냥 둘다 사버림


25시간을 들을수 있을까?..





플레이메이커를 사용하기 위해서는 유한상태기계 FSM 방식을 이해해야하는데

 http://smartacademy.tistory.com/39 자판기를 예시로 설명한 이 포스팅이 처음 이해하는데 많은 도움이 되었다

물론, 직접 플레이메이커로 예제를 구성해보는 것이 제일 빠른 도움이 된다.



http://unityindepth.tistory.com/25 

http://unityindepth.tistory.com/26

http://unityindepth.tistory.com/27

http://unityindepth.tistory.com/47

http://unityindepth.tistory.com/48

http://unityindepth.tistory.com/49


여기에 외국의 아티클을 한글로 번역한 유한상태기계에 대한 설명이 좀더 자세하게 되어있긴한데 텍스트코딩 기반 유한상태기계 방식이어서 어렵다..(도망)




한글 블로그 강좌 환쟁이님

https://slee16.blog.me/220243746501  플레이메이커 기초#1 - 기본 조작 및 이해

이렇게 상태의 흐름을 바로 볼수있어서 너무 좋다


잠시 건너뛰어서 여기서도 기초 실습 참고

http://smartacademy.tistory.com/42 비주얼 프로그래밍이란? Playmaker 사용해보기

http://smartacademy.tistory.com/44 비주얼 프로그래밍이란? - State 구성하기




https://slee16.blog.me/220267175122 플레이메이커 기초#2 - 변수의 활용 응용
https://blog.naver.com/slee16/220316046075  플레이메이커 기초#3 - 변수의 전달 및 연산
Get FSM Int : 다른 FSM에 저장된 Int 변수 불러오기
Int operator : 두개의 int 변수 연산 후 결과 저장
Send Event

UI필드로 변수등록 수정하는거랑, Inspector 체크하면 public 변수인것처럼 인스펙터에 뜨는것, 카테고리 지정하면 폴더처럼 쓸수있는거 너무 좋군 



3강에서 slee16님 포스팅 잠시 캡쳐

그리고나서 Send Event는 E_Hit



여기에 GUI_E_HP 라는 HP 표시를 하나 넣고, E_HP_changed라는 이벤트를 하나 더 만들어서 Enemy FSM-HP down state에서 attack 받으면 HP가 깎일때 GUI에 E_HP_changed라는 이벤트를 동시에 보내도록 하였다.



GUI에서 그 이벤트를 받으면 Enemy_HP를 다시 받아온다 (근데 GUI_HP에만 get Fsm Int를 넣는게 맞는지, GUI_HP와 HP updated 둘다에 넣는게 맞는지 모르겠네, 일단 둘다 됨)




그리하여 버튼 누르면 Attack하여 enemy HP 낮추는 것까지 GIF









스터디/Unity 2018. 10. 13. 15:23

[Unity] 작업노트 - 유니티 유료 에셋을 백업해보자


OOV 게임 프로젝트 종료로 유료 에셋 공유 계정도 클로징 예정이라 다시한번 깨끗한 프로젝트 파일에 백업하는 작업을 하고 있다. 


개발자님이 지난 데모버젼까지 오류 수정과 주석 작업을 해주시면 그걸로 다시한번 파일 정리를 하고나서, 11월 전시용 작업 진행할 예정


-진행하던 프로젝트 파일에서 export package 해서 공유하는 경우 가끔 안되서 에셋스토어에서 새로 받아야하는 경우도 있고해서 백업해둠 (아래 프로젝트 전체 익스포트하기 문제 발견)


-에디터 버젼 업데이트나 에셋 버젼 업데이트가 있는 경우 한번씩 다시 받아줘야하는데 이부분은 계정이 없어져서 더이상 지원이 어려울듯, 심각한 문제가 발생하는 경우에 구매한 인보이스 pdf 보관해두고 개발자에게 직접 컨택해서 업데이트를 부탁해보자 (...)


- 에셋을 다운로드하고 임포트하는데도 시간이 엄청 오래걸림 


-에셋을 많이 받으면 프로젝트 용량이 커져서 (1)새 프로젝트 파일에 300메가+20메가 짜리 배경 에셋 두개 받았는데 프로젝트 파일 크기 1.6기가 2)마지막 개발버젼 폴더는 4기가 .......) 유티니에서 열기만 하는데도 너무 오래걸려서 분리해두는게 나을것 같았음.. 백그라운드/모델링/그래픽효과/개발플러그인으로 분리해서 보관해두면 좋을거 같지만 일단 구매순으로 3-4개 정도로


-좀더 찾아보니 에셋스토어에서 다운로드하면 공통으로 로컬에 저장되는 경로가 있었네. 아래 링크 참고


-팀즈 백업에서 궁금한점 : 구독을 해제했지만, 추후에 다시 같은 멤버로 등록하면 백업 파일과 히스토리가 남아있는가?




[에셋스토어 구입한 패키지 저장되는 경로]


에셋스토어에서 다운로드 - 임포트 하게 되는데 다운로드한 파일이 저장되는 곳으로 보여짐


Windows : \Users\accountName\AppData\Roaming\Unity\Asset Store

Mac : “open ~/Library/Unity/Asset Store”


-맥의 경우 라이브러리 폴더는 숨겨져있다. 접근 방법 http://macnews.tistory.com/203

-제일 간단하게는 Finder - 보기에서 옵션 키 누르면 “라이브러리”가 보임


-회사명 폴더로 되어있음 해당 폴더명이 패키지명과 다르니 주의요망!!

-에셋 폴더는 항상 라이브러리 폴더 (메타데이터와 연결 정보 담고있음) 와 함께 백업 (안그러면 재앙이)...

-프로젝트 폴더 내의 Assets 폴더 안에 파일을 붙여넣기 하면 프로젝트 뷰에서 알아서 불러와진다



에셋 패키지 (임포트, 익스포트)

https://docs.unity3d.com/kr/2017.4/Manual/AssetPackages.html


에셋 임포트 (폴더 복사)

https://docs.unity3d.com/kr/550/Manual/ImportingAssets.html



[유니티 프로젝트 전체 익스포트하기]


프로젝트 파일 자체도 유니티팀즈 구독이 해제 되기 때문에 한번더 백업해두었지만 팀즈 종료후에 익스포트 패키지 형태로 공유하게 되면 태그나 레이어 등의 프로젝트 세팅은 함께 익스포트 되지 않는다고 한다


https://www.ijemin.com/blog/%EC%9C%A0%EB%8B%88%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A0%84%EC%B2%B4-%EC%9D%B5%EC%8A%A4%ED%8F%AC%ED%8A%B8%ED%95%98%EA%B8%B0/


유니티에 기본 내장된 패키지 제작툴(Assets > Export Package)은 태그와 레이어, 빌드 세팅 등의 프로젝트 세팅은 함께 익스포트 해주지 않는다.

라이트 유저에게는 프로젝트 세팅까지 같이 익스포트하는게 오버킬이라 생각하는 듯.

프로젝트 세팅까지 모두 익스포트하고 싶으면 AssetDatabase.ExportPackage 에 대한 내용을 참조하여 커스텀 메뉴를 만들면 된다.





백업 와중에 하드 용량이 다찼다

유니티도 안돌아가고 일반 사용시에도 너무 느려서 조만간 업그레이드 예정



*CPU i5 -> i7

*SSD 삼성 pro 1T?2T?
분리한 HDD 외장케이스 씌워서 재활용 (1-2만원 추가)

타임 머신에 백업부터..


스터디/Unity 2018. 10. 2. 14:45

[Unity] ‘유니티로 만나는 애니메이션의 세계!’ - 제작 기법 세미나

https://onoffmix.com/event/153833  신청링크


유니티 코리아(대표 김인숙)가 유니티로 제작된 다양한 영화 및 애니메이션 사례를 선보이는 세미나인 ‘유니티로 만나는 애니메이션의 세계!’를 오는 10월 22일 최초로 개최한다.

유니티는 매번 새로운 버전을 선보일 때마다 향상된 실시간 렌더링 기능과 그래픽 처리 기술을 선보이며 영화 및 애니메이션 업계에서 활발히 사용되고 있다. 영화 '디스트릭트 9'으로 유명한 닐 블롬캠프(Neill Blomkamp) 감독 및 그가 창립한 오츠(OATS) 스튜디오가 제작에 참여한 유니티의 오리지널 영상 시리즈 ‘아담(Adam)’을 비롯, 디즈니가 제작한 TV 애니메이션 ‘베이맥스 드림즈(Baymax Dreams), ‘블레이드 러너 2049(Blade Runner 2049)’, ‘레디 플레이어 원(Ready Player One)’, ‘정글북(The Jungle Book)’ 등의 유명 작품들이 유니티로 제작됐다.

이번 행사는 22일 오후 1시 30분부터 6시 20분까지 서울 강남구 삼성동 소재의 서울종합예술실용학교 아트홀에서 진행되며, 유니티로 제작된 다양한 작품들과 영화 및 애니메이션 분야에서 활용되는 유니티의 다채로운 기능들을 소개할 예정이다.

먼저 유니티 에반젤리스트가 유니티의 실시간 렌더링을 통해 생산성을 대폭 향상시킬 수 있는 애니메이션 제작 파이프라인, 애니메이션 산업에서 활용할 수 있는 포스트 프로세싱 기능을 소개한다.

이와 함께 업계 종사자가 직접 참가하는 유익한 세션들도 이어진다. 2018 부천국제애니메이션페스티벌 국제경쟁 부문에 오른 애니메이션 ‘다시 찾은 사랑(Sonder)’의 제작사인 Soba Studio 담당자가 애니메이션 제작 스토리와 유니티 활용 방법에 대한 세션을 진행할 예정이다.

또한 네이버 웹툰 작가로 활동중이며 1인 게임 개발자인 ㈜스튜디오호랑 최종호 대표가 참여해 유니티를 활용해 제작한 VR만화 서비스 ‘스피어툰’의 제작 과정 및 시연 세션을 진행한다.

특히 각 세션의 중간에는 유니티로 탄생한 다양한 영상들을 상영하는 시간도 준비돼 있다. 다양한 작품들을 마치 단편 애니메이션 상영회처럼 감상하며 유니티 엔진의 발전상을 엿볼 수 있을 예정이다. 영화 및 애니메이션 업계 종사자와 디자인, 애니메이션 학과 학생 등 누구나 참여 가능하며, 신청 페이지(https://onoffmix.com/event/153833)를 통해 신청할 수 있다.

김인숙 유니티 코리아 대표는 “유니티는 영상 및 애니메이션 콘텐츠 편집 결과를 즉각 확인할 수 있는 실시간 엔진으로 제작 기간을 대폭 단축시킬 수 있는 유용한 툴”이라며, “이번 세미나를 통해 관련학과 학생 및 업계 종사자 분들이 제작 과정에서 유니티를 활용해 생산성을 높이고, 작품의 창의성 및 경쟁력을 높이는 데에만 온전히 집중할 수 있도록 돕고 싶다”고 밝혔다.

한편 유니티는 기업 목표인 ‘개발의 민주화’를 이루기 위해 영화 및 애니메이션 분야에서도 유니티로 누구나 손쉽게 콘텐츠를 제작할 수 있게끔 돕고 있다. 지난 6월 열린 ‘유나이트 베를린’ 컨퍼런스에서 AR 기술을 활용해 실제 인물의 표정을 가상의 캐릭터에 입힐 수 있는 ‘페이셜 AR 리모트 컴포넌트(Facial AR Remote Component)’ 기능, 인공지능(AI)을 활용해 애니메이션의 품질을 강화하는 AI 애니메이션 시스템 ‘키네마티카(Kinematica)’를 소개하는 등 지속적으로 엔진 기능을 발전시키고 있다.

또한 오는 10월 23일(현지 시각) 열리는 ‘유나이트 LA’에서는 영화 및 애니메이션 분야의 유니티 활용 사례와 노하우를 소개하는 ‘영화 및 애니메이션 서밋(Film and Animation Summit)’도 최초로 개최할 예정이다.

원문보기: 
http://www.inven.co.kr/webzine/news/?news=207998#csidxace2c73e1abd9c1be24e2ee808a2f62 


오 재밌겠다! 신청 완료 :)


스터디/Unity 2017. 3. 26. 21:21

[유니티] Unity create a game series (sebastian lague)



Unity Create a Game Series

https://www.youtube.com/watch?v=SviIeTt2_Lc&list=PLFt_AvWsXl0ctd4dgE1F8g3uec4zKNRV0

https://github.com/SebLague/Create-a-Game-Source


와 한글 번역 해주신분 감사합니다.

튜토리얼도 알차고 매 에피소드마다 코드 히스토리도 github에 올라와있고 이 튜토리얼로 공부한 한글 블로거들도 있어서 뭔가 문제에 부딪혔을때 검색해보거나 물어볼수도 있지 않을까 하는 기대감(?)



영상 러닝타임 약 5시간, 실제 따라 만들려면 하루 이틀이면 되려나. 생각좀 해보자.

00 Intro 1:31

01 Player controller 15:09

02 Gun system 14:43

03 Enemies 12:59

04 Damage system 10:06

05 Spawn system 10:41

06 Enemy Attacks 16:19

07 Some loose ends 10:37

08 Tile map 12:04

09 Obstacle placement 15:03

10 Map connectivity 17:04

11 Map navigation 14:40

12 Finishing the map generator 18:42

13 Random spawning 20:24

14 Game over 14:43

15 Particle death effect 13:24

16 Weapon effects 20:38

17 Weapon variation 12:41

18 Wave difficulty 16:04

19 Crosshairs 14:20

20 Recoil and reloading 22:12

21 Guns and UI 22:16

22 Audio pt1 17:30

23 Audio pt2 17:22

24 Menu 31:20

25 finishing up 31:12

스터디/Unity 2016. 9. 19. 17:10

[유니티] Playmaker

유니티용 플러그인 Playmaker를 질렀다 (65달러에서 45달러로 할인중이었음)

프로세싱으로 만들어둔 데모를 이제 본격 유니티의 세상으로 옮겨야하는데 java랑 C#이 그나마 비슷하다고는 해도 새로 배워야할 개념이 많아져서 허우적대는중

비주얼 프로그래밍이라고해서 Max/msp 같은건가 싶었는데 FSM 개념을 담은 Flow-chart?..

State Action Event간의 관계가 헷갈려서 듣던 튜토리얼을 멈추고 블로그를 뒤적거리며 개념 정리하는 중.



[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발 - Slideshare

introduce unity3D and playmaker basic - Slideshare

Hutong Games사의 튜토리얼 페이지



  • 함수 단위가 아닌 FSM 단위로 비주얼 프로그래밍 가능

  • GameObject FSM (Finite State Machine : 유한상태기계) 컴포넌트 하나 추가한 것이 하나의 FSM 객체가 된다. 한 게임 오브젝트에 여러 FSM 객체를 만들수도 있으며 일종의 레이어처럼 사용할수있다 (FSM1 캐릭터의 상태 변화제어, FSM2 캐릭터의 행동변화 제어)

  • FSM : State가 특정하게 제한된 것을 Finite State라 하며, 정해진 절차에 따라 반복적으로 그 일을 수행하는 Machine



  • State : FSM에서 하나의 상태를 표현하는 객체. 여러 action과 transitino으로 구성됨
  • Action : State에서 수행할 하나의 작업을 표현하는 객체. (오브젝트 이동 회전 등등등)
  • Transition : State에서 다른 State로의 이동. Transition에 지정된 Event가 발생했을때 다음 State로 넘어감
  • Event : Mouse down..FINISHED 등
  • Variable : 변수(Global도 따로 지정 가능). FSM이 아닌 곳에서도 객체 참조하여 값 얻을수 있음 


  • Animation event를 Playmaker로 전달 : animation event 함수를 PlaymakerFSM 함수중 SendEvent로 지정

  • 모든 PlayMakerFSM 컴포넌트로부터 Action 조회하기

foreach (var fsm in Component.FindObjectsOfType<PlayMakerFSM>())
{
    if (!fsm.Fsm.Initialized)
        fsm.Fsm.InitData();

    foreach (var state in fsm.FsmStates)
    {
        foreach (var action in state.Actions)
        {
            // use action
        }
    }
}

  • 마우스 클릭한 위치에 있는 오브젝트 찾아서 PlayMakerFSM에 이벤트 전달

if(Input.GetMouseButton(0)) {
   ray = Camera.main.ScreenPointToRay(Input.mousePosition);
   if (Physics.Raycast(ray, out hit, 5000)) {
    Debug.Log("name : " + hit.collider.name);
    //PlayMakerFSM fsm = hit.collider.GetComponent<PlayMakerFSM>();
    //fsm.SendEvent("이벤트명");

   }
  }


스터디/Unity 2016. 9. 17. 20:10

[자료] 유니티 UI 디자인 교과서 - 예제 코드


유니티 내장 UI 프레임워크 uGUI


책 링크 (http://wikibook.co.kr/UGUI/)

GitHub (https://github.com/wikibook/ugui


Chapter 1

  • Rigid Body의 Is Kinematic : 다른 오브젝트에 물리적 작용은 하지만 자신은 공간에 멈춰 있음

  • float yAngle = rotationSpeed * Time.deltaTime;   

    transform (0.0f, yAngle, 0.0f);

    //Time.deltaTime은 이전 프레임이 끝난 후 지금까지의 시간(초)


  • 인스펙터 뷰에서 private이나 protect 값이라도 앞에 [SerializeField] 넣으면 수치 변경 가능 
  • CubeGenerator
  •  


    public class CubeGenerator : MonoBehaviour

    {
        [SerializeField] private GameObject cubePrefab;    // 상자 프리팹
        
        public void Generate()
        {
            // 상자 프리팹을 인스턴스로 만든다
            GameObject obj = Instantiate(cubePrefab) as GameObject;
            // 인스턴스를 「CubeGenerator」오브젝트의 자식 형태로 추가
            obj.transform.SetParent(transform);
            // 인스턴스의 스케일을 프리팹에 맞춘다
            obj.transform.localScale = cubePrefab.transform.localScale;
            // 인스턴스의 위치를 CubeGenerator 오브젝트에 맞춘다
            obj.transform.position = transform.position;
            // 떨어질 때마다 변화하도록 회전 각도를 무작위로 지정
            obj.transform.rotation = Random.rotation;
        }
    }

  • Input Controller 
  •  using UnityEngine;


    public class InputController : MonoBehaviour
    {
        void Update()
        {
            if(!Application.isMobilePlatform)
            {
                // 모바일 플랫폼이 아닐  실시할 처리
                if(Input.GetMouseButtonUp(0))
                {
                    // 마우스 왼쪽 버튼을 눌렀다  상태라면
                    // CubeGenerator 컴포넌트에 포함된 Generate 메서드 호출
                    GetComponent<CubeGenerator>().Generate();
                }
            }
            else
            {
                // 모바일 플랫폼일  실시할 처리
                if(Input.touchCount >= 1)
                {
                    Touch touch = Input.GetTouch(0);
                    if(touch.phase == TouchPhase.Began)
                    {
                        // 터치가 시작된 상태라면 CubeGenerator 컴포넌트에 포함된
                        // Generate 메서드를 호출
                        GetComponent<CubeGenerator>().Generate();
                    }
                }
            }
        }
    }

  • 이벤트 메서드 
  • - Awake : 오브젝트의 인스턴스가 로드됐을 때 한번 호출.  씬에 배치된 게임오브젝트에 추가된 스크립트라면 씬이 시작될때 호출되고 프리팹에 추가된 스크립트라면 인스턴스로 만들어진 직후에 호출됨. 비활성화일때는 호출되지 않고 처음 활성화된 시점에 호출  

    - Start : 첫프레임이 지나가기전 한번만 호출

    - FixedUpdate : 게임 오브젝트가 활성화되어있는 동안 고정 프레임율에 맞춰 호출

    - Update : 게임오즈젝트가 활성화되어있는 동안 프레임마다 호출

    - LateUpdate : 프레임마다 Update 메서드가 처리를 끝내면 LastUpdate 메서드가 호출됨. Update 메서드에서 변경된 내용을 처리에 반영하고 싶을떄 사용 

    - Awake가 호출된 시점에서 생성될 오브젝트의 인스턴스는 모두 생성된 상태가 되므로 이 시점에서 다른 오브젝트를 참조할수는 있으나 각 오브젝트에 연관된 Awake 메서드가 호출되는 순서가 정해진 것이 아니므로 참조되는쪽 오브젝트 처리가 안끝났을수도 있음. Awake메서드에서는 자신의 초기화 하고나서 다른 오브젝트로 연결되는 참조를 얻어내기만 하고 정보를 얻어내는 일은 나중에 호출되는 Start에서 하는 것 권장 


Chapter 2


  • 레이어별 렌더링 순서를 코드로 변경 

    obj.transform.SetAsFirstSibling(); //맨먼저 렌더링. 가장아래쪽.

    obj.transform.SetAsLastSibling(); //맨나중에렌더링. 가장위쪽

    obj.transform.SetSiblingIndex(2);  //계층에서 3번째요소가 되는 위치에. 아래에서 세번째로 렌더링.


  • 캔버스 렌더링 모드 
  • - Screen Space 

     : Overlay 모드. 화면 전체 덮는 레이어. Pixel perfect는 선명하나 퍼포먼스 많이 차지. Sort Order 는 0부터 아래쪽 순서로

     : Camera 모드 : 지정된 카메라와 일정한 거리만큼 떨어져 렌더링됨. Sorting Layer 추가하여 거리와 상관없이 렌더링 순서 제어 가능. 

    - World Space 모드 : 다른 게임 오브젝트와 동일한 자격. 



스터디/Unity 2016. 8. 17. 22:41

[유니티] Vuforia 마커 테스트

https://developer.vuforia.com/


http://dark0946.tistory.com/292


vuforia사에서 제공하는 unity용 AR 마커기능 테스트


* 덧 : 여러개 마커 동시 인식할때는 AR camera 에서 꼭 이미지타겟 맥스 값 추가해줄것!



홈페이지에 가서 개발자 라이센스 등록후 타겟 설정.

이미지, 큐브, 원기둥, 뷰포리아 전용 앱으로 스캔한 3d object를 트래킹 대상으로 설정할 수 있음 


6면체에 각각 이미지를 등록하고 데이터를 다운받아 유니티에 import



db를 불러오면 타겟이 화면에 뜨고, 그 타겟 아래 차일드로 원하는 3d object를 넣는다. 



싱글 이미지 테스트


폰 화면 안에 넣은 싱글 이미지


안약통에 프린트한 그림 붙인 육면체도 잘됨 

 자유로운 회전에는 육면체가 좋은듯 


multi target 테스트


레고로도 과연 될까 



레고 각 면의 사진을 찍어서 기울어진걸 보정하고 큐브에 붙였는데

features (특징이 되는 점) 가 부족해서 잘 인식이 안됨.

컬러로 인식하는게 아니라 그레이스케일에서 대비가 되는 점들로 인식하는거였음



그럼 좀 더 자잘하게. 

작은 플레이트도 더 사고 뚜껑 덮을 1칸짜리 타일들도 좀 더 사야할듯 

사진을 대충찍어서 늘렸더니 우글쭈글

별이 두개 더 올라가긴 했는데 여전히 부족한 포인트..


아주 힘겹게 가끔 인식된다.



스터디/Unity 2016. 8. 16. 23:50

[유니티] 플랫폼별 전처리기

피씨에서는 마우스나 키보드 인풋이고, 폰이나 타블렛에서는 터치 인풋을 받으려면 아래와 같이 플랫폼별로 다르게 작성해줘야함


http://docs.unity3d.com/Manual/PlatformDependentCompilation.html


using UnityEngine;

using System.Collections;


public class ClassName : MonoBehaviour {

  void Start () {


    #if UNITY_EDITOR

        Debug.Log("Unity Editor");

    #endif


    #if UNITY_IPHONE

        Debug.Log("Iphone");

    #endif

     #if UNITY_ANDROID

        Debug.Log(“Android");

    #endif


      #if UNITY_WEBPLAYER 

        Debug.Log(“web player");

     #endif


     #if UNITY_STANDALONE_OSX

       Debug.Log("Stand Alone OSX");

    #endif



  }            

}


스터디/Unity 2016. 8. 2. 04:25

[유니티] 네트워크 The Basics of Unity 5 Networking



네트워크 프로그래밍 난생처음 맛보기..

유투브에서 30분 분량의 튜토리얼을 보고 그대로 따라 해보긴 하는데 실제로는 기초 지식이 필요할것 같다 




The Basics of Unity 5 Networking


https://www.youtube.com/watch?v=JlKf0h0K5PU


Import Asset > CrossPlatformInput

drive.cs 작성. pika 오브젝트에 스크립트 add


오브젝트 Add component > Network > network identity

local player authority 체크

add > network > network transfer

transform sync mode : sync transform

Create Empty  > 이름 NetworkManager

여기에 Add > network>network manager

Add>network>network manager HUD


오브젝트를 프리팹으로 만들어놓고 비활성화

NetworkManager 오브젝트 > Spawn Info > Player Prefab 칸에 pika 프리팹을 드래그


BUILD할때 FULLSCREEN해제

하나는 호스트 접속. 하나는 클라이언트 접속해서 방향키 테스트 해보기

(이때 스폰되는 좌표가 0,0,0이어서 카메라뷰에 안들어오는 바람에 처음엔 오류로 착각했음


그리고 둘이 같은 키보드 인풋을 받기 떄문에 동시에 움직이는 문제가 발생한다

pika 프리팹에서 Drive 스크립트 비활성화

그리고 새로운 스크립트 만들기 > 이름 SetupLocalPlayer



이 코드를 pika 프리팹에 드래그앤드랍하고서 플레이해보면 스폰된 clone 오브젝트 클릭해보면 아까 비활성화했던 drive 스크립트가 자동으로 활성화됨.

빌드해서 호스트+클라이언트 테스트해보면 이제 따로 움직임


프리팹에있던 pika를 다시 씬으로 꺼내서 child에 3d Text꺼내서 Player 입력 


이제 회전을 해도 같은 방향으로 보도록 수정해야함

새 스크립트 faceCamera.cs 만들어서 카메라 방향으로 rotate되도록 코드 작성


name 차일드 오브젝트에 이 코드 붙여줌


플레이어 이름 입력받기

SetupLocalPlayer열어서 OnGUI와 Update에 키보드 인풋으로 이름 바꾸는 코드 작성

//OnGui()를 OnGUI()로. 대소문자 유의



SetupLocalPlayer  다시 열어서 여러개의 이름 받을수있도록 하기 

[SyncVar] 추가해주고 public으로 변수. pname이 바뀌면 서버에서 모든 클라이언트에게 이 변수를 동기화하라고 하는 one-way direction.

저장하고 나오면 SetupLocalPlayer컴포넌트에 Pname player SyncVar가 생김



그다음 현재 구현된 GUI는 매 업데이트마다 텍스트를 보내는 형식이라 비효율적이므로 버튼 누르면 바뀌도록 작성 


버튼 + [Command]  

CmdChangeName(pname); 으로 클라이언트로부터 서버에 텍스트 보냄 

이 [SyncVar]와 [Command]관계를 이용해 게임에서 응용 가능 


1. 첫번째 테스트 : local host로 2명의 유저 접속


 유니티에디터에서 맥 app으로 빌드 (이때 카메라 뷰를 살짝 다르게 해줘봤음) -> 유니티에디터에서 게임 플레이 -> 아까 빌드한 맥 app 재생 -> 에디터의 게임뷰에서 LAN Host 실행 -> 맥 app 에서는 localhost로 LAN client 실행 하고나면 맨 첫 이미지처럼 두 캐릭터가 나타나며, 초기 위치는 동일





160809 추가


2. 두번째 테스트. localhost가 아닌, usb로 연결된 스마트폰과 맥을 unity remote로 연동



우선 unity remote (https://docs.unity3d.com/Manual/UnityRemote4.html) 를 안드로이드폰 (테스트는 nexus 7으로 했음) 에 설치하고 개발자 설정에 가서 usb 디버깅 가능하게 체크 -> 맥에는 안드로이드 빌드 환경이 되어있어야 함 (android sdk와 java sdk) -> 유니티 옵션에서 안드로이드 sdk 경로 지정해줌. 혹은 안드로이드로 빌드 설정하면 sdk 경로 지정하라고 뜨기도 함. -> 이때 identifier 이름 제대로 지정되어있나 다시 확인잘해보고 -> 안드로이드에서 unity remote 켜놓고 맥에서 build & run 하면 폰화면에 실행됨!


맥에서 LAN Host + 안드로이드에서 Client 옆칸에 맥 ip주소 입력

안드로이드에서 LAN Host + 안드로이드에서 폰 ip 주소 입력.

둘이 usb 연결되어있어서 같은 localhost로 될줄 알았는데 안되는거 같다.


3. 세번째 테스트 : 안드로이드용 apk로 설치하여 외부 접속


맥은 안드로이드 폴더에 접속이 바로 안되서 android file transfer(https://www.android.com/filetransfer/)를 깔면 된다는데 이유는 모르겠으나 안되서 인터넷으로 apk 파일 업로드 (이때 확인되지 않은 외부 앱 사용용가능하도록 안드로이드 보안 설정 바꾸어주어야 함) 다운로드하여 설치 .


2번처럼 잘 됨 :) 


4. 네번째 테스트 : 웹 브라우저


PC <> Mac <> web 다 됨



(여기서부터 과정은 암유발..지저분한 링크들..)


1) 유니티 에디터에서 웹플레이어 버젼 빌드 (튜토리얼  https://www.youtube.com/watch?v=8u06DdPy7ec

이때 switch platform 선택. 폴더 지정해주면 html 파일과 unity 파일 두개가 생긴다.


2) 이제 이 두 파일을 웹에 올려야 하는데.. 


일단 크롬은 유니티 웹플레이어가 지원이 안되서 사파리, 파이어폭스, 익스플로러로 열어야 함. 그리고 모바일 브라우저도 안됨. 


2-1) 로컬에서 열기 (내컴퓨터)


유니티 웹플레이어가 깔려 있어야 하고 ( http://unity3d.com/kr/webplayer)

실행하려면 자바 보안 설정 변경해야함 : 윈도우 시작메뉴 -> 자바구성 실행 -> 예외사이트에 http://webplayer.unity3d.com 추가

https://www.java.com/ko/download/faq/exception_sitelist.xml

맥, 윈도우 둘다 로컬에서 열어서 호스트 ip만

입력하면 잘 연결됨 


2-2) 드랍박스에서 열기 


http://answers.unity3d.com/questions/954694/is-it-still-possible-to-host-web-player-builds-thr.html

맥과 윈도우 둘다 잘 안됨. pro 계정으로 업그레이드 해야 호스트 기능이 사용 가능한듯?


2-3)  구글드라이브에서 열기 


https://www.youtube.com/watch?v=8u06DdPy7ec 이 예전 영상에서는 구글드라이브에서 바로 호스팅 주소를 따올수있었는데 ui가 바뀌면서  http://answers.unity3d.com/questions/937188/unity-web-player-on-google-drive-not-loading.html http://kkangeva.tistory.com/24  이 게시물처럼 해당 파일 id를 따서 주소를 고쳐서 사용해야 한다. 이때 한참 애를 먹었던 부분이 html 파일 주소 아이디로 했더니 web player는 뜨는데 로딩이 안되는 현상. 결국 폴더 id로 새주소 만든 다음에  /파일이름.html  이렇게 바꾸어줘야 잘됨.

어쨌든 구글도 구글도 2016년 8월 31일 까지만 지원하고 그 이후로는 안된다고하니 어서 버려야겠다


2-4. 개인 호스팅 


결국 내 홈페이지에 ftp 로 올려서 하니까 진짜 2초 만에 잘된다. 으 날린 네시간이 아까워.

사실 ftp 도 하도 오랜만에 써서 아이디 비번도 까먹고 맥 ftp 앱 윈도우 ftp 앱 뭔가 둘다 잘 안되고 새로 받은 filezilla만 잘되네. 이유는 모르겠다. 



모두 모여라