본문 바로가기
유니티 프로젝트/Team Project1 - Fall Guys

폴가이즈 _ 움직임

by SUGI_ 2022. 7. 10.

1.

유니티 - 키보드 입력을 통한 리지드바디 이동, 회전, 점프 기본 코드

https://rito15.github.io/posts/unity-rigidbody-move-and-jump/

 

유니티 - 키보드 입력을 통한 리지드바디 이동, 회전, 점프 기본 코드

Note 입력은 Update(), 물리 처리는 FixedUpdate()로 철저히 구분하는 것이 핵심

rito15.github.io

 

https://artiper.tistory.com/105

 

[Unity] RequireComponent란?

Unity - Scripting API: RequireComponent When you add a script which uses RequireComponent to a GameObject, the required component will automatically be added to the GameObject. This is useful to avo..

artiper.tistory.com

RequireComponent속성은 요구되는 컴포넌트를 종속성으로 자동으로 추가해줍니다.

 

SerializeField

https://luv-n-interest.tistory.com/352

 

SerializeField의 개념 [Unity]

하도 사람들이 쓰긴 하는데 잘 모른다? 그치? 그래서 알아보자 유니티에서 변수를 선언할 때 public이나 private 같은 접근제한을 선언하고는 한다. ++ protected도 있긴 하다. 접근 제한자는 왼쪽 링크

luv-n-interest.tistory.com

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

using SF = UnityEngine.SerializeField;

// WASD키 : 리지드바디 이동
// Space키 : 리지드바디 점프
// Alt키 : 커서표시 / 숨기기
// 커서 숨김 상태에서 마우스 움직임에 의한 리지드바디 좌우회전
[RequireComponent(typeof(Rigidbody))]
public class LHS_PhysicsMove : MonoBehaviour
{
    private Rigidbody rb;
    private Vector3 moveDir;
    private float hRot;

    // 입력 상태
    private bool isCursorLocked = false;
    private bool isMoving = false;
    private bool isRotating = false;
    private bool isJumpRequired = false;

    // 키 설정
    [SF] private KeyCode cursorLockKey = KeyCode.LeftAlt;
    [SF] private KeyCode jumpKey = KeyCode.Space;

    // 계수 설정
    [SF, Range(0f, 100f)] private float moveSpeed = 10f;
    [SF, Range(0f, 200f)] private float rotateSpeed = 100f;
    [SF, Range(0f, 100f)] private float jumpForce = 5f;

    private void Start()
    {
        if (!TryGetComponent(out rb))
            rb = gameObject.AddComponent<Rigidbody>();

        rb.freezeRotation = true; // 다른 강체에 부딪혔을 때 회전하지 않도록 설정한다.
        isCursorLocked = false;   // 마우스 커서 초기 상태 : 커서 표시 & 미잠금

        // FrameRate가 너무 높으면 FixedUpdate에 의한 회전이 부자연스러워진다.
        // 추후, targetFrameRate 설정 코드는 여기서 제거하고 매니저 클래스로 옮기는 것이 좋다.
        Application.targetFrameRate = 60;
    }

    private void Update()
    {
        ToggleCursorLock();
        Move();
        Rotate();
        Jump();
    }

    private void ToggleCursorLock()
    {
        // NOTE : cursorLockKey는 토글 키로 사용되며, 커서 잠금 및 표시 상태를 전환한다.
        if (Input.GetKeyDown(cursorLockKey))
        {
            isCursorLocked = !isCursorLocked;
            Cursor.lockState = isCursorLocked ? CursorLockMode.Locked : CursorLockMode.None;
            Cursor.visible = !isCursorLocked;
        }
    }

    private void Move()
    {
        // NOTE : GetAxis()를 사용할 경우, 정지 시 조금씩 미끄러지며 멈춘다.
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");

        isMoving = (h != 0f || v != 0f);

        if (isMoving)
        {
            moveDir = transform.TransformDirection(new Vector3(h, 0f, v));
            moveDir.Normalize();
        }
    }

    private void Rotate()
    {
        // NOTE 1 : "Mouse X"에 대한 GetAxis(), GetAxisRaw()는 차이가 없다.
        // NOTE 2 : 커서 잠금 및 미표시 상태에서만 회전하도록 한다.
        if (isCursorLocked)
        {
            hRot = Input.GetAxis("Mouse X");
            isRotating = (hRot != 0f);
        }
        else
            isRotating = false;
    }

    private void Jump()
    {
        if (Input.GetKeyDown(jumpKey))
            isJumpRequired = true;
    }

    private void FixedUpdate()
    {
        float fixedDeltaTime = Time.fixedDeltaTime;

        if (isMoving)
        {
            Vector3 moveOffset = moveDir * (moveSpeed * fixedDeltaTime);
            rb.MovePosition(rb.position + moveOffset);
        }

        if (isRotating)
        {
            float rotAngle = hRot * rotateSpeed * fixedDeltaTime;
            rb.rotation = Quaternion.AngleAxis(rotAngle, Vector3.up) * rb.rotation; // 좌우 회전
        }

        if (isJumpRequired)
        {
            rb.AddForce(new Vector3(0f, jumpForce, 0f), ForceMode.VelocityChange);
            isJumpRequired = false;
        }
    }
}

2.

마우스 입력에 따른 상하좌우 회전 예제

https://rito15.github.io/posts/unity-memo-rotation/#7-%EB%A7%88%EC%9A%B0%EC%8A%A4-%EC%9E%85%EB%A0%A5%EC%97%90-%EB%94%B0%EB%A5%B8-%EC%83%81%ED%95%98%EC%A2%8C%EC%9A%B0-%ED%9A%8C%EC%A0%84-%EC%98%88%EC%A0%9C

 

유니티 - 트랜스폼과 방향벡터의 회전

Memo

rito15.github.io

 

유니티 - 트랜스폼과 방향벡터의 회전

https://rito15.github.io/posts/unity-memo-rotation/

 

유니티 - 트랜스폼과 방향벡터의 회전

Memo

rito15.github.io

유니티 - 1인칭, 3인칭 전환 가능한 캐릭터 제작하기 | Rito15

 

유니티 - 1인칭, 3인칭 전환 가능한 캐릭터 제작하기

목차 1. 하이라키 구성 2. 스크립트 기초 3. 1인칭 이동, 회전 4. 3인칭 이동, 회전 5. 카메라 전환 6. 점프 7. 애니메이션 적용 8. 애니메이션 블렌딩 9. 카메라 전환 시 시점 방향 유지하기 10. 3인칭 카

rito15.github.io

https://codingmania.tistory.com/191 Toptip

728x90

'유니티 프로젝트 > Team Project1 - Fall Guys' 카테고리의 다른 글

Fall Guys - Alpha  (0) 2022.07.12
Fall Guys - Prototype  (0) 2022.07.10
폴가이즈 _ 장애물 추  (0) 2022.07.09
폴가이즈 _ 바운스 (참고)  (0) 2022.07.09
폴가이즈 2  (0) 2022.07.09