그럼 이제 재생 버튼을 눌러 보자!

(으아아앙 사진이 10M가 넘어가 버렸어요!! 흐앙! 그래서 사진을 못올리네요!)

그래서 다른 사진으로 설명을 대체합니다!! :(

요기에 Arrived의 체크는 도착했다라는 것입니다.

Destination의 값을 수정해 주고 Arrived의 체크상태를 풀어준다면 캐릭터가 이동을 합니다.

물론 위에 상단에 재생을 누루고 요로케 된다면! 그때 해주시면 됩니다!

만약 해당 캐릭터를 사용하지 못할 경우 그냥 도형으로 테스트해도 될 것입니다!

(아님 담에 유니티에 3D 모델을 임포트 하는 방법에 대하여 올리도록 하겠습니다.)

섬세를 눌러보세요!

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

그러면 저번 게시글에서 제작한 스크립트를 캐릭터에게 추가를 해줍시다.

Add Component를 이용하여 추가하면 이렇게 나옵니다.


그러면 코드를 분석을 해볼 것인데

하기에 앞서서 이동할 때에 고려사항으로는 목적지의 방향과 어느 정도의 이동 속도를 가지고 있는 것인지입니다.

일단 먼저 지형의 다양성은 전부 배제하고 평지라고 가정을 한 상태에서 목적지 방향으로 이동시키는 것을 생각합니다.

방향 벡터는

방향 벡터 = ( 목적지 위치 - 현재 위치 ) / 목적지까지 거리

이렇게 구합니다.


그리고 방향 벡터는 이동 속도 벡터를 구하기 위해서 이동속도와 곱해줍니다.

이동 속도 벡터 = 방향 벡터 X 이동 속도

그리고 이동 속도 벡터도 각 프레임의 이동량을 구하는 용도로 사용이 됩니다.

각 프레임의 이동량 = 이동 속도 벡터 X 1프레임의 시간


이러고 나서 위치를 새로 갱신한다면 플레이어를 이동시킬 수 있습니다.

새로운 위치 = 현재 위치 + 1프레임의 이동량


모든 이동에는 제로백이라는 것이 존재하리라고 믿습니다.

아마도 그럴것이죠

자동차도 그렇고 맹수도 그렇고 학교 운동회만 보아도 제로백이라는 것이 존재하는 것을 알 수 있습니다.

이동속도라는 것이 처음부터 10m/m가 바로 되는 것이 아니라 0m/m에서 10m/m까지 가속이라는 것을 합니다.

그렇듯 자연스럽게 이동을 시키려면 이렇게 합니다.

이동 속도가 서서히 (방향 X 이동 속도) 에 가까워지게 보간을 합니다.


그러면 1/3일에서 목표까지는 t = 1프레임의 시간 X 3(단, t > 1일 땐 t = 1 )으로 합니다.

그리고는 다음과 같이 보간을 해서 이동 속도 벡터를 구합니다.

이동 속도 벡터 = (방향 X 이동 속도) X t + 현재의 이동 속도 벡터 X (1 - t )



그럼 이제는 매끄럽지 못한 지형을 신경을 씁니다.

경사로가 급한 비탈길은 못가게 그리고 지면에 붙어서 이동을 해야합니다.

생각을 해보세요 앞에 경사로인데 그대로 그냥 직진을 합니다. 경사로를 오르지 않고 참 재미있는 게임이 나오겠군요!


원래는 이런 동작은 구현하기가 쉽지 않다고 합니다.

그렇지만 유니티에는 캐릭터 이동에 특화된 CharacterController라는 컴포넌트가 있기에 가능하다고 합니다.

수평 이동의 이동량만 계산하면 접지판정은 CharacterController의 Move 함수가 담당을 한다고 합니다.

그러려면

수평 이동량 + 중력 이동량

이렇게 구해서 CharacterController의 Move함수에 전달을 해야합다.


그렇다면 다음 게시글에서 진짜 본격적으로 스크립트를 설명할 것인데요


그러기 위해선 흐름이라는 것이 필요합니다.

그 흐름에 대하여 설명을 먼저 하도록 하겠습니다.

요런 흐름을 가지고 있습니다......


어머 오류가 있는데요

지면에 닿아 있는가? 이 질문에 닿아있다면 방향을 구하고 아니라면 중력 가속을 처리하는 것입니다.

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

이제 스크립트를 본격적으로 작성을 해볼 것입니다.

아마 제가 유니티를 만지고 있는 동안에는 처음 작성해 보는 것일지도 모르겠네요


캐릭터가 목적지로 이동하기 위해서는 목적지 방향으로 1프레임당 이동량을 구해서 현재 위치에 더한다고 합니다.

1프레임당 이동량은 "이동방향 X 속도 X 1프레임의 시간"으로 구할 수 있습니다.

그러기 위해서는 속도와 이동 방향을 곱한 velocity를 구할 필요가 있습니다.


이렇게 이동을 반복 > 목적지에 도착 [ 목적지에 충분히 가까우면 멈추는 방식 ]



그러면 이제 작성을 하기 위해 Project란에 있는 Assets폴더에 Scripts라는 폴더를 만듭니다.

거기에 CharacterMove라는 이름을 가진 C#스크립트 파일을 만듭니다.

그리고 이것을 작성합니다!!!


using UnityEngine;

using System.Collections;


public class CharacterMove : MonoBehaviour {

const float GravityPower = 9.8f;

const float StoppingDistance = 0.6f;

Vector3 velocity = Vector3.zero;

CharacterController characterController;

public bool arrived = false;

bool forceRotate = false;

Vector3 forceRotateDirection;

public Vector3 destination;

public float walkSpeed = 6.0f;

public float rotationSpeed = 360.0f;


void Start() {

characterController = GetComponent<CharacterController>();

destination = transfrom.position;

}


void Update() {

if (characterController.isGrounded) {

Vector3 destinationXZ = destination;

destinationXZ.y = transform.position.y;

Vector3 direction = (destinationXZ - transform.position).normalized;

float distance = Vector3.Distance(transform.position, destinationXZ);

Vector3 currentVelocity = velocity;

if (arrived || distance < StoppingDistance)

arrived = true;

if (arrived)

velocity = Vector3.zero;

else

velocity = direction * walkSpeed;

velocity = Vector3.Lerp(currentVelocity, velocity, Mathf.Min(Time.deltaTime * 5.0f, 1.0f);

velocity.y = 0;

if (!forceRotate) {

if (velocity.magnitude > 0.1f && !arrived) {

Quaternion characterTargetRotation = Quaternion.LookRotation(direction);

transform.rotation = Quaternion.RotateTowards(transform.rotation, characterTargetTotation, rotationSpeed * Time.deltaTime);

}

}

velocity += Vector3.down * GravityPower * Time.deltaTime;

Vector3 snapGround = Vector3.zero;

if (characterController.isGrounded)

snapGround = Vector3.down;

characterController.Move(velocity * Time.deltaTime + snapGround);

if (characterController.velocity.magnitude < 1.0f)

arrived = ture;

if (forceRotate && Vector3.Dot(trnsform.forward, forceRotateDirection) > 0.99f)

forceRotate = false;

}

public void SetDestination(Vector3 destination) {

forceRotateDirection = direction;

forceRotateDirection.y = 0;

forceRotateDirection.Normalize();

forceRotate = ture;

}

public void StopMove() {

destination = transform.position;

}

public bool Arrived() {

return arrived;

}

}

이거 작성하면서 한가지 생각을 한 것이 있습니다.

오타가 없을 수는 없을겁니다.


솔직히 이거 작성을 하면서 중간에 문자를 조금.....

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

오늘은 캐릭터를 이동시키는 것을 간단하게 해볼 것인데요.

그리고 언제나 말을 하지만 100%신용을 하지 마세요.


그럼 일단 캐릭터를 이동시키기 위해서는 캐릭터가 있어야 겠죠??

이렇게 캐릭터를 화면으로 옮겨줍니다!!


그런 다음엔 Hierarchy에서 방금 생성한 캐릭터를 불러와 줍니다!!

그담 Inspector에서 Add Component를 눌러주시고 뜨는 창에서 Physics를 눌러주시고 이게 가장 중요합니다.

이것 덕분에 캐릭터가 움직일 수 있는 것이라고 해도 과언이 아니죠

바로 Character Controller인데요!

이것은 이러한 처리를 간단하게 할 수 있게 해줍니다. 

- 울퉁불퉁한 지형을 따라 이동

- 벽을 따라 이동

- 올라갈 수 있는 언덕의 경사 제한

- 올라갈 수 있은 계단의 높이 제한

이러한 것을 간단하게 할 수 있습니다!!

이 컴퍼넌트가 없었다면 아마..... 


아무튼 여기까지 따라온다면 하반신만 캡슐속에 들어갑니다.

캡슐을 겉모습에 맞게 이동을 시키기 위해서

이렇게 전부 맞춰 줍니다.

일단 간단하게 설정들이 무슨 역할을 하는지 작성을 하자면

Slope Limit : 오를 수 있는 비탈길 경사각의 한계

Step Offset : 넘을 수 있는 턱의 높이 (계단같은 것을 말하는 것 같은데 이거 잘못 설정하면 차도와 인도 경사턱도 못 넘을 수돜ㅋㅋㅋ)

Skin Width : 다른 충돌물과 접촉했을 때 겹쳐도 되는 폭 (Radius의 10% 정도로 설정)

Center : 충돌 범위인 캡슐 모양의 중심 위치

Radius : 중돌 범위인 캡슐 모양의 반지름

Height : 충돌 범위인 캡슐 모양의 높이

이상입니다.

스크립트로 제어하는 것은 2편으로 나눌 생각입니다.

스크립트에 관련된 설명을 하고  스크립트 전체를 불러온 다음에 다시 분석을 하는 것이죠

무척 어려운 내용들이 들어있기 때문에 이해를 못하시면 물어봐주세요 아는 한도 내에서 답을 드리겠습니다.


블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

Terrain으로 지형만들기!

2018. 8. 9. 22:03

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

지형과 캐릭터의 접촉판정을 위하여 레이어를 설정해야 합니다.

그러면 레이어를 설정하는 방법을 알아보도록 하겠습니다.

의외로 간단합니다.


블로그 돌아와서 이렇게 거저 먹어도 되는지 모를 정도로 간단합니다.

그래도 일단 오늘 분량은 이것이 끝이니 하도록 하겠습니다.


처음에 우리는 지형으로 할 Hierarchy에서 지형 오브젝트를 불러와 Inspector로 이동합니다.

그러면 저기 레이어란에 우리가 원하는 것이 없기에 새로 만들어야합니다.


그래서 Add Layer...를 눌러줍니다.

이렇게 등장을 합니다.

물론 User Layer 8은 공란으로 등장을 하는 것입니다.

그러면 User Layer 8에다가 ground를 작성해 주시고

우리는 다시 Hierarchy에서 지형을 불러와 줍니다.

그리고 이렇게 레이어를 ground로 설정을 마친다면 레이어 설정은 여기서 끝이 납니다.

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

이 게시글을 진행시키기 전에 저는 잠깐 할 말이 있습니다.

지형을 직접 만드는 방법부터 해보시는 것을 추천드립니다만 이 게시글이 올라갈 즈음에는 아마도 만드는 방법은 해당 블로그에 없을 것이라고 추측됩니다.


예약글을 설정해서 따로 맞추지 않는 이상


아무튼! 저는 그렇게 생각을 합니다.


그럼 시작을 하도록 하겠습니다.


플레이어가 이동을 할 지형을 임포트를 해야겠습니다.

이렇게 눌러서

이 해키지를 불러옵니다.  [옆에 내 PC는 무시를....]

그러면 이런 창이 뜨는데요

All과 Import를 눌러서 해결해 줍니다....??

임포트가 완료가 된다면 Project 브라우저의 Assets / 3D Assets에는 Terrain과 SkyBox가 만들어진다고 하더라구요 [ 실제로도 그렇구요 ]

그럼 그 Terrains속에 있는 Terrain을 실행해 봅시다.


그리고 X : -100 / Y : 0 / Z : -100으로 설정을 합니다.


그러면 이제 조명을 배치해 봅시다.

원래라면 정상적으로 해야 하지만 5.0부터 위치가 바뀌었음으로 그냥 관련 링크를 달아두고 끝내도록 하겠습니다.

관련 링크(책 참고)


저는 이만 가보도록 하겠습니다.

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

일단 제일 먼저 해야할 일은 프로젝트를 만드는 것입니다.

간단하게 만들고 오시면 이제 씬을 제작하게 됩니다.

씬을 만드는 방법은 {씬 / 오브젝트 / 컴포넌트}에 있습니다.


저렇게 만들어도 좋으나 일단 다른 방법을 알려드리도록 하겠습니다.

이와 같은 경로로 일단 Assets에 폴더를 하나 만듭니다.

만든 폴더의 이름은 Scenes로 합시다.

Ctrl + Shift + S 를 눌러서 ~~\\Assets\\Scenes로 경로를 설정합니다.

그리고 씬의 이름은 GameScenes로 합시다.


다음으로는 데이터를 임포트할 폴더를 준비합니다.

이름은 아무렇게나 해도 되지만 제가 설정할 이름은 3D Assets입니다.


[만약 해당 블로그에서 사용하는 파일을 사용한다면 미리 챕터 4 분량의 파일을 옮깁시다.]

그러면 이제 데이터를 임포트 하는 것으로 하겠습니다.

미리 준비가 되어있는 파일을 3D Assets 폴더 안에 드래그 앤 드랍하고 난 후에

해당창이 나옵니다.

해당 창이 사라지면 임포트가 완료가 되는 것인데요

만약 

해당 창이 뜬다면 당황 마시고 Fix now 를 눌러 주세요


그러면 이제 텍스쳐 임포트 설정을 변경합시다.

Texture 폴더 아래에 존재하니 이점 알아둡시다.

그리고 모든 컬러 텍스쳐는 아래의 사진과 같이 설정을 해둡니다.

그리고 노멀맵(파랑색으로 보이는 것들)은 전부 아래와 같이 세팅합니다.

전부 되었다면 (플레이어와 무기 / 몬스터들 전부) 머티리얼을 설정합니다.


설정 방식은 다음과 같습니다!

mt_body / mt_color / mt_hair를 전부 다음과 같이 설정 합니다.

다음은 무기용 머티리얼입니다.

으음.... 무기도 비슷합니다만 저 Shininess를 0.5로 세팅합니다.

그거 말고는 비슷합니다.


늑대와 드래곤도 비슷합니다만 Shininess를 0.25로 세팅을 해야한다는 것이 다르네요.


전부 완료가 되면 이렇게 됩니다!


블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,