[SKKU DT] 11일차 -FPS 게임 만들기(1) -캐릭터 이동

2023. 11. 13. 14:06SKKU 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
반응형