[ Unity3D 0501]
Unity Reference - http://docs.unity3d.com/Documentation/Components/comp-AudioGroup.html
[ Audio Listener ]
Unity Reference - http://unitykoreawiki.com/index.php?n=KrMain.Sound
한 Scene에 한개의 Audio Listener가 필요함 (주로 카메라에 attach)
Audio Source가 재생되는 것을 Listen 하는 역할
[ Audio Source ]
Unity Reference - http://docs.unity3d.com/Documentation/ScriptReference/AudioSource.html
http://unitykoreawiki.com/index.php?n=KrMain.class-AudioSource
Audio Clip의 재생을 담당
Unity Reference - http://unitykoreawiki.com/index.php?n=KrMain.Sound
[ Audio Reverb Zone]
Unity Reference - http://docs.unity3d.com/Documentation/Components/class-AudioReverbZone.html
http://unitykoreawiki.com/index.php?n=KrMain.class-AudioReverbFilter
Audio Listener의 위치에 따라 Audio Source의 에코 영역의 설정
Coroutine & Yield
[ 참고 데이터 ]
http://www.unitystudy.net/bbs/board.php?bo_table=writings&wr_id=43
IEnumorator 함수에 대한 설명도 나와 있음
Coroutine에 대한 자세한 설명이 나옴
[ 정리 ]
Coroutine
단일 쓰레드지만 마치 멀티 쓰레드처럼 동작(비선점형 멀티 쓰레드와 유사)
비선점형 멀티쓰레드는 버그로인한 무한 루프 등의 문제가 발생할 수 있으나, Unity에서는 StartCoroutine내의 Loop문에 yield가 없으면 컴파일 에러를 발생시키므로 무한 루프에 빠지는 것을 미연에 방지함
Java Script는 StartCoroutine을 적어주지 않아도 자동으로 인식하게 해줌
yield : 어떤 서브 루틴을 실행 하다가 yield를 만나면 서브루틴 실행을 잠시 보류하고 서브루틴을 빠져 나온다. 그리고 이 서브루틴을 호출했던 부모 서브루틴의 다음 라인을 실행한다. 그런 다음 게임 루프상에서 다음 턴이 오면 보류했던 위치 부터 실행을 재계한다.
yield return .. ; : 실제 리턴되서 종료되는 것이 아니라 다음 턴으로 넘긴다. 즉, 다음 턴에 다음 라인을 실행함
yield return new WaitForSecond(XX) : 일단 턴을 넘긴 다음 지정된 시간(XX) 이후에 다시 돌아와 다음 라인을 수행함
yield break; 다음 라인으로 돌아 오지 않고 정말 종료됨
Unity3D에서 C# Script로 FSM(Finite State Machine) 구현
Coroutine을 이용 : http://mingu.kr/80
Rigidbody : 물리엔진에 영향을 받는 컴포넌트로 중력, 공기저항, 회전마찰계수 등의 속성을 가지고 있음
Unity Reference - http://docs.unity3d.com/Documentation/Components/class-Rigidbody.html
Mass : 질량
Drag : 마찰 계수
Angular Drag : 회전 마찰 계수
Use Gravity : 중력 사용 여부
Is Kinematic : 관절과 연결된 부분임을 명시적으로 물리엔진에게 알림으로써, 독자적인 물리효과가 적용되지 않도록 한다. 또한, HingeJoint를 통해 Animation을 가질 수 있음
Interpolate : 렌더링 프레임을 부드럽게 보이게 하기 위한 보간 기능
Interpolate : 이전 프레임의 위치기반으로 보간
Extrapolate : 다음 프레임 위치를 예상해서 보간
Collision Detection : 충돌 감지 방식
Discrete : 일반적인 감지 방식
Continuous : (Rigidbody가 없는) 고정(static) 메쉬 충돌체와 Continuous Dynamics로 설정한 Rigidbody에 대해 연속 감지 방식(Continues Collision Detection)을 수행하며, 다른 움직이는 Collider들은 제한적인 출돌 감지(Discrete Collision Detection)를 수행함 (물리 퍼포먼스에 많은 영향을 줌, 되도록 Discrete를 쓰는 것을 권장) - 빠른 움직임에 따라 Collider를 서로 관통해 버리는 것을 방지하기 위해 사용됨
Continuous Dynamics : 고정 메쉬 충돌체와 Continuous Dynamic과 Continuous로 설정한 리지드바디에 대해 연속감지를 사용해 충돌 탐지
Constraints : 물리적인 영향을 받고 싶지 않은 좌표계(x,y,z)를 설정
Freeze Position : 이동을 막음
Freeze Rotation : 회전을 막음
Trigger & Collision
OnCollision
Collider에 의한 충돌체크를 의미하는 만큼 충돌체 A와 B는 Collider를 가지고 있어야 함
또한 물성을 이용하고 있기 때문에, 충돌체 둘 중 하나는 Rigidbody를 가지고 있어야 하며, Rigidbody를 가지고 있는 쪽이 움직여야 함
충돌체 둘 중 하나의 Rigidbody에서 Iskinematic이 꺼져야 발생함
IsKinematic이 켜져있으면 충돌을 무시함(물리 연산을 안하기 때문에)
내부 파라미터로는 충돌된 Collision 변수가 들어옴
OnTrigger : OnCollision을 특화시킨 함수로 이해하는 것이 타당함
충돌체 A와 B는 Collider를 가지고 있어야 함
충돌체 둘 중 하나는 Rigidbody를 가지고 있어야 함
Collider의 IsTrigger가 켜져 있어야 함 (꺼져 있으면 두 충돌체간의 물리 연산을 하지 않는다)
IsTigger가 켜져있으면 Collision 관련 함수가 호출되지 않음 (즉, Trigger의 의미에 충실함)
즉, 주인공 캐릭터에 IsTrigger를 On 하는 것은 비합리적
내부 파라미터로는 충돌된 Collider 변수가 들어옴
OnTrigger/OnCollision의 Enter/Stay/Exit
~Enter : 충돌이 이루어지는 시점
~Stay : 충돌이 계속 진행중일 때
~Exit : 충돌이 끝나는 시점
Trigger / Collion 함수는 모두 yield 사용이 가능
Mesh Collider
Unity에서 기본적으로 Mesh Collider 는 다른 Mesh Collider와의 충돌 체크를 제공하지 않음
모든 폴리곤에 대한 충돌 연산이 필요하기 때문에 기본적으로는 제공을 하지 않음
정밀한 충돌 계산을 위해서는 Mesh Collider의 Convex 속성을 On 해서 다른 Mesh Collider와 충돌 계산을 할 수 있도록 하고 있음
Collision & Trigger 테스트 소스
GameObject에 MyTrigger.cs 와 MyCollision을 삽입해서 사용
두개의 GameObject(Cube)를 만들어서 테스트
Collision
Rigidbody가 있는 경우와 없는 경우(물체를 이동해서 충돌 체크)
IsKenematic 테스트
Trigger
Rigidbody가 있는 경우와 없는 경우(물체를 이동해서 충돌 체크)
isTrigger 테스트(Collision 계열 함수가 처리되지 않는 것을 체크)
[ Unity3D 0502]
[ 2D Mario Clone - Ch04 ]
Part 14: Player Properties Explained
여기부터는 [ Tutorial 04 Scene ] 설명
[03:13] 캐릭터의 상태들 / 캐릭터가 가지는 속성들 / update에서 처리해야할 것들 (AddKey, AddCoins 등)
Part 15: Player Properties Setup
[11:46] playerProperties.cs 만들어서 추가하기
public 변수에 Prefab 및 Object 연결
projectileFire - prefab_fireball
ProjectileSocketRight - projectileSocketRight
ProjectileSocketLeft - projectileSocketLeft
materialMarioStandard - mario ani sheet - standard
materialMarioFire - mario ani sheet - fire
<Source>playerProperties1501
[18:13]Properties Base 작업 및 [AddComponentMenu("...")]
메뉴 추가 : C# >> [AddComponentMenu("...")]
GameObject에 (내가 만든) Component를 추가시킬 수 있도록 해줌
[24:28] SetplayerState 테스트
<Source>playerProperties1502
Part 16: Player Properties Player States
플레이어 상태에 따른 텍스처 변화 및 크기 변화 처리
[01:15] Update에 캐릭터의 변화 처리(update>>changeMario부분)
Material을 상태에 따라 동적으로 변화 시키고 있음
[02:52] SetPlayerState>> Mario Small 처리 // Small>>Large했을 때 캐릭터가 떨어지는 현상은 나중에 처리됨
<Source>playerProperties1601
[05:43] SetPlayerState>> Mario Fire 처리
[14:43,44] Update >> canShoot 처리
GameObject.rigidbody.Addforce() : 오브젝트에 인자만큼의 힘을 가한다.
<Source>playerProperties1602
[32:21] 캐릭터의 State에 따른 마무리 작업
<Source>playerProperties1603
Part 17: Player Properties Conclusion
캐릭터 속성에 대한 결론
Part 18: Start Point, Save Point, and Kill Box
[ Tutorial 5 Scene ]로 진행
prefab_save_points 생성
boxcollier>>is trigger
[20:44] spawnSaveSetup Script생성
OnTriggerEnter(Collider other) : 충돌된 대상체가 있을 경우 호출되는 함수
startPoint - savePoint1 - Start
soundDie - mario_death
<Source>spawnSaveSetup
Part 19: Camera 1 - Orthographic and Perspective
[Tutorial 6]로 진행
카메라 설정과 관련된 설명이 나옴
다중 카메라를 이용해서 레이어 표현하고 있음 (Orthographic and Perspective로 동시에 표현이 가능)
Clear Flags
Skybox : 스카이박스를 만들어서 보여줄 수 있도록 함
Solid Color : 스카이박스를 단색으로 표현하도록 함
Depth only : 밑의 Depth에 기반하는 형태로 보여줌
Don't Clear : ?
Culling Mask
layer 항목에 일치되는 것들만 보여줌(중복 가능)
Projection
Othographic : 원근감 없는 카메라
Perspective : 워근감 있는 카메라
Size : ViewPort의 해상도 크기 변경
Clipping Plane : Vierwport 앞뒤 단면 크기
Normalized View Port Rect : 기본적인 Viewport 사이즈
Depth : 다중 layer로 구성된 경우 Depth를 통해 랜더링 순서를 결정 (카메라와 오브젝트간의 거리를 무시하고)
Rendering Path : (?)
Target Texture : (?)
HDR (?)
Part 20: Camera 1 - Smooth Follow
[11:54] 기본 변수 및 로직 생성
<Source>cameraSmoothFollow2D2001
[14:10] Mathf.SmoothDamp(부드럽게 카메라 이동 하기 위해 사용한 메소드)
[인자1]current : 현재 위치
[인자2]target : 옮길 위치
[인자3]currentVelocity : 이 함수가 호출될 때마다 갱신됨
[인자4]smoothTime : 대략적으로 목표지점까지 도달하는 시간
[17:18][17:25] 캐릭터의 움직임에 따라 카메라 이동 / 실행 테스트
cameraSmoothFollow2D public 변수 대입
CameraTarget - playerFocus
Player - player
<Source>cameraSmoothFollow2D2002
[21:09] 카메라의 위치를 위 아래로 조정할 수 있게 함
실행 테스트
Camera Follow Y - unckeck
Camera Follow Height - check
Camera Height 변화에 따라 카메라 위치 변동됨
<Source>cameraSmoothFollow2D2003
Part 21: Camera 2 - Smooth Follow with Zooming
캐릭터의 움직임에 따른 카메라 줌인 줌아웃 처리
캐릭터가 점프를 함에 따라 줌 아웃, 땅에 도달하면 원래대로 될 수 있도록 됨
[04:51] 줌인/아웃을 위한 변수 선언
<Source>cameraSmoothFollow2D2101
[10:42] startPos 사용 (카메라의 줌을 위해 필요한 변수)
<Source>playerControls2102
[23:52] 카메라 줌 처리
camera.orthographicSize : 카메라의 Viewport 사이즈를 바꾸고 있음
Mathf.Lerp : 보간 값을 돌려 주는 함수로 부드러운 처리를 위해서 사용함
[인자1]과[인자2] 사이의 값을 [인자3](0~1사이)에 따라 값을 보간해서 알려줌.
<Source>camerSmoothFollow2D2103
Part 22: Camera 3 - Border Follow - Original Mario
cameraBorderFollow.cs를 camera에 붙임
cameraSmoothFollow2D 스크립트는 Uncheck
[33:04] 캐릭터가 화면의 특정 사각형 내를 벗어난 경우에만 카메라가 이동할 수 있도록 하는 것 처리
Mathf.SmoothDamp : 부드럽게 카메라 이동 하기 위해 사용한 메소드
<Source>cameraBorderFollow