Unity Web Player. Install now! Restart your browser after install. <created with Unity>

Unity 5로 '따라하면서 배우는 유니티 3D 입문' 5장 핀볼 게임 따라하기.

* 스페이스 키로 플런저를 당겼다 놓아서 볼 발사
* 좌우 쉬프트키로 좌우 플리퍼를 작동하여 볼 쳐 내기(버그로 현재는 볼이 플리퍼에 닿을 경우만 작동).
* 볼로 범퍼를 맞추면 점수가 올라간다.
* 볼이 아랫쪽 구멍으로 떨어지면 발사대에 볼이 새로 나타난다.

현재 발견된 버그들:
- 플리퍼가 볼에 접촉해야만 작동하는 버그(현재 가장 핵심적 버그).
- 플런저와 볼이 서로 겹쳐져 버리는 버그.
- 볼이 발사대에서 나가면 셔터가 닫혀서 볼이 다시 발사대로 나가지 못하게 처리했지만 미묘하게 나갈 듯 하다 다시 발사대 안쪽으로 볼이 들어올 경우도 셔터가 닫혀 게임이 막히는 버그.

그나마 좀 더 완성도가 있던 다른 게임은 안올리고 이런 기본도 안된 버그 투성이 게임을 올리는 이유는 용량이 적기 때문. --;

15/11/12 목

이번 작업에서 배운 팁들:

* OnCollision()과 OnTrigger()의 차이

- Collider의 Is Trigger가 비활성화 되어 있을 때
다른 오브젝트가 충돌한 순간 OnCollisionEnter() 함수 호출, 충돌 중 OnCollisionStay() 함수 호출,충돌 끝난 뒤 OnCollisionExit() 함수 호출.

- Collider의 Is Trigger가 활성화 되어 있을 때
다른 오브젝트가 충돌한 순간 OnTriggerEnter() 함수 호출, 충돌 중 OnTriggerStay() 함수 호출,충돌 끝난 뒤 OnTriggerExit() 함수 호출.
-------------------------------------------------------------------
* OnCollision() 계열 함수 발생 조건:
한쪽 게임 오브젝트에 Rigidbody가 있어야 하며 Rigidbody-Is Kinematic은 비활성화,
두 Collider의 Is Trigger 비활성화 필요.

* OnTrigger() 계열 함수 발생 조건:
한쪽 게임 오브젝트에 Rigidbody가 있어야 하며
한쪽 Collider의 Is Trigger 활성화 필요.

===========================================================

* AddForce() 함수
Rigidbody.AddForce(force:Vector3, mode:ForceMode)
- force: 물리오브젝트에 가하는 힘, mode: 힘을 가하는 모드. 기본은 ForceMode.Force

힘 가하는 모드
질량 처리
힘 가하는 법
ForceMode.Force
질량
연속적 힘 가하기
ForceMode.Acceleration
무시
연속적 힘 가하기
ForceMode.Impulse
이용
순간적 힘 가하기
ForceMode.VelocityChange
무시
순간적 힘 가하기

연속적 힘의 예: 풍력, 수력, 인력 등.
순간적 힘의 예: 폭발, 타격 등.

===========================================================

* 고속이동시 충돌판정을 건너 뛰는 경우 방지책:

1. Collider의 크기 크게 하기.
2. Rigidbody-Collision Detection: Continuous로 설정.
3. 스크립트를 이용, 물리오브젝트의 최대 이동 속도 제한.

Rigidbody-Collision Detection의 경우
Discreet: 일정 시간 간격마다 충돌 체크.
Continuous: 정지된 Mesh Collider에대해서만 지속적 충돌 판정.
Continuous Dynamic: Continuous 판정 + Is kinematic 비활성화 물리 오브젝트에대해서만 지속적 충돌 판정.


핀볼 머신 각 부분의 명칭들은 나도 생소한 편.

* Cube로 플리퍼 만들고 Component-Physics-Hinge Joint 적용.
Rigidbody-Mass: 0.1, Angular Drag: 0, Use Gravity: On.
Hinge Joint-Anchor: -0.5/0/0, Axis: 0/1/0로 설정.
변수는 presPos: 70/-70, power:80/80, keyCode: Left Shift/Right Shift 적용.
좌/우 쉬프트 키 클릭시 플리퍼 튕기는 처리-제대로 작동않고 있다.
쉬프트 키 클릭시 플리퍼가 작동되지 않고 공과 플리퍼가 접촉했을 때에만 키를 누르면 플리퍼가 작동되는 버그 중.

* Cube로 플런저 만들고 Component-Physics-Spring Joint 적용.
Rigidbody-Use Gravity: off, is Kinematic: on,
Constraints-Freeze Position: x,y 체크, Freeze Rotation: x,y,z 체크.
Spring Joint-Anchor: 0/0/2, Spring: 400, : 0/1/0로 설정.
스페이스키 클릭시 플런저 튕기는 처리-이건 제대로 작동.

* 은 Sphere로 생성해 prefab으로 만들기. Tag는 'Player' 적용.
Rigidbody-Mass: 0.001, Drag, Angular Drag: 0, Use Gravity: On, Collision Detection: Continuous 적용.

* Main Camera-Pos: 2/18/-12, Rot: 43.6/0/0, FOV:60
* Directional Light-Pos: 1.42/13/-23, Rot: 50/0/0

* 기본 도형들로 핀볼 보드 간단히 만들기.
삼각 오브젝트는 임포트하여 사용하고 Component-Physics-Mesh Collider 추가.
하단에 Mesh Renderer를 비활성화하고 Box Collider-Is Trigger: On 처리한 OutBall을 배치하여 볼이 이곳에 닿으면 제거되고 새로운 볼이 지정한 위치(BallSpawnPoint 위치)에 새로 생성되게 처리.

* 역시 Cube로 만든 동일 크기, 동일 위치의 Shutter, ShutterSensor(이건 Box Collider-Is Trigger: On 하고 Mesh Renderer는 비활성화). 처음 볼이 발사될 때 Shutter를 비활성화해 보이지 않고 충돌도 않게 처리하고 볼이 발사되며 ShutterSensor의 Trigger를 나가면 Shutter를 활성화해 보이게 하여 다시 발사 통로로 볼이 들어가지 못하게 처리.

* 범퍼: Capsule로 만들고 이곳에 닿으면 부딪친 반대 방향으로 튕기게 처리.
* 슬링샷: Cube로 만든 Sling(Box Collider-Is Trigger: Off 하고 Mesh Renderer는 비활성화)를 기울여 슬링샷 측면에 붙이고 이곳에 닿으면 일정 방향으로 튕기게 처리. 범퍼는 제대로 동작하는데 슬링은 작동이 안되어 왜 그런가 헤멨는데 알고 보니 슬링의 경우 OnCollisionEnter()로 써야할 것을 onCollisionEnter()으로 오타를 쳐서 생긴 현상이었다.

* 볼의 속도가 일정 속도 이상이 될 경우 뒤에 꼬리가 생기는 효과 만들기.
볼 프리팹 선택하고 Add Component-Effect-Trail Renderer 추가.
Trail Renderer-Materials-Size: 1, Elements0: MatBallTrail 적용.
Time: 0.4, Start Width: 1, End Width: 0.3,
Colors: 알파값을 맨 위에서부터 차례로 255, 196, 128, 96, 0으로 설정.

* 볼의 속도가 지정한 최대속도보다 높으면 지정 최대속도로 변경 처리.
* 일단 따라하기 완료했지만 버그 들이 잔뜩 남아있다. (특히 제일 중요하고 시급히 처리해야할 것은 플리퍼가 제대로 작동하지 않는 것)