[2023 메타버스 달서 공모전] 출품을 위해, 제페토를 공부하는 일지
[Assets] → [Scenes] 폴더에 JumpMapScene
을 하나 생성한다.
플레이어를 세팅한다.
기존에 CharacterController.ts
컴포넌트를 적용했던 Player
오브젝트의 역할을, Character Controller
오브젝트가 하도록 변경하였다.
그리고 ZepetoPlayers
와 Character Controller
오브젝트를 Player
라는 빈 오브젝트의 자식으로 오게 하였다. (내가 보기 편하도록)
Publish 버튼 옆의 [▼] 버튼 → [Open World Settings]
유니티 최상단 메뉴 [File] → [Build Settings]에 현재 신을 추가해 주고, QR 테스트를 진행해 보았다.
실행 결과
오브젝트는 [3D Object] → [Cube]를 이용해서 일단 두 개 배치하였다.
맵에 색을 넣기 위해, Asset 폴더에 Materials 폴더를 만들고, 그 안에 새로운 Material을 생성해 준다. 이름은 Floor라고 지었다.
인스펙터 창의 Albedo 속성에서 원하는 색을 선택한다.
이 Floor
머티리얼을 드래그해서 신 뷰의 Plane
오브젝트에 놓으면, 바닥의 색이 바뀐다.
위와 같은 방법으로, 발판 오브젝트의 머티리얼도 생성해서 적용해 준다.
그 후 적당히 레벨을 디자인한다.
제페토에서 기본적으로 제공하는 SampleScript.ts
를 참고하여, 돌아가는 발판을 만들어 보자.
우선 직사각형의 발판을 만들어 준다.
📑 Rotator.ts
스크립트 생성
변수
// 각 축을 기준으로 회전하는 속도
public rotatorX : number = 0;
public rotatorY : number = 0;
public rotatorZ : number = 0;
Update()
함수
Update() {
// transform.Rotate(x, y, z): 매 프레임마다 -축을 기준으로, -의 속도로 회전
this.transform.Rotate(this.rotatorX, this.rotatorY, this.rotatorZ);
}
this
: 이 컴포넌트가 적용된 오브젝트transform.Rotate(x, y, z)
: 인자에 값을 넣으면, 해당 축을 기준으로 넣어준 속도만큼 회전한다. (Update 내부이니, 매 프레임마다 3의 속도로 회전하게 된다.)위 오브젝트에 Zepeto Script
컴포넌트를 추가한 다음, Rotator.ts
스크립트를 드래그해서 넣는다. 그리고 y축을 기준으로 1의 속도로 회전하도록 만든다.
실행 결과
일반적인 점프로는 닿을 수 없는 곳에 발판을 위치시킨다.
📑 Movement.ts
스크립트 생성
변수
public movingTime : number = 0; // 발판이 방향을 바꾸는 주기 (sec)
public movingRangeX : number = 0; // X축 방향으로 이동하는 범위
public movingRangeY : number = 0; // Y축 방향으로 이동하는 범위
private delta : number = 0; // deltaTime 값을 누적해서, 얼마의 시간이 흘렀는지를 판단
private movingFlag : boolean = true; // 어느 방향으로 움직일지 결정
movingTime
: 발판이 방향을 바꾸는 주기. 값이 1이면, 1초마다 방향을 바꾼다.movingRangeX
: 발판이 X축 방향으로 움직이는 범위movingRangeY
: 발판이 Y축 방향으로 움직이는 범위delta
: 매 프레임 간의 시간 차이인 deltaTime의 값을 누적해서, 얼마의 시간이 흘렀는지 판단한다.movingFlag
: 발판이 어느 방향으로 움직일지 결정 (true면 정방향, false면 역방향)Update()
함수
Update() {
// Time.deltaTime: 이전 프레임과 현재 프레임 사이의 시간 차이
this.delta += Time.deltaTime;
// 매 ~초마다 실행되는 코드
if (this.delta >= this.movingTime) {
this.delta = 0;
this.movingFlag = !this.movingFlag;
}
// movingFlag가 참일 땐 정방향으로 움직임
if (this.movingFlag) {
this.transform.Translate(this.movingRangeX * Time.deltaTime, this.movingRangeY * Time.deltaTime, 0);
} else {
this.transform.Translate(-this.movingRangeX * Time.deltaTime, -this.movingRangeY * Time.deltaTime, 0);
}
}
delta
에 Time.deltaTime
값을 누적한다.delta
의 값이 내가 설정한 movingTime
(방향 전환 시간)의 값보다 크거나 같아지면delta
의 값을 0으로 초기화하여, 다시 movingTime
을 체크하도록 한다.movingFlag
의 값을 반대로 바꾼다.movingTime
초마다 방향을 바꾸는 코드가 된다.movingFlag
의 값이 true이면, 정방향으로 움직이도록 한다.movingFlag
의 값이 false이면, 역방향으로 움직이도록 한다.상하로 움직이는 Cylinder (1) - Vertical
오브젝트에 위 스크립트를 적용한다.
Moving Time
과 Moving Range Y
속성에만 값을 입력하였다.좌우로 움직이는 Cylinder (3) - Horizontal
오브젝트에 위 스크립트를 적용한다.
Moving Time
과 Moving Range X
속성에만 값을 입력하였다.실행 결과
캐릭터 텔레포트
오브젝트 상호작용 구현
유니티 셰이더 공부
타입스크립트 공부