Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 개인 프로젝트 - 런앤건
- 7월
- 2025년
- 프로그래머스
- 5월
- todolist
- 4월
- 기초
- 유니티 심화과정
- 3월
- 2022년
- 2024년
- 백준
- c++
- 개인 프로젝트
- 골드메탈
- 유니티
- 2월
- 수학
- 다이나믹 프로그래밍
- C/C++
- 입문
- 1월
- 코딩 테스트
- 10월
- 단계별로 풀어보기
- 자료 구조
- 2023년
- 코딩 기초 트레이닝
- 게임 엔진 공부
Archives
- Today
- Total
기록 보관소
[Unity/유니티] 기초-뱀서라이크: 플레이어 이동 구현하기[02] 본문
개요
유니티 독학을 위해 아래 링크의 골드메탈님의 영상들을 보고 직접 따라 해보면서 진행 상황을 쓰고 배웠던 점을 요약한다.
https://youtube.com/playlist?list=PLO-mt5Iu5TeYI4dbYwWP8JqZMC9iuUIW2
📚유니티 기초 강좌
유니티 게임 개발을 배우고 싶은 분들을 위한 기초 강좌
www.youtube.com
뱀서라이크: 플레이어 이동 구현하기[02]
1. C# 스크립트 만들기
- Inspector 창에 보이듯 스크립트 생성시 해당 클래스는 MonoBehaviour 클래스를 상속받는다.
- MonoBehaviour 클래스는 기본적인 게임 로직을 위한 함수, 속성 등이 포함된 클래스다.
- 번외로, 유니티에서 스크립트를 실행할 때 Visual Studio 버전 변경이나 다른 에디터를 사용하려면 위와 같이 유니티 Preferences 변경 과정을 따르면 된다.
- 이 외에 다른 자세한 사항은 마이크로소프트의 설명을 찾아보면 될 것 같다.
2. 키보드 입력 받기
//Plyaer Script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
public Vector2 inputVector; //입력 값 저장 변수
void Start() {
}
void Update() { //하나의 프레임마다 한 번씩 호출되는 생명주기 함수. 대문자 유의할 것.
//Input : 유니티에서 받는 모든 입력을 관리하는 클래스. Axis 값은 -1 ~ 1.
inputVector.x = Input.GetAxis("Horizontal"); //좌,우 방향키 또는 A,D 키
inputVector.y = Input.GetAxis("Vertical"); //상,하 방향키 또는 W,S 키
}
}
- 일단 키보드 입력을 잘 받고 있는지 확인하기 위해서 inputVector를 public으로 했다.
- Axis 값의 범위는 -1 ~ 1로 Horizontal의 경우 좌측이 -1, 우측이 1이 되고 Vertical의 경우 위쪽이 1, 아래쪽이 -1이 된다.
3. 물리 이동 방법
//Plyaer Script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
Vector2 inputVec; //입력 값 저장 변수
Rigidbody2D rigid;
void Awake() { //시작할 때 한번만 실행되는 생명주기 함수
rigid = GetComponent<Rigidbody2D>(); //GetComponent<T> : 오브젝트에서 컴포넌트 T를 가져오는 함수
}
void Update() { //하나의 프레임마다 한 번씩 호출되는 생명주기 함수. 대문자 유의할 것.
//Input : 유니티에서 받는 모든 입력을 관리하는 클래스. Axis 값은 -1 ~ 1.
inputVec.x = Input.GetAxis("Horizontal"); //좌,우 방향키 또는 A,D 키
inputVec.y = Input.GetAxis("Vertical"); //상,하 방향키 또는 W,S 키
}
void FixedUpdate() { //물리 연산 프레임마다 호출되는 생명주기 함수
//1. 힘을 준다 = AddForce
rigid.AddForce(inputVec); //입력 방향으로 밀기
//2. 속도 제어 = Velocity
rigid.velocity = inputVec; //속도 직접 제어
//3. 위치 이동 = MovePosition
rigid.MovePosition(rigid.position + inputVec); //현재 위치 + 나아갈 방향 : (x, y) 좌표 활용
}
}
- Rigidbody 2D를 사용한 물리 이동 방법으로는 3가지가 방법이 있다. 여태 배운 것을 정리한다고 보면 될듯하다.
- 힘 주기 : Add Force
- 속도 제어 : velocity
- 위치 이동 : MovePosition
- 추가적으로 앞서 입력 확인을 위해 public으로 설정했던 inputVector 변수를 다시 private로 변경하고, 변수 이름도 영상에 맞추기 위해서 inputVec으로 바꿔주었다.
4. 물리 이동 구현
//Plyaer Script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
Vector2 inputVec; //입력 값 저장 변수
Rigidbody2D rigid;
void Awake() { //시작할 때 한번만 실행되는 생명주기 함수
rigid = GetComponent<Rigidbody2D>(); //GetComponent<T> : 오브젝트에서 컴포넌트 T를 가져오는 함수
}
void Update() { //하나의 프레임마다 한 번씩 호출되는 생명주기 함수. 대문자 유의할 것.
//Input : 유니티에서 받는 모든 입력을 관리하는 클래스. Axis 값은 -1 ~ 1.
inputVec.x = Input.GetAxis("Horizontal"); //좌,우 방향키 또는 A,D 키
inputVec.y = Input.GetAxis("Vertical"); //상,하 방향키 또는 W,S 키
}
void FixedUpdate() { //물리 연산 프레임마다 호출되는 생명주기 함수
//위치 이동
rigid.MovePosition(rigid.position + inputVec); //현재 위치 + 나아갈 방향 : (x, y) 좌표 활용
}
}
- 이번 강좌 프로젝트에서는 앞선 3가지 방식 중 3번 위치 이동 방식을 사용해서 플레이어 이동을 구현한다고 한다. 그래서 앞선 코드에서 1, 2번을 제거하고 테스트해보았다.
- 테스트 결과는 위 이미지에 보이듯이 잘 이동하지만 매우 빠르다. 살짝만 눌러도 꽤 많은 거리를 이동하고, 금방 화면 밖으로 빠져나간다. 그리고 프레임 환경에 따라 이동 속도 차이가 발생할 수 있기 때문에, 수정이 더 필요하다.
//Plyaer Script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
Vector2 inputVec; //입력 값 저장 변수
public float speed; //속도 관리용 변수
Rigidbody2D rigid;
void Awake() { //시작할 때 한번만 실행되는 생명주기 함수
rigid = GetComponent<Rigidbody2D>(); //GetComponent<T> : 오브젝트에서 컴포넌트 T를 가져오는 함수
}
void Update() { //하나의 프레임마다 한 번씩 호출되는 생명주기 함수. 대문자 유의할 것.
//Input : 유니티에서 받는 모든 입력을 관리하는 클래스. Axis 값은 -1 ~ 1.
inputVec.x = Input.GetAxis("Horizontal"); //좌,우 방향키 또는 A,D 키
inputVec.y = Input.GetAxis("Vertical"); //상,하 방향키 또는 W,S 키
}
void FixedUpdate() { //물리 연산 프레임마다 호출되는 생명주기 함수
//위치 이동
//normalized : 벡터 값의 크기가 1이 되도록 좌표가 수정된 값. 대각선 이동시 값 고정을 위함.
Vector2 nextVec = inputVec.normalized * speed * Time.fixedDeltaTime; //fixedDeltaTime : 물리 프레임 하나가 소비한 시간. Update에서는 DeltaTime 사용.
rigid.MovePosition(rigid.position + nextVec); //현재 위치 + 나아갈 방향 : (x, y) 좌표 활용
}
}
- 대각선 이동시 값을 1로 고정하기 위해 normalized하고, 또한 속도 조절을 위해서 float 변수 speed를 추가하고, 프레임 환경에 따른 차이가 없도록 Time 클래스의 fixedDeltaTime을 다 곱한 새로운 변수 nextVec값을 만들어 수정했다.
- 위 테스트 이미지에서 살짝 미끄러지듯 움직이는 것은 입력이 GetAxis 함수로 처리되어서 그렇다. 이를 바꾸려면 GetAxisRaw 함수를 사용하면 된다. 이는 취향의 영역이라 자유롭게 선택하면 될 것 같다. 나는 그 약간의 차이가 좀 거슬린다고 생각해서 GetAxisRaw로 변경했다.
//Plyaer Script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
Vector2 inputVec; //입력 값 저장 변수
public float speed; //속도 관리용 변수
Rigidbody2D rigid;
void Awake() { //시작할 때 한번만 실행되는 생명주기 함수
rigid = GetComponent<Rigidbody2D>(); //GetComponent<T> : 오브젝트에서 컴포넌트 T를 가져오는 함수
}
void Update() { //하나의 프레임마다 한 번씩 호출되는 생명주기 함수. 대문자 유의할 것.
//Input : 유니티에서 받는 모든 입력을 관리하는 클래스. Axis 값은 -1 ~ 1.
inputVec.x = Input.GetAxisRaw("Horizontal"); //좌,우 방향키 또는 A,D 키
inputVec.y = Input.GetAxisRaw("Vertical"); //상,하 방향키 또는 W,S 키
}
void FixedUpdate() { //물리 연산 프레임마다 호출되는 생명주기 함수
//위치 이동
//normalized : 벡터 값의 크기가 1이 되도록 좌표가 수정된 값. 대각선 이동시 값 고정을 위함.
Vector2 nextVec = inputVec.normalized * speed * Time.fixedDeltaTime; //fixedDeltaTime : 물리 프레임 하나가 소비한 시간. Update에서는 DeltaTime 사용.
rigid.MovePosition(rigid.position + nextVec); //현재 위치 + 나아갈 방향 : (x, y) 좌표 활용
}
}
'유니티 프로젝트 > 뱀서라이크' 카테고리의 다른 글
[Unity/유니티] 기초-뱀서라이크: 몬스터 만들기[05] (0) | 2023.05.22 |
---|---|
[Unity/유니티] 기초-뱀서라이크: 무한 맵 이동[04] (0) | 2023.04.08 |
[Unity/유니티] 기초-뱀서라이크: 2D 셀 애니메이션 제작하기[03] (0) | 2023.04.06 |
[Unity/유니티] 기초-뱀서라이크: 새로운 인풋시스템 적용하기[02+] (0) | 2023.03.30 |
[Unity/유니티] 기초-뱀서라이크: 2D 오브젝트 만들기[01] (0) | 2023.03.16 |