좋은 강의를 하나 찾은 것 같아서 한번 따라 만들어보려 한다.
강의 글
[유니티 3D 강좌] FPS 생존 게임 Part 0 : 강좌 소개.
[유니티 3D 강좌] 로우 폴리 오픈월드 FPS 생존 디펜스 게임. 이것이 다음으로 시작할 강좌의 전체적인 테마입니다. 오픈월드 : 하나의 큰 맵FPS : 1인칭생존 : 허기, 갈등 요소 + 채집, 건축, 농사 etc
keidy.tistory.com
강의 동영상
https://www.youtube.com/watch?v=uandR5M30ho&list=PLUZ5gNInsv_Nzex8Cvxce_1zjUf0cNWY9&pp=iAQB
FPS 생존 게임이다.
채집, 사냥, 디펜스 등의 요소가 들어가 있어 매우 흥미로워보인다.
서바이벌 게임도 만들어보고 싶었고, FPS 게임도 만들어보고 싶었는데 마침 잘 된것 같다.
첫 강의에서는 캐릭터의 움직임을 구현한다.
시작해보자.
유니티 3D 프로젝트를 생성하고 올려주신 에셋들을 다운받았다.
에셋들을 적용했다면 기본 큐브를 지우고, 바닥이 될 평면과 플레이어가 될 캡슐을 생성하자.
캡슐, 평면, 라이트 오브젝트의 이름을 사용할 이름으로 바꿔주자.
그리고 게임 화면에서 1인칭 화면으로 보이도록 메인 카메라 오브젝트를
플레이어 오브젝트의 하위 오브젝트로 넣고 위치를 초기화 시켜준다.
이제 게임 화면을 보면 플레이어의 시점으로 보이게 된다.
이제 플레이어가 움직일 수 있도록 스크립트를 작성해보자.
Assets 폴더 아래에 Scripts 폴더를 만들고 PlayerController 스크립트를 생성한다.
이제 플레이어가 움직일 수 있도록 스크립트를 작성하자
| PlayerController 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField] // 데이터 직렬화(이진화), 인스펙터에서 private 변수가 보이도록 설정
private float WalkSpeed; // 플레이어 걷는 속도
[SerializeField]
private float lookSensitivity; // 카메라 민감도 변수
[SerializeField]
private float cameraRotationLimit; // 카메라 회전 한도 변수
private float currentCameraRotationX; // 카메라 X 회전값
[SerializeField]
private Camera myCamera; // 플레이어의 카메라 레퍼런스
private Rigidbody myRigid; // 플레이어의 리지드바디 레퍼런스, 리지드바디를 통해 물리 적용.
void Start() {
myRigid = GetComponent<Rigidbody>(); // 현재 오브젝트의 리지드바디 컴포넌트를 가져옴
}
void Update() {
Move(); // 플레이어 이동 함수
CameraRotation(); // 카메라 회전(상하 시야 각 조절)함수
CharacterRotation(); // 플레이어 회전 (좌우 시야 각 조절)함수
}
// 플레이어 이동 함수
private void Move() {
float _moveDirX = Input.GetAxisRaw("Horizontal"); // 수평 이동 방향 변수
float _moveDirZ = Input.GetAxisRaw("Vertical"); // 수직 이동 방향 변수
Vector3 _moveHorizontal = transform.right * _moveDirX; // 수평 이동 방향 벡터
Vector3 _moveVertical = transform.forward * _moveDirZ; // 수직 이동 방향 벡터
Vector3 _moveVelocity = (_moveHorizontal + _moveVertical).normalized * WalkSpeed;
// 벡터 이동 속도, 노멀라이징(벡터 정규화)을 통해 대각선 이동 시에도 벡터 이동 속도값이 똑같도록 한다.
myRigid.MovePosition(transform.position + _moveVelocity * Time.deltaTime); // 플레이어 위치 변경
}
// 플레이어 카메라 회전(상하 시야각) 함수
private void CameraRotation() {
float _xRotation = Input.GetAxisRaw("Mouse Y"); // 마우스의 위 아래 이동값을 가져옴
float _cameraRotationX = _xRotation * lookSensitivity; // 카메라 X 회전값 설정
currentCameraRotationX -= _cameraRotationX; // 카메라 X 회전 각도 추가
currentCameraRotationX = Mathf.Clamp(currentCameraRotationX, -cameraRotationLimit, cameraRotationLimit);
// 카메라 X 회전값의 범위 지정
myCamera.transform.localEulerAngles = new Vector3(currentCameraRotationX, 0f, 0f);
// 카메라 X 회전 적용
}
// 플레이어 회전(좌우 시야각 회전)함수
private void CharacterRotation() {
float _yRotation = Input.GetAxisRaw("Mouse X"); // 마우스의 좌 우 이동값을 가져옴
Vector3 _characterRotationY = new Vector3(0f, _yRotation, 0f) * lookSensitivity;
// 플레이어 Y 회전값 설정
myRigid.MoveRotation(myRigid.rotation * Quaternion.Euler(_characterRotationY));
// 오일러 각도값을 쿼터니언 각도값으로 변환하여 플레이어 Y 회전 적용
}
}
모두 작성했다면 이제 스크립트와 리지드바디를 Player 오브젝트에 적용해주고 걷는 속도를 설정하자.
스크립트의 각 값들도 설정해주자.
다 설정했다면 이제 실행해보자.
플레이어가 방향키 또는 wasd 키를 입력 시 움직이고
마우스의 이동에 따라 시야가 회전하는 것을 볼 수있다.
'Unity > 게임개발' 카테고리의 다른 글
[Unity] 게임 개발 일지 | 탑다운 슈팅 25 (0) | 2024.02.22 |
---|---|
[Unity] 게임 개발 일지 | 탑다운 슈팅 24 (0) | 2023.12.19 |
[Unity] 게임 개발 일지 | 탑다운 슈팅 23 (0) | 2023.12.15 |
[Unity] 게임 개발 일지 | 탑다운 슈팅 22 (0) | 2023.12.14 |
[Unity] 게임 개발 일지 | 탑다운 슈팅 21 (0) | 2023.12.13 |