3. 강체
강체를 움직이기 위해 힘, 토크를
설정해 주어야 한다.
유니티에서는 Constant_Force
컴포넌트를 제공하고 있는데
이것을 이용하면 간단하게 힘,
토크를 줄 수 있다.
이때 토크의 방향을 설정하는 것이
중요한데 왼손, 오른손 법칙을 이용해서 그 방향을 알 수 있다.
4. 강체
스크립트를 이용해 강체를 움직여 보자.
씬 testRigidBody_ForceTorqueByScript를 보면 force_torque.cs를 컴포넌트로
사용하고 있고 내부 구조는 다음과 같다.
using UnityEngine;
using System.Collections;
public class force_torque : MonoBehaviour
{
// Update is called once per frame
void Update ()
{
gameObject.rigidbody.AddForce( new Vector3( -1.08f, 0, 0 ) );
gameObject.rigidbody.AddTorque( new Vector3( 0, 0, 0.56f ) );
}
}
스크립트를 이용해 강체를 움직여 보자.
5. 여러 강체를 한 묶음으로 만들어 보자.
여러 강체를 합쳐서 하나로 표현
가능하다. 유니티는 Fixed Joint를
제공하는데 이것을 이용해서 여러
강체를 하나로 표현 할 수 있다.
testRigidBody_Fun를 보면 강사가
간단하게 데모를 만들어 보았다.
‘괴혼’이라는 게임의 동작 원리를 살펴
볼 수 있다.
주의 : 실제로 Fixed Joint는 Fix하지
않기 때문에 Configure Joint를 사용한
다.
7. Fixed Joint
강체를 설정했지만 물리에 의해서 움직이지 않게 하려면 Fixed Joint를 사용한
다. 연결할 몸통(Body)를 설정하면 해당 부모 객체의 로컬 좌표계에 기반해
서 위치값을 설정한다.
연결할 몸통을 설정하지 않으면 월드에서 움직이지 않는다.
8. Spring Joint
스프링 조인트는 강체들을 스프링으로 연결할 때 사용한다.
다음 예제 testJoint를
참고 하도록 하자.
빨간색 화살표가 가리키는
강체는 부모 객체이고
FixedJoint로 설정했다.
그렇기 때문에 월드에서 움직이지 않는다.
노란색 화살표가 가리키는
강체는 자식 객체이고
Spring Joint로 설정했다.
Anchor를 기준으로 360도 방향으로 모두 움직
일 수 있으며 Min, Max Distance를 설정해서
최소 혹은 최대로 늘어질 수 있는 길이를 설정할 수 있다. Spring은 스프링의 강도인데 이 값이 작으면 작을 수록 더 많이 늘어질 수 있다.
9. Spring Joint를 어디에 사용할 수 있나?
예> RopePong
강사가 C#으로 만들었던 미니 게임 예제는 스프링을 이용해서 구현했다.
스프링 조인트를 이용해서 천 시뮬레이션도 구현이 가능하다.
14. 오브젝트 풀(Object Pool)
- 이전 강의에서 설명한 메모리 풀의 장점?
- 오브젝트 풀도 같은 개념. 유니티에서는 필수!
- 게임코디(gamecodi.com)의 닉네임 ‘태풍의그라운드’님의 오브젝트 풀을
간단히 살펴 보도록 하자.
15. 전체 소스
using System.Collections;
using System.Collections.Generic;
public class CGameObjectPool<T> where T : class
{
// Instance count to create.
short count;
public delegate T Func();
Func create_fn;
// Instances.
Stack<T> objects;
public CGameObjectPool(short count, Func fn) {
this.count = count;
this.create_fn = fn;
this.objects = new Stack<T>(this.count);
allocate();
}
void allocate() {
for (int i=0; i<this.count; ++i) {
this.objects.Push(this.create_fn());
}
}
public T pop() {
if (this.objects.Count <= 0) {
allocate();
}
return this.objects.Pop();
}
public void push(T obj) {
this.objects.Push(obj);
}
}