본문 바로가기
공부/Unity 기초

3D FPS - 1 / 이동과 회전, 점프

by svcbn 2022. 5. 17.

 

Cube를 펼쳐 Floor를 만들기

 

 

Capsule로 Player 생성하고 Main Camera를 부착

 

 

 

이동 구현

 

PlayerMove 스크립트 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


// 사용자의 입력에 따라 앞뒤좌우로 이동하고싶다.
public class PlayerMove : MonoBehaviour
{

    // 크기
    public float speed = 5;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        // 사용자의 입력에 따라
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        // 앞뒤좌우로 방향을 만들고
        Vector3 dir = Vector3.right * h + Vector3.forward * v;

        // dir의 크기를 1로 만들고싶다.
        dir.Normalize();

        // 그 방향으로 이동하고싶다.
        // P = P0 + vt
        transform.position += dir * speed * Time.deltaTime;

    }
}

 

 

 

 

회전 구현

 

마우스로 회전 동작을 하기 위한

CameraRotate 스크립트 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 마우스의 입력값을 이용해서 회전하고싶다.
public class CameraRotate : MonoBehaviour
{
    float rx;
    float ry;
    public float rotSpeed = 200;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        // 마우스의 입력값을 이용해서
        float mx = Input.GetAxis("Mouse X");
        float my = Input.GetAxis("Mouse Y");
        rx += my * rotSpeed * Time.deltaTime;
        ry += mx * rotSpeed * Time.deltaTime;

        // rx의 회전 각을 제한하고싶다. +80도 -80도
        rx = Mathf.Clamp(rx, -80, 80);

        // 회전하고싶다.
        transform.eulerAngles = new Vector3(-rx, ry, 0);

    }
}

Clamp : 성분을 최대치와 최소치 안에서 유지되게끔 조정

 

 

 

카메라의 회전에 따른 이동방향 변경

 // 카메라가 바라보는 방향을 앞방향으로 하고싶다.
        dir = Camera.main.transform.TransformDirection(dir);

 

 

 

 

점프 구현

 

중력과 가속도 변수를 만들고

Start에 ChracterController 가져오기

public float gravity = -9.81f;
    public float jumpPower = 10;
    float yVelocity;

    CharacterController cc;

    // Start is called before the first frame update
    void Start()
    {
        cc = GetComponent<CharacterController>();
    }

 

Update에서 가속도 계산

void Update()
    {
        // y속도에 중력을 계속 더하고싶다.
        yVelocity += gravity * Time.deltaTime;

        // 만약 사용자가 점프버튼을 누르면 y속도에 뛰는힘을 대입하고싶다.
        if (Input.GetButtonDown("Jump"))
        {
            yVelocity = jumpPower;
        }

        // 사용자의 입력에 따라
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        // 앞뒤좌우로 방향을 만들고
        Vector3 dir = Vector3.right * h + Vector3.forward * v;

        // 카메라가 바라보는 방향을 앞방향으로 하고싶다.
        dir = Camera.main.transform.TransformDirection(dir);

        // dir의 크기를 1로 만들고싶다.
        dir.Normalize();

        // y 속도를 최종 dir의 y에 대입하고싶다.
        dir.y = yVelocity;

        // 그 방향으로 이동하고싶다.
        // P = P0 + vt
        cc.Move(dir * speed * Time.deltaTime);

    }

Move : ChracterController에 포함된 기능으로 이동과 동시에 충돌검사

 

 

PlayerMove 전문

 

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


// 사용자의 입력에 따라 앞뒤좌우로 이동하고싶다.
// 점프를 뛰고싶다.  중력, 뛰는힘, y속도
public class PlayerMove : MonoBehaviour
{

    // 크기
    public float speed = 5;
    public float gravity = -9.81f;
    public float jumpPower = 10;
    float yVelocity;

    CharacterController cc;

    // Start is called before the first frame update
    void Start()
    {
        cc = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        // y속도에 중력을 계속 더하고싶다.
        yVelocity += gravity * Time.deltaTime;

        // 만약 사용자가 점프버튼을 누르면 y속도에 뛰는힘을 대입하고싶다.
        if (Input.GetButtonDown("Jump"))
        {
            yVelocity = jumpPower;
        }

        // 사용자의 입력에 따라
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        // 앞뒤좌우로 방향을 만들고
        Vector3 dir = Vector3.right * h + Vector3.forward * v;

        // 카메라가 바라보는 방향을 앞방향으로 하고싶다.
        dir = Camera.main.transform.TransformDirection(dir);

        // dir의 크기를 1로 만들고싶다.
        dir.Normalize();

        // y 속도를 최종 dir의 y에 대입하고싶다.
        dir.y = yVelocity;

        // 그 방향으로 이동하고싶다.
        // P = P0 + vt
        cc.Move(dir * speed * Time.deltaTime);

    }
}

 

'공부 > Unity 기초' 카테고리의 다른 글

3D FPS - 3 / 무기 제작  (0) 2022.05.18
3D FPS - 2 / 시점 변화  (0) 2022.05.17
2D 슈팅 - 9 / 누적점수에 따른 속도변경  (0) 2022.05.17
2D 슈팅 - 8 / 함정 추가  (0) 2022.05.16
2D 슈팅 - 7 / 총알 추가  (0) 2022.05.16