씬 ( Scen )
게임의 장면 또는 상태를 유니티에서 관리하는 단위
씬 관리르 통해서 게임의 레벨 및 상태를 구분
씬 그래프 형식 ( 씨을 나눠서 관리 하는 것 )
하나의 저장 단위
-----------------------------------------------------------------------------------------------------------
어셋 ( Asset )
엔진에서 사요되는 모든 자원 ( Resources )
Resources : 3d model, audio, texture etc...
-----------------------------------------------------------------------------------------------------------
게임 오브젝트 ( GameObject )
유니티에 존재하는 어떠한 것, 최소의 단위
스크립트 ( Script ) 와 컴퍼넌트 ( Component )
구현된 각각의 기능들을 컴퍼넌트라 호칭
사용자들은 컴퍼넌트를 구현하고 게임오브젝트에 추가하여 기느을 동작시킴
모든 오브젝트는 트랜스퍼 ( Transfer ) 라는 컴퍼넌틀 가지고있음, 위치값, 회전값, 크기값 등을 관리하는 녀석
-----------------------------------------------------------------------------------------------------------
프리팹 ( Prefab )
묶어서 패키지화 한 것 ( 게임 오브젝트에 구성된 기능들을 패키지화 시킨 어셋 )
씬에 배치돈 프리팹들은 항상 원본 데이터를 기준으로 동작하나, 필요에 따라 해당 링크를 끊을 수 있음
원본이 바뀌면 바뀌어야한다. 그런데 안바뀌는 것들이 있다. [ 위치, 스케일, 회전 ]
개발자가 손댄 정보는 바뀌지 않는다.
예를 들어 책상을 만들라하는데 판 하나와 다리 4개를 따로 줫다고 생각해보자, 게임오브젝트가 5개 !
얘네를 책상으로 만들려면 다리4개를 세우고, 판때기를 그위에 올린다. 이걸 100개 만들려고하면 어떻하지 ??
이 만든 책상 1개를 묶어서 (패키지화 해서) 1000개 뿌리면 된다. 이걸 Prefab 이라하는데 갑자기 설계가 바뀐다.
원형 테이블로 바꾸겠다고 한다. ( 카피본들은 원본을 쳐다보고 있다고 생각하자 )
그런데 두개만 사각으로 남겨달라고 하자, 그러면 두개만 사각으로 바꾸고 원본을 바라보는 링크를 끊어버린다.
그런데 나중에 다시 사각으로 다 바꿛ㄹ라하자, 그럼 아까있던 사각테이블을 원본잘에 갖다 놓는다. 그럼 복제본들이 다 사각으로 바뀐다.
-----------------------------------------------------------------------------------------------------------
폴리곤
하나의 면을 페이스, 트라이앵글 이라고 부르고, 법선을 Normal 이라고부른다
이 법선을 가지고 조명을 계산한다.
조명 계산법 조명을 뒤집고, 빛을 받는 곳의 법선과 내적을 한다. 그 밧이 바로 빛의 세기이다.
이것이 램버트의 조명 계산 법 이라고 한다더라.
-----------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------
유니티 ( Unity ) 사용자 인터페이스
씬 ( Scene ) 뷰
3D 세상을 편비하기 위한 편집 뷰
오브젝트 배치, 회전, 크기 조절 등 게임을 개발함에 있어 항상 주시하게 되는 뷰
영화 제작에 있어 세트장 이라고 생각하자
게임 ( Game ) 뷰
게임이 구성되고 최종적으로 보여지는 뷰
이 뷰를 통해 실제 개발된 게임의 모습을 확인하거나 컨트롤이 가능
영화 화면이라고 보면 됨
계층 ( Hierachy ) 뷰
씬뷰에 배치된 수많은 오브젝트의 목록을 표시하는 리스트 뷰
게임상 오브젝트 관리를 용이하게 하기 위해 계층구조로 관리를 가능케하는 뷰
패키지화 ( 묶음 ) 을 만들수 있는 곳
사람의 신체를 생각하자 몸 - 팔 - 근육 - 관절 - 세포 등 계층적 구조
내가 손을 흔든다, 손을 흔든다고 해서 내 몸이 어떻게 변하진 않는다,
하지만 몸이 움직이면 손은 따라서 움직이게 된다.
프로젝트 ( Project ) 뷰
게임을 구성하는 다양한 어셋을 관리하기 위한 뷰
유니티 엔진에서 유일하게 하드디스크와링크된 뷰
영화를 찍을 때 필요한 소품등을 저장해 놓은 창고라고 생각하자.
Window - Lighting - Skybow - None 하면 하늘사라짐
카메라 다루기
Alt + 마우스 좌클릭 : 괘도 회전
마우스 우클릭 : 보는 방향 반환
마우스 우클릭 + WASD : 이동 ( 갓모드 )
마우스 우클릭 + WASD + Shift : 이동 ( 대쉬 )
방향키 : 앞뒤좌우 이동
오브젝트 찾는법 : 계층뷰 에서 더블클릭 / 계층 뷰에서 원클릭 + 씬뷰 에서 F
씬뷰에서 보는 시점을 게임뷰와 일치 : 메인카메라 원클릭 + Ctrl + Shift + F
게임뷰에서 보는 시점을 씬뷰와 일치 : 메인카메라 원클릭 - GameObject - Align View to Select
Ctrl + Shift + F : 어떠한 오브젝트를 클릭후 하면 카메라의 지점으로 오브젝트가 이동됨 !
( 카메라와 동기화 ? )
-----------------------------------------------------------------------------------------------------------
기즈모
각 축을 누르면 축단위로 정렬이됨 ( 직교 투영 모드 ISO )
숫자키 2번 누르면 2D 로 바뀜 ( 우측이 X 위쪽이 Y )
그 외엔 Perspective 모드 ( 원근감 존재 )
Transfer 기즈모 ( 방향키 십자모양 ) 위치 이동에 사용 됨 : 면 두가지축, 화살표 한가지 축
Rotate 기즈모 ( 재활용 표시 ) : 축을 기준으로 회전 시킬수 있다. 그냥 누르면 자유회전 가능
크기 변경 기즈모 ( 땡기는 표시 ) : 축을 기준으로 크기를 변경할 수 있다.
가운데 박스는 전체 크기, 스케일 뒤집기도 가능 ( 거울 )
툴박스 기즈모 : 보는 시점에 따라 위치이동, 회전, 크기변경이 가능
각 단축키 : W , E , R ., T ..
-----------------------------------------------------------------------------------------------------------
복사 : Ctrl + D ( 바로생김 )
계층구조 : 계층구조 뷰에서 잡아다 드래그 앤 드롭 해서 계층 구조 만들수 있음
계층 구조 상 회전 : Center 계층 구조의 중심을 기준으로 , Pivot 선택 대상을 기준으로
※ Collider 는 계층 구조에 영향을 받지 않는다. 자식을 가지고 싶으면 스케일을 뒤집지 마라!
검색기능 : 검색에서 제외된 어셋들은 흑백화 되고, 검색 후보들만 컬러를 가진다.
프로젝트 뷰 : 원칼럼, 투칼럼 두가지 타입이 있다. 프로젝트 이름 우클릭하면 정할 수 있다.
※ 자물쇠 걸면, 다른것에 영향을 받지 않음 ( 강제 이동이 되지 않음 )
인스펙터 잠그면 다른 오브젝트 눌러도 인스펙터가 보여주는 값이 다른것으로 바뀌지 않음.
-----------------------------------------------------------------------------------------------------------
Asset - Export package - 내 에셋을 패키지 화 해서 밖으로 내보낼수있음 ( 복사해서 )
Resources 안에는 진짜로 사용하는 리소스 들만 넣자 왜냐면 안쓰여도 그냥 무조건 포함하기
때문이다.
※ 아티스트 들과 단위를 맞추고 가는게 좋다 ( 3D MAX )
3D 이미지와 텍스쳐 중간다리 역할 하는 친구 : Materials
Shader ( 오브젝트를 꾸미는 방식이 구현되어있는 것 )
Standard 물리 기반 렌더링 쉐이더 ( 재질의 느낌을 살린다 ) ( PC 에선 좋은데 모바일에선 느림 )
Diffuse 램버트 조명공식을 적용한다. 안이쁘다
Unlit 조명 계산을 빼버림
타일링 ( Tiling )
반복 해서 붙이기 타일링/ 랩핑 이라고 표현한다 ( 하나의 이미지를 여러번 붙여 넣는건, 배경같은거 )
Material 에서 정할수있다.
Tiling - X 축 몇개 Y축 몇개 사용 할것인가 ?? ( 타일링에 대한 비용은 0 이다. 0 공짜다 )
Wrap Mode : Clamp 로 되어있을 시 타일링이 불가능하다. 텍스쳐의 마지막 정보를 계속 사용 하기 때문
Repeat 로 되어있어야, 타일링이 가능
※ 부딪히면 불꽃 튀기고, 모닥불에서 불똥 나오고 그런 것 모두가 파티클 이다.
-----------------------------------------------------------------------------------------------------------
조명
디렉셔널 라이트 ( Directional Light )
태양이다. 어디에 있던 차이없이 빛을 받는다. 모든곳에서 빛을 똑같이 받음, 조명계산하기 편함 싸구려
기본으로 깔고 가야하는 조명 / 포지션은 의미가 없지만 회전 값은 중요하다.
포인트 라이트 ( Point Light )
전구, 촛불 같은것으로 점광 이라고 한다. 전 방향성을 가지고 있다. 빛의 도달 범위가 있다.
포지션이 큰 의미가 있고, 회전은 의미가 없다.
Range 범위 / Intensity 빛의 세기
Shadow : Hard 와 Soft 두종류 그리고 안그리기가 있다 그림자는 역시 비싸다 하드웨어 좋으면 하드까지만
Rander : 중요하다고 하면 포인트 라이트 계산 빡세게 하는거
Culling Mask 누가 이 빛을받을 거냐 ??
Flare 과 Cookie 는 이 것에선 안쓰이는데 있다 무시하자.
스팟 라이트 ( Spot Light )
손전등, 무대조명 같은 것을 생각하면 된다. 위치와 회전이 중요하다. 빛의 범위도 있다. 가장 비싸다.
즉 오버헤드가 크다. 쓰기 너무 비싸다 포기하자
에어리어 라이트 ( Area Light )
빛을 구울때 사용된다. 오직 라이트맵에섭만 사용된다.
환경 광, 반사 광 ( Ambient Light )
책상 밑은 직접적으로 쐬진 않지만 마냥 어둡지 않다. 왜 ? 주변 빛이 튕겨서 ( 반사되서 ) 어느정도 비추기 때문이다. 이러한 것을 환경광( 반사광 ) 이라고 한다.
그래서 일반적으로는 그냥 색을 넣어버린다. 실시간 계산은 현재 너무나도 큰 오버헤드라 불가능 미래엔가능?
※ 빛줄기를 God Ray 라고 부른다고 한다. 그렇다.
※ 배트맨 부를때 쏘는 조명을 생각하자 어떻게 ? 전등에 박쥐모양을 붙인다, 이때 이 박쥐르 쿠키 라고한다.
방향이 있으면 되기 때문에 스팟라이트와, 디렉셔널 라이트에 사용 가능
※ 손맵 : 모바일 등 초기에서 조명이 비싸서 못쓰고 손으로 음영 등을 준 그림 을 이용하여 입첵ㅁ이나 조명 등을 표현한 것
※ 조명은 비싸니까 실제로 조명을 쓰진 않는다. 우린 횃불 등의 위치를 알고 있고, 범위도 정할수 있으니 손맵마냥 조명을받앗다 치고 구현하고 한다. 이를 굽는다 ( Bake ) 라고 표현한다. 퀄리티가 아주 높아지고 실제 계산 등은 개발단계 에서 하므로 게임 퍼포먼스에도 영향을 미치지 않는다.
※ 유니티에서의 단위는 미터이다.
-----------------------------------------------------------------------------------------------------------
Update( )
매 프레임 한번씩 호출되는 함수이다. ( 1초에 몇번씩 호출 되는 함수 )
입력을 주로 받는다. 왜냐면 놓치면 안되니까, 리듬게임 같은걸 생각해보자 !
Input.
무언 가를 입력 받겠다 라는 뜻이다.
키보드나 조이스 등에 대해 Mapping 할수 있다.( Input.GetAxis )
이벤트 같은 행동은 Input.GetButton 등을 받을 수 있음
Input.GetAxis( "입력키" )
어떠한 축을 입력 받는 다는 뜻이다.
키보드나 조이스틱은 -1 ~ 1 의 범위를 가지고있다. ( 눌렸는지 안눌렸는지 명확하기 때문 )
단 마우스는 범위가 정해져있지 않다. ( 명확하지않음 많이갈수도 조금이동할수도 있음 )
Input.GetDown( "입력키" )
입력키가 눌러진 순간 True 를 반환한다.
Time.deltaTime
delta 즉 델타는 변위값 ( Gap 갭 ) 이라고 생각하면 된다.
deltaTime 은 프레임과 프레임 사이의 시간을 의미한다 예를 들어 2프레임이라면 0.5초가 될것이다.
성능의 차이 없이 구현하기 위해서, 화면사에서 뭔가 변하거나 움직인다면 무조건 이를 곱해줘야한다.
이게 없다면 성능좋은 컴퓨터를 가진 사람이 무조건 이기게 될것이다. 프레임에 따라 더 많은 움직임이나 액션이 가능하기 때문에!!
Mathf.
수학적 어떠한 처리를 해주는 함수들이 들어가 있다. 주로 Float 에 관란 연산을 수행한다.
Mathf.Clamp( 입력값, Min, Max )
입력값이 최소와 최대 사이에있다면 입력값을 반환하고, 입력값이 최소보다 작다면 Min 을 반환하고, 최대값보다 크다면 Max 값을 반환한다.
GetComponent< 타입 >( )
어떠한 컴퍼넌트를 받아오는 함수로 만약 해당 컴퍼넌트가 업다면, Null 값이 반환될것이다.
주의할 점은 이 함수로 받아오는 값은 자신의 오브젝트 안에 있는 컴퍼넌트만을 가져올수 있는 것이다.
public Transform 변수이름
외부의 오브젝트를 내 클래스 안으로 끌어와서 사용하고 싶을때 사용하는 방법으로 드래그앤 드롭으로 끌어서 직접 링크를 걸어줘야 한다. 성능은 최고지만 Public 이므로 보안이나 다른 실수에 신경을 쓰자.
캐릭터컨트롤러 컴퍼넌트 ( CharacterController )
유니티가 캐릭터를 잘 움직일수 있게 미리 만들어준 것으로 캡슐모양 컬라이더를 내포하고있고 여러가지 함수들을 가지고 있다. 유용한듯
예로 Move 로 Vector3를 주면 움직이고, isGrounded 를 주면 땅에 붙어있으면 true 아니면 false 를 준다.
카메라.TransformDirection ( Vector3 )
카메라가 보고있는방향을 기준으로 새로운 좌표계를 만들어 주고, Vector3 만큼 벡터를 가지고있다.
Vector3변수.x Vector3변수.y Vector3변수.z
한 요소씩 접근이 가능하다.
※ 유니티 구현상 쓰지 않는 코드는 지워라 오버헤드다.
※ 프레임 : 1초에 뭐가 몇번 그렸느냐
※ 유니티 - HELP - Script Reference 에서 처음보는 함수에 대해 정확히 집고 넘어가자.
※ 유니티 - Edit - Project Setting - Input 에서 어떤 입력이 있고 어떤 역할을 하는지 찾을 수 있다.
같은 이름이 둑 ㅐ있다. Fire1,2,3 이 여러개 이다. 조이스틱이냐 키보드 마우스냐의 차이를 가지고 있다.
※ 스크립트 작성중 어떤 줄에 커서를 대고 Alt 를 누르고 위아래로 움직이면 얠 데리고 왔다갔다한다.
-----------------------------------------------------------------------------------------------------------
마우스 회전에 따라 메인 카메라 회전 시키기
public float sensitivity = 700.0f;
float rotationX;
float rotationY;
void Update()
{
float mouseMoveValueX = Input.GetAxis("Mouse X");
float mouseMoveValueY = Input.GetAxis("Mouse Y");
rotationY += mouseMoveValueX * sensitivity * Time.deltaTime;
rotationX += mouseMoveValueY * sensitivity * Time.deltaTime;
※ 생각해보자 FPS 할때 마우스를 좌우로 움직이면 시점이 좌우로 회전한다.
이때 실제로 돌아가는 축은 Y축이 돌아가고 마우스를 위아래로 움직이면
실제 돌아가는 축은 X축이기에 서로 반대로 곱해주는 것이다.
rotationY %= 360;
rotationX %= 360;
transform.eulerAngles = new Vector3(-rotationX, rotationY, 0.0f);
※ X 축 부분에 마이너스를 붙이는 이유는 내가 올리면 위를 보고 싶어서 이다.
만약 마우스를 내릴때 위를 보게하고싶으면 그냥 + 하면 된다 (헬기조종)
Z 축은 FPS 게임이나 공포게임 할때 벽에서 빼꼼 할때 사용하면 된다고한다.
※ 축을 회전시킬때 두가지 방법이 있는데, 하나는 오일러 방식으로 X축으로 얼마 Y축으로 얼마 Z축으로
으로 얼마 회전하라고 주면 그걸로 하고 // 두번째는 4차원 방식으로 하는 것으로 가상의 축을 만들어 서 회전 시키는 것인데 사람이 이해하긴 힘들다, 하지만 사용의 편의성을 위하여 그냥 eulerAngles 라고 하고 사용한다. ( 실제 내부 엔진에서는 알아서 가상의 축을 만들어 알아서 잘 회전한다. )
사원수 회전 이라고한다.
}
이제 이 코드를 메인카메라에 합체(?) 시키면 마우스가 움직이면 카메라가 함께 움직이다.
와우! 이제 우린 FPS의 시점을 완성했다.
-----------------------------------------------------------------------------------------------------------
마우스 회전에 따라 메인 카메라 회전 시키기 + 각도에 제한걸기
간단하다 위의 코드에서 rotationX 와 rotationY 의 값이 특정 각도 이상이 되어버리면 더이상 돌아가지 못하게 마늘면 끝 날 것이다. 따라서 transform.eulerAngles = new Vector3(-rotationX, rotationY, 0.0f); 부분을 바꾼다.
if( rotationY >= 90 || rotationY <= -90 )
Debug.Log(" 현재 Y축 회전값 : " + rotationY + " 이므로 더이상은 돌아볼수없다. 더 돌아보다간 목이 부러질것이다. ");
else if ( rotationX >= 90 || rotationX <= -90)
Debug.Log(" 현재 X축 회전값 : " + rotationX + " 이므로 더이상은 돌아볼수없다. 더 돌아보다간 목이 부러질것이다. ");
else
transform.eulerAngles = new Vector3(-rotationX, rotationY, 0.0f);
※ 자 우리는 중요한 사실 하나를 알수 있다. 각도는 음수로도 존재한다. !!
지금 이 코드에서는 범위가 -360 ~ 360 이 나온다.
그런데 실제로 사원수 회전 에서는 항상 0 ~ 360 이라고 한다.
이 코드로 여러 실험을 해봤는데 - 90 과 270 은 다르다..... 왜지...머리가 아파온다
자 이제 우리는 이 코드로 가만히 서있는 사람의 목이 360도 돌아가는 사람이 되는 무서운 상황을 피했다.
실은 위의 코드는 이렇게 변할수 있다.
rotationX = Mathf.Clamp(rotationX, -90.0f , 90.0f ) ;
transform.eulerAngles = new Vector3( -roationX, rotationY , 0.0f ) ;
※ 컨트롤 + 쉬프트 + 스페이스 :: 매개 변수 부근에 커서를 두고 누르면 해당 함수의 정의를 보여준다.
-----------------------------------------------------------------------------------------------------------
더미 게임 오브젝트를 사용하자
이제 우린 피격시 카메라가 흔들리고 싶다. 그런데 흔들리는 중에 이동이 입력되는 어떻게 되는거지 ??
당연히 둘이 충돌이 일어난다. 그럼 어떻게 해결해야 할까 ?? 이때 이 해결법을 우리가 이미 알고있다 바로
계층 구조이다.
어떠한 더미 게임 오브젝트의 자식에 메인카메라가 있고 이 게임오브젝트에 이동을 구현한다면, 이 오브젝트가 움직이면 카메라는 자식이므로 당연히 따라서 움직이게 될것이다. 대부분의 FPS 가 이를 채택하고 있다고 한다.
자 이제 움직임을 한번 구현해 봅시다. 일단 가장먼저 시작해야 할것은 ?
CharacterController characterController = null;
※ GetComponent 는 그냥쓰면 굉장히 비효율적이다. 몇개가 있는지도 모르는 컴퍼넌트들을 하나하나
돌아가면서 비교작업을 해야하기 때문이다. 그래서 미리 그 형태를 미리 알려주는 것이다. 이러한 것을
캐싱 이라고 한다.
void Start()
{
characterController = GetComponent<CharacterController>();
}
-----------------------------------------------------------------------------------------------------------
움직이자.
CharacterController characterController = null;
public Transform cameraTransform;
public float moveSpeed = 10.0f;
※ CharacterController 을 미리 선언을 해주는 이 과저을 캐싱 이라고한다.
그리고 public Transform cameraTransform 을 하면 inspector 에 이부분이 나온다 이제
메인 카메라를 드래그앤 드롭으로 여기에 직접링크를 걸어주면 해당 오브젝트를 내 클래스로
가져오는 방법이다. 이것이 GetComponent 보다 빠르다 직접 링크되기때문.
void Start()
{
characterController = GetComponent<CharacterController>();
}
void Update()
{
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
※ Horizontal 과 Vertical 을 입력받는다.
Vector3 moveDirection = new Vector3(x, 0, z);
moveDirection = cameraTransform.TransformDirection(moveDirection);
moveDirection *= moveSpeed;
※ 카메라 ( 우리가 연결해준 메인카메라 ) 가 바라보는 방향을 기준으로 새로운 좌표계를 설정해주는
부분이다. 이렇게 해야 우리가 W를 눌렀을때, 바라보는 방향으로 가게된다. 이렇게 안한다면 W를 눌렀을때 원래 앞방향으로 가고 시선은 내가 보던방향으로 갈것이다. 옆을 보고 앞으로 걸어가는 현상이락 생각하면 될것이다.
characterController.Move(moveDirection * Time.deltaTime);
※ CharacterController 컴퍼넌트에 있는 Move 함수를사용하는 것으로 어쨋든 움직이므로 Time.deltaTime 을 곱해준다.
}
-----------------------------------------------------------------------------------------------------------
이제 점프를 하고 중력을 만들어 주자 ( 이단 점프 까지 구현했다 )
CharacterController characterController = null;
public Transform cameraTransform;
public float moveSpeed = 10.0f;
public float jumpSpeed = 10.0f; // 점프 힘 !
public float gravity = -20.0f; // 중력 파워
int isGround = 0; // 이단 점프 체크를 위한 함수
float yVelocity = 0.0f; // y축 값
void Start()
{
characterController = GetComponent<CharacterController>();
}
void Update()
{
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
Vector3 moveDirection = new Vector3(x, 0, z);
moveDirection = cameraTransform.TransformDirection(moveDirection);
moveDirection *= moveSpeed;
if (characterController.isGrounded == true)
{
yVelocity = 0.0f;
isGround = 0;
}
※ 캐릭터컨트롤러에 있는 자체함수 isGrunded 를 이용하여 ( 땅에 닿아있으면 true 반환 )
땅에 닿아 있다면 y 의 위치를 0.0 으로 초기화 하고 점프횟수를 0으로 초기화한다.
yVelocity = 0.0f 부분이 없다면, 중력값이 음수로 계속 누적이 되어서, 만약 땅을 벗어나
추락해야할 부분에 도달하는 순간 순간이동해서 어마어마하게 큰 음수값의 위치로 순간이동 할것
isGround = 0 ; 이 없다면 점프횟수가 증가만 해서 결국은 영원히 땅에서 뛸수 없게 될것이다.
if (Input.GetButtonDown("Jump") && isGround <= 1)
{
yVelocity = jumpSpeed;
isGround += 1;
}
※ 점프 버튼이 눌리고 점프 횟수가 1회 이하 이면 실행이 된다.
yVelocity = jumpSpeed 로 y값이 jujmpSpeed 로 세팅되고
isGround += 1 로 점프 횟수가 1회 증가하게 된다. 2회가 되면 이 if 문을 스킵할것이다.
yVelocity += gravity * Time.deltaTime;
※ 중력은 항상 작요하고 있어야 한다.
moveDirection.y = yVelocity;
※ 아까 만든 moveDirection 의 y값을 yVelocity 값으로 세팅해준다.
characterController.Move(moveDirection * Time.deltaTime);
※ 아까 yVelocity = Jumpspeed 로 하고 따로 처리를 안했지만 여기서 자도으로 Time.deltaTime 을 곱해준다.
}
-----------------------------------------------------------------------------------------------------------
내가 하던것을 다른데서도 하고싶다. 어떻해 해야하는가 ?
EDIT - Project Setting - Editor 에 들어가서
Version Control - Move :: Visible Meta Files
Asset Serialization :: Force Text
셋팅을 하고 Scene 저장한 다음에 유니티를 끄고,
프로젝트 폴더에서 Asset 과 Project Setting 두 폴더를 압축해서 알아서 보내면 된다.
이제 그 압축파일을 풀고, Scene 을 열면짜잔 내가 하던작업이당.