[SKKU DT] 11일차 -FPS 게임 만들기(1) -캐릭터 이동
2023. 11. 13. 14:06ㆍSKKU DT
728x90
반응형
기본적 기능부터 만들고 이후에 모델링 씌우기
그라운드와 플레이어 만들기
카메라 스크립트 작성 -1인칭 카메라
마우스 입력 값을 받아서 두리번 거리기 -Input Manager 사용
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CamRotate : MonoBehaviour
{
//회전 속도 변수
public float rotSpeed = 200f;
//회전 값 변수 초기화
float mx = 0;
float my = 0;
void Update()
{
//마우스 입력 받기
float mouseX = Input.GetAxis("Mouse X");
float mouseY = Input.GetAxis("Mouse Y");
//회전 값 변수에 마우스 입력 값 누적(거=속*시)
mx += mouseX * rotSpeed * Time.deltaTime;
my += mouseY * rotSpeed * Time.deltaTime;
//상하 회전 -90 ~ 90 제한, Clamp가 최대 최소 설정 가능
my = Mathf.Clamp(my, -90f, 90f);
//카메라 회전 mx, my가 반대, 마이너스 붙이는 것에 주의
transform.eulerAngles = new Vector3(-my, mx, 0);
}
}
카메라에 스크립트를 넣고 적용한다.
플레이어도 카메라와 같이 회전해야 자연스럽다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerRotate : MonoBehaviour
{
public float rotSpeed = 200f;
float mx = 0;
void Update()
{
float mouseX = Input.GetAxis("Mouse X");
mx += mouseX * rotSpeed * Time.deltaTime;
transform.eulerAngles = new Vector3(0, mx, 0);
}
}
PlayerRotate 스크립트를 작성하여 Player에 적용한다.
Player 아래에 빈오브젝트를 만들어서 1인칭 카메라의 위치를 조정한다.
public으로 카메라의 포지션에 CamPosition을 가져와야 한다. CamFollow 스크립트를 하나 만들어서 적용한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CamFollow : MonoBehaviour
{
//CamPosition의 Transform 컴포넌트
public Transform camTarget;
void Update()
{
//카메라 위치를 타겟 위치에 일치시키기
transform.position = camTarget.position;
}
}
PlayerMove 플레이어 이동 스크립트 생성 후 적용. 플레이어가 바라보는 방향으로 움직여야함.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public float moveSpeed = 7f;
void Update()
{
//키보드 입력 받기
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
//이동 방향 설정
Vector3 dir = new Vector3(horizontal, 0, vertical);
dir = dir.normalized;
//바라보는 기준 방향으로 움직이기
dir = Camera.main.transform.TransformDirection(dir);
//이동
transform.position += dir * moveSpeed * Time.deltaTime;
}
}
중력 적용하기(캐릭터는 RigidBody 대신 다른 것을 이용한다.)
Character Controller 컴포넌트 추가, 기존의 캡슐 콜라이더는 삭제
PlayerMove 스크립트에도 Character Controller를 추가한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public float moveSpeed = 7f;
//캐릭터 컨트롤러 컴포넌트 변수
CharacterController cc;
//중력 변수
float gravity = -20f;
//수직 속력 변수 초기화
float yVelocity = 0;
private void Start()
{
//컴포넌트 변수는 Start 함수에서 할당을 해주어야 한다.
cc = GetComponent<CharacterController>();
}
void Update()
{
//키보드 입력 받기
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
//이동 방향 설정
Vector3 dir = new Vector3(horizontal, 0, vertical);
dir = dir.normalized;
//바라보는 기준 방향으로 움직이기
dir = Camera.main.transform.TransformDirection(dir);
//수직 속도에 중력 값 적용
yVelocity += gravity * Time.deltaTime;
dir.y = yVelocity;
//이동
cc.Move(dir * moveSpeed * Time.deltaTime);
}
}
PlayerMove에 점프 추가하기(스페이스 누르면 점프), Input Manager 참고
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public float moveSpeed = 7f;
//캐릭터 컨트롤러 컴포넌트 변수
CharacterController cc;
//중력 변수
float gravity = -20f;
//수직 속력 변수 초기화
float yVelocity = 0;
//점프력 변수
public float jumpPower = 7f;
private void Start()
{
//컴포넌트 변수는 Start 함수에서 할당을 해주어야 한다.
cc = GetComponent<CharacterController>();
}
void Update()
{
//키보드 입력 받기
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
//이동 방향 설정
Vector3 dir = new Vector3(horizontal, 0, vertical);
dir = dir.normalized;
//바라보는 기준 방향으로 움직이기
dir = Camera.main.transform.TransformDirection(dir);
//점프 후 중력값 적용을 위해 중력 값 적용 위에 쓴다. Space 누르면 점프
if (Input.GetButtonDown("Jump"))
{
yVelocity = jumpPower;
}
//수직 속도에 중력 값 적용
yVelocity += gravity * Time.deltaTime;
dir.y = yVelocity;
//이동
cc.Move(dir * moveSpeed * Time.deltaTime);
}
}
무한 연속 점프 막기(바닥에 떨어졌을 때만 bool이 false가 되어 다시 뛸 수 있게 만들기)
일반 점프
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public float moveSpeed = 7f;
//캐릭터 컨트롤러 컴포넌트 변수
CharacterController cc;
//중력 변수
float gravity = -20f;
//수직 속력 변수 초기화
float yVelocity = 0;
//점프력 변수
public float jumpPower = 7f;
//점프 상태 변수 처음엔 점프 안하므로 false
public bool isJumping = false;
private void Start()
{
//컴포넌트 변수는 Start 함수에서 할당을 해주어야 한다.
cc = GetComponent<CharacterController>();
}
void Update()
{
//키보드 입력 받기
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
//이동 방향 설정
Vector3 dir = new Vector3(horizontal, 0, vertical);
dir = dir.normalized;
//바라보는 기준 방향으로 움직이기
dir = Camera.main.transform.TransformDirection(dir);
//캐릭터가 바닥에 착지 했다면 = 바닥면이 닿았다면
if(cc.collisionFlags == CollisionFlags.Below)
{
isJumping = false;
yVelocity = 0; //값을 0으로 초기화
}
//점프 후 중력값 적용을 위해 중력 값 적용 위에 쓴다. Space 누르면 점프
if (Input.GetButtonDown("Jump") && !isJumping)
{
yVelocity = jumpPower;
isJumping = true;
}
//수직 속도에 중력 값 적용
yVelocity += gravity * Time.deltaTime;
dir.y = yVelocity;
//이동
cc.Move(dir * moveSpeed * Time.deltaTime);
}
}
2단 점프(응용)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public float moveSpeed = 7f;
//캐릭터 컨트롤러 컴포넌트 변수
CharacterController cc;
//중력 변수
float gravity = -20f;
//수직 속력 변수 초기화
float yVelocity = 0;
//점프력 변수
public float jumpPower = 7f;
//점프 상태 변수 처음엔 점프 안하므로 false
public int isJumping = 0;
private void Start()
{
//컴포넌트 변수는 Start 함수에서 할당을 해주어야 한다.
cc = GetComponent<CharacterController>();
}
void Update()
{
//키보드 입력 받기
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
//이동 방향 설정
Vector3 dir = new Vector3(horizontal, 0, vertical);
dir = dir.normalized;
//바라보는 기준 방향으로 움직이기
dir = Camera.main.transform.TransformDirection(dir);
//캐릭터가 바닥에 착지 했다면 = 바닥면이 닿았다면
if(cc.collisionFlags == CollisionFlags.Below)
{
isJumping = 0;
yVelocity = 0; //값을 0으로 초기화
}
//점프 후 중력값 적용을 위해 중력 값 적용 위에 쓴다. Space 누르면 점프
if (Input.GetButtonDown("Jump"))
{
if(isJumping == 0 || isJumping == 1)
{
yVelocity = jumpPower;
isJumping += 1;
}
}
//수직 속도에 중력 값 적용
yVelocity += gravity * Time.deltaTime;
dir.y = yVelocity;
//이동
cc.Move(dir * moveSpeed * Time.deltaTime);
}
}
728x90
반응형
'SKKU DT' 카테고리의 다른 글
[SKKU DT] 12일차 -FPS 게임 만들기(3) -적 만들기, 적 구현 (0) | 2023.11.14 |
---|---|
[SKKU DT] 11일차 -FPS 게임 만들기(2) -무기 만들기(폭탄, 총) (0) | 2023.11.13 |
[SKKU DT] 10일차 -프로빌더 도면 기반 집만들기 (0) | 2023.11.10 |
[SKKU DT] 9일차 -프로빌더 파라솔 만들기, 풍력발전기 만들기, 캐릭터 만들기 (0) | 2023.11.09 |
[SKKU DT] 8일차 프로빌더, UV (0) | 2023.11.08 |