2013. 7. 9. 00:44ㆍ게임 개발/Unity
게임에 사용되는 카메라 컴포넌트 작성을 시작으로, 카메라가 캐릭터를 따라 이동, 3인칭 시점의 카메라 이동하는 부분에 대한 구현이다.
<<기본 프로젝트 Scene Setting 절차>>
a. 바닥 (Ground)
- Plane Game Object 생성 (121 vertexs, 200 tris uv 의 plane Mesh가 생성)
- 캐릭터와 바닥이 충돌이 일어 나야 하기 때문에 Mesh Collider를 추가
- Mertial 를 생성해서 기본적인 Texture를 추가
b. 광원
- Directional light 를 추가 해주고, 적당하게 위치를 추가
스크립트 전용 게임 오브젝트 생성
- Main Camera는 Scene 이 최초 생성될 때 같이 생성되며, 적당한 위치값을 조정
c.장애물
- Cube를 이용해서 만들어 주고, 바닥과 마찬가지로 구성
d. 캐릭터 (Character)
- 실제로 마우스 input을 받아서 움직여 주는 기능의 주체
- 3D Max 로 제작한 캐릭터를 임포트해서 적용한다.
- 충돌을 위해서 사람의 형태인 Capsule Collider 제공
(기즈모를 이용해서 x,y,z, 축 및 Radius 조절해서 맞춰 준다.)
- Rigidbody(강체)를 적용한다. 물리에 대한 부분을 적용하기 위해서..
한번 만든 부분을 위의 사항에 따라 매번 반복하지 않게 하기 위해 prefab 을 제공한다.
(쉽게 보면 prefab 자체는 template 로 보면 된다.)
Navigation Mesh 활용
- 캐릭터가 클릭한 위치까지 이동을 하는데 있어서, 장애물을 회피해서 캐릭터 이동
1. CameraControl.cs 체크
여기에서는 Mathf.Lerp 에 대해서 나오는데, 두 사이의 값 의 평균을 보간?? 해준다는데.>
다시 말해 자연스러운 회전,이동등에 연출되는 값이라고 생각하면 쉽다.?
///
/// 3rd person camera with smooth damping.
///
public class FollowCamera : MonoBehaviour
{
public Transform target = null;
public float distance = 10.0f;
public float minHeight = 5.0f;
public float height = 5.0f;
public float maxHeight = 30.0f;
public float heightDamping = 2.0f;
public float rotation = 0;
public float rotationDamping = 3.0f;
public float rotationFactor = 1;
public float zoomFactor = 1;
private Transform tm;
// Use this for initialization
void Start ()
{
// lcoal caching for the performance.
this.tm = this.gameObject.transform;
}
// Update is called once per frame
void Update ()
{
if (target)
{
// adjust height.
if(this.height < this.minHeight)
this.height = this.minHeight;
else if(this.height > this.maxHeight)
this.height = this.maxHeight;
float wantedHeight = target.position.y + this.height;
float currentHeight = transform.position.y;
if(this.heightDamping != 0)
{
currentHeight = Mathf.Lerp(currentHeight, wantedHeight, this.heightDamping * Time.deltaTime);
}
else
currentHeight = wantedHeight;
// position.
this.tm.position = target.position;
this.tm.position -= Vector3.forward * distance;
Vector3 pos = this.tm.position;
pos.y = currentHeight;
this.tm.position = pos;
// rotation.
float wantedRotation = this.rotation;
if(this.rotationDamping != 0)
{
wantedRotation = Mathf.LerpAngle(tm.eulerAngles.y, this.rotation, this.rotationDamping * Time.deltaTime);
}
this.tm.RotateAround(target.position, Vector3.up, wantedRotation);
this.tm.LookAt(target);
}
}
}
활용팁
1. Unity3D에서 scene 은 반드시 하나 이상의 카메라를 가져야 한다.
바꾸어 말하면 scene 에는 여러 개의 카메라가 존재 할 수 있다.
2. 이 때 화면을 렌더링하는 카메라는 Camera.main 으로 얻어 올 수 있다.
3. 여러 개의 카메라를 사용 할 때 3D 공간을 렌더링 하는 카메라는 Clear flag가 Skybox 로 설정되어야 하며, UI를 렌더링 하는 카메라의 경우 Clear Flag를 Depth Only 로 설정한다.
'게임 개발 > Unity ' 카테고리의 다른 글
8. 캐릭터 생성 이벤트 (0) | 2013.07.09 |
---|---|
7. Scene management (0) | 2013.07.09 |
5. 입력 처리(** Ray.. RayCast ...) (0) | 2013.07.09 |
4. Coroutine 구현에 대해서 공부 (2) | 2013.07.05 |
2,3 Unity3D의 Game Object 생성과 Component 의 종류 알아 보기 (1) | 2013.07.04 |
1. Unity3D 에 대한 화면 구성에 대한 공부 (0) | 2013.07.03 |