VIM Hanul Lim
기본적으로 지원하지 않는 기능을 활용하 기 위해 사용하는 소스코드 – 종류 : C#, Javascript, Boo – 추천언어 C# : 고급기능 활용하기에 용이함 Javascript : 초보가 활용하기에 용이함 – 스크립트 Reference ence/index.html ence/index.html
Inspector 창에서 – Add Component> New Script> 이름 및 언어설정
스크립트 더블클릭 > MonoDevelop 실행 – 기본 스크립트 편집기 – Compile 이나 디버깅이 바로 되지는 않음 Edit> Preference> External Tool> External Script Tool 에서 다른 툴로 변경 가능 (VS)
Random.RandomRange(-50.0f, 50.0f); – -50~50 까지의 float 값을 생성하는 함수 transform.position = new Vector3(x, y, z); – x, y, z 의 값에 알맞게 해당 Script 가 포함된 object 를 위치시킴 – 이를 이용해 시간에 따라 변화시키면 이동 가능 – Vector 를 활용하여 값을 변경할 수 있음 개별 값 변화할 경우에도 Vector3 를 활용해야 함
회전 예제 – transform.Rotate(x, y, z); 각 축에 대해 입력된 각도로 해당 스크립트를 포함 한 오브젝트의 각도를 수정함 여기에 일정한 값을 더하거나 빼서 오브젝트의 방향 이동이 가능함 실제로 회전시키면 다소 어색하고 원하지 않는 각이 나옴 – transform.Rotation = Quaternion.Euler(x, y, z); 동일하게 회전 역할을 하는 함수이나 더 많이 사용
물체의 속도 변경 – 오브젝트에 rigidbody 추가 – 오브젝트에 C# script 추가 – C# script 편집기 실행 – Void Update() 함수 내에 다음과 같이 입력 rigidbody.velocity = new Vector3( 3.1f, 0, 0 ); 반드시 소수는 뒤에 f 를 붙여줘야 에러가 안 남 X 축 방향으로 3.1 의 속도를 물체에 부여하는 코드
물체의 가속도 부여 – 오브젝트에 rigidbody 추가 – 오브젝트에 C# script 추가 – C# script 편집기 실행 – Void Update() 함수 내에 다음과 같이 입력 rigidbody.velocity += new Vector3( 0.1f, 0, 0 ); X 축 방향으로 0.1 의 속도를 지속적으로 더하는 코드
물체의 위치 변경 – C# script 편집기 실행 – Void Update() 함수 내에 다음과 같이 입력 transform.position += new Vector3(0.1f, 0, 0); 지속적으로 물체의 현재 위치에서 매 프레임마다 X 축 방향으로 0.1 만큼 이동시키는 코드 – rigidbody 를 추가하지 않고도 사용 가능 – 물리엔진이 들어가지 않았기 때문에 회전하거 나 저항이 생기지 않음
예제 1 : 속도 지정 – 부자연스러운 움직임으로 추천하지 않음 예제 2 : 가속도 지정 – 벡터의 크기 변화를 통하여 오브젝트의 움직임 이 자연스럽게 표현될 수 있음 예제 3 : 위치 변경 – 회전과 함께 사용하면 FPS 등에 활용하기는 좋 으나 역시 움직임이 부자연스러움
Key 입력 – If(Input.GetKey(KeyCode.W)) { //to do something } – W 입력 시 지정된 행동을 함 – KeyCode. 을 입력 후 자동완성 창에서 원하는 키 입력이 있는지 찾아보고 선택할 것
Key 입력 처리 예제 – Key 입력을 줄 Object 를 선택하고 Inspector 창 에서 Rigidbody 항목에 Drag( 저항 ) 를 1 로 지정 – If(Input.GetKey(KeyCode.W)) { rigidbody.velocity += new Vector3(0, 0, 0.2f); } – 상기 함수와 같이 S, A, D 에 대해서도 입력 처리
if 문 4 개를 단순히 나열만 하더라도 키 입력 자체를 중복으로 받아들이므로 대각선 이 동이 자연스럽게 인식됨 구체에 적용한 경우 Rigidbody 가 있기 때문 에 표면에서 회전하는 모습을 볼 수 있음 저항을 1 로 지정했기 때문에 일정 이상 빨 라지지 않음을 확인할 수 있음
10 분간 휴식한 후 진행하도록 하겠습니다.
카메라 시야 처리 예제 – Camera 에 스크립트 생성 – Camera class 내에 다음과 같이 선언 public GameObject target;// 필히 함수 밖에 선언 – Camera 오브젝트의 Inspector 창에서 Script 부분을 보면 target 이 새로 생성되었으며 None (Game Object) 라고 되어 있음 – 여기에 이동 스크립트를 넣은 오브젝트를 드래그 앤 드롭 – void update() 내에 transform.LookAt(target.tranform); 입력 후 실행
마우스 입력처리를 통한 시야 회전 – Camera 클래스 내에 다음을 선언 Vector3 offset;// 카메라가 일정 거리에 // 머물도록 하기 위한 상대 좌표 public float sensitivityX = 8f;//X 축 회전 민감도 public float sensitivityY = 8f;//Y 축 회전 민감도 float mHdg = 0f;//X 축 회전 인지를 위한 변수 float mPitch = 0f;//Y 축 회전 인지를 위한 변수
– void Start() 함수 내에 다음을 입력 offset = transform.position – target.transform.position; offset 에 최초 배치된 거리만큼 항상 일정하게 카메라와 target 오브젝트 간의 상대 거리가 유지되도록 하기 위 해 start 함수에서 지정함 – 다음 세 함수는 Start 와 Update 외부에 정의할 것 – void ChangeHeading(float aVal) //X 축 회전 함수 정의 { mHdg += aVal; WrapAngle(ref mHdg); transform.localEulerAngles = new Vector3(mPitch, mHdg, 0); }// 재사용 할 수 있으니 따로 저장해 둘 것
– void ChangePitch(float aVal) //Y 축 회전 함수 정의 { mPitch += aVal; WrapAngle(ref mPitch); transform.localEulerAngles = new Vector3(mPitch, mHdg, 0); }// 재사용 할 수 있으니 따로 저장해 둘 것 – public static void WrapAngle(ref float angle) { // 각도가 -360 = 360 = 0 이 되도록 맞추기 위한 함수 if(angle < -360f) angle += 360f; if(angle > 360f) angle -= 360f; }
– void Update() 함수 내에 다음을 입력할 것 Vector3 desiredPosition = target.transform.position + offset; // 매 프레임마다 상대 거리를 계산함 transform.position = desiredPosition; // 계산 된 상대 거리에 카메라 위치를 이동 float deltaX = Input.GetAxis(“Mouse X”) * sensitivityX; float deltaX = Input.GetAxis(“Mouse Y”) * sensitivityY; // 마우스의 x, y 축 변화를 체크 함 If(true){ ChangeHeading(deltaX); ChangePitch(-deltaY); }
마우스의 이동에 따라 시야가 변함 카메라와 대상 오브젝트간 거리는 고정 Update 함수 내 ChangeHeading 과 ChangePitch 함수를 감싼 if 문의 조건에 Input.GetMouseButton(0) 을 넣으면 왼쪽 버 튼을 클릭할 시에만 화면 시점 조정
점프 예제 – 다음 코드를 void Update 함수 내 입력 If(input.GetKey(KeyCode.Space)) { rigidbody.velocity += new Vector3(0, 5, 0); } – 항상 Spacebar 가 눌러진 동안 위쪽 속도 발생 – 한 번만 점프하도록 만들어야 함
– Input 을 체크하는 if 문 안을 다음과 같이 변경 우선 오브젝트의 클래스 내 bool JumpFlag = false; 를 선언 If(JumpFlag == false) { rigidbody.velocity += new Vector3(0, 3, 0); JumpFlag = true; } if(transform.position.y <= 0.5) jumpFlag = false;
JumpFlag 를 두어 위쪽 속도를 얻는 즉시 Flag 값을 변경시키고 오브젝트의 높이가 0.5, 즉, 바닥에 닿지 않으면 점프를 허용하 지 않음 이를 통해 지속적으로 올라가는 것을 방지 추후 오브젝트간 충돌체크를 통해 좀 더 정 교하게 가다듬을 수 있음
키 입력, 마우스 입력을 통해 게임 제작 물체의 뒷면만을 보이도록 하는 카메라 생성 – 현재 : 마우스를 회전하면 제자리에서 회전 – 목표 : 오브젝트를 중심으로 회전하도록 오브젝트도 같이 회전할 것 (TPS) LookAt 함수 + 마우스 이동 시 원운동 적용
프로젝트 시작 – 계획서 작성해서 옵니다. Ragdoll 다루기 3D 애니메이션 적용 방법
일정, 내용 등등