[Unity] ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ ์ œ์ž‘ํ•˜๊ธฐ - Rigidbody

2024. 5. 6. 19:21ยท โš™๏ธ ์—”์ง„/๐Ÿค ์œ ๋‹ˆํ‹ฐ

๋นˆ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ ๐Ÿ‘‰ ํ•˜์œ„์— Capsule ์‚ฝ์ž… ๐Ÿ‘‰ ํ•˜์œ„์— ๋ˆˆ ๋ถ™์—ฌ์ฃผ๊ธฐ

  • ๋นˆ ์˜ค๋ธŒ์ ํŠธ(์ดํ•˜ ๋ถ€๋ชจ ์˜ค๋ธŒ์ ํŠธ)์— Capsule Collider ์ปดํฌ๋„ŒํŠธ ์‚ฝ์ž…
  • Capsule์— ์žˆ๋Š” Capsule Collider๋Š” ๋น„ํ™œ์„ฑํ™”/์‚ญ์ œ
  • ๋ถ€๋ชจ ์˜ค๋ธŒ์ ํŠธ์˜ collider์˜ ์ค‘์‹ฌ์„ (0,1,0)์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค. ๐Ÿ‘‰ ์บ๋ฆญํ„ฐ์˜ ๋ฐœ๋์ด ํ•ญ์ƒ ์›์ ์„ ํ–ฅํ•˜๋„๋ก

  • capusle์˜ transform-position๋„ ์ˆ˜์ •ํ•ด์ค€๋‹ค.

  • ๋ถ€๋ชจ ์˜ค๋ธŒ์ ํŠธ์— rigidbody ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€

 

โœจ Rigidbody

  • mass : ์งˆ๋Ÿ‰ ๊ณ„์‚ฐ. ์ค‘๋ ฅ์—๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Œ. ๊ฐ™์€ rigidbody ์˜ค๋ธŒ์ ํŠธ๋ผ๋ฆฌ ์ถฉ๋Œํ•˜์˜€์„ ๋•Œ ๋ฐ˜์‘
  • drag : ๊ณต๊ธฐ์ €ํ•ญ๊ฐ’. ๊ฐ’์ด ์ž‘์„์ˆ˜๋ก ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฌด๊ฑฐ์›Œ ๋ณด์ด๊ณ , ๊ฐ’์ด ํฌ๋ฉด ๊ฐ€๋ฒผ์›Œ ๋ณด์ธ๋‹ค. ํด์ˆ˜๋ก ์ค‘๋ ฅ์ด ๊ฐ€ํ•ด์ง€์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.
  • angualr drag : ํšŒ์ „ํ•  ๋•Œ์˜ ๊ณต๊ธฐ์ €ํ•ญ๊ฐ’.
  • use gravity : ์ค‘๋ ฅ ์˜ํ–ฅ ์—ฌ๋ถ€
  • is kienematic : ๋ฌผ๋ฆฌ์—”์ง„์ด ์•„๋‹Œ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ ๋กœ์ง์— ๋”ฐ๋ผ์„œ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ด๋™ํ•  ๊ฒƒ์ธ์ง€
  • interpolate : ๋ฌผ๋ฆฌ์—”์ง„์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด๊ฐ„์„ ํ• ์ง€ ์—ฌ๋ถ€
  • collision detection : ์ถฉ๋Œ ์ฒ˜๋ฆฌ๋ฅผ ์—ฐ์†์ ์œผ๋กœ ํ•  ๊ฒƒ์ธ์ง€, ํŠน์ •ํ•œ ๊ฒฝ์šฐ์—๋งŒ ํ•  ๊ฒƒ์ธ
  • freeze position/rotation : ๋ฌผ๋ฆฌ์—”์ง„์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š”(๋ณ€๊ฒฝ๋˜๋Š”) ๊ฐ’๋“ค์„ ๋ณ€๊ฒฝ๋˜๋„๋ก ํ• ์ง€, ๋ง์ง€ ์—ฌ๋ถ€

 

๋ˆˆ์„ ๋ถ™์—ฌ์คŒ์œผ๋กœ์จ, ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์บ๋ฆญํ„ฐ๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ๊ฒƒ ํ™•์ธ ๊ฐ€๋Šฅ

(๋ˆˆ์€ ๊ทธ๋ƒฅ cube๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค. transform๋งŒ ์‚ด์ง ์ˆ˜์ •ํ•จ)

 

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

namespace FastCampus.Characters {
     [RequireComponent(typeof(Rigidbody)), RequireComponent(typeof(CapsuleCollider))]
     public class RigidBodyCharacter : MonoBehaviour {
          #region Variables

          [SerializeField] private float speed = 5f;
          [SerializeField] private float jumpHeight = 2f;
          [SerializeField] private float dashDistance = 5f;
          [SerializeField] private float groundCheckDistance = 0.2f;
          [SerializeField] private LayerMask groundLayerMask;

          private Rigidbody rigidbody;
          private Vector3 inputDirection = Vector3.zero;
          private bool isGrounded = true;

          #endregion

          #region Unity Methods
          private void Start() {
               rigidbody = GetComponent<Rigidbody>();
          }

          private void Update() {
               // Check grounded
               CheckGroundStatus();

               // Process move inputs
               inputDirection = Vector3.zero;
               inputDirection.x = Input.GetAxis("Horizontal");
               inputDirection.z = Input.GetAxis("Vertical");
               if (inputDirection != Vector3.zero) {
                    transform.forward = inputDirection;
               }

               // Process jump input
               if (Input.GetButtonDown("Jump") && isGrounded) {
                    Vector3 jumpVelocity = Vector3.up * Mathf.Sqrt(jumpHeight * -2f * Physics.gravity.y);
                    rigidbody.AddForce(jumpVelocity, ForceMode.VelocityChange);
               }

               // Process dash input
               if (Input.GetButtonDown("Dash")) {
                    Vector3 dashVelocity = Vector3.Scale(transform.forward, dashDistance * new Vector3((Mathf.Log(1f / (Time.deltaTime * rigidbody.drag + 1)) / -Time.deltaTime), 0, (Mathf.Log(1f / (Time.deltaTime * rigidbody.drag + 1)) / -Time.deltaTime)));
                    rigidbody.AddForce(dashVelocity, ForceMode.VelocityChange);
               }
          }

          // FixedUpdate : ๋ฌผ๋ฆฌ์—”์ง„ ๋ฐ”๋กœ ์œ„์ชฝ์—์„œ ์ง„ํ–‰๋˜๋Š” ํ•จ์ˆ˜. ๊ฒŒ์ž„์˜ ํ”„๋ ˆ์ž„๊ณผ ์ƒ๊ด€์—†์ด ๊ณ ์ •์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” update ํ•จ์ˆ˜
          private void FixedUpdate() {
               rigidbody.MovePosition(rigidbody.position + inputDirection * speed * Time.fixedDeltaTime);
          }

          #endregion Unity Methods

          private void CheckGroundStatus() {
               RaycastHit hitInfo;
#if UNITY_EDITOR
               // helper to visualise the ground check ray in the scene view
               Debug.DrawLine(transform.position + (Vector3.up * 0.1f), transform.position + (Vector3.up * 0.1f) + (Vector3.down * groundCheckDistance));
#endif
               // 0.1f is a small offset to start the ray from inside the character
               // it is also good to note that the transform position in the sample assets is at the base of the character
               if (Physics.Raycast(transform.position + (Vector3.up * 0.1f), Vector3.down, out hitInfo, groundCheckDistance, groundLayerMask)) {
                    isGrounded = true;
               } else {
                    isGrounded = false;
               }
          }
     }
}

 

GroundLayerMask๋ฅผ ground๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'โš™๏ธ ์—”์ง„ > ๐Ÿค ์œ ๋‹ˆํ‹ฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Unity] ํ”Œ๋ ˆ์ด์–ด ์นด๋ฉ”๋ผ ๊ตฌํ˜„ํ•˜๊ธฐ - ์นด๋ฉ”๋ผ ์—๋””ํ„ฐ ๊ธฐ๋Šฅ ํ™•์žฅํ•˜๊ธฐ  (0) 2024.05.08
[Unity] ํ”Œ๋ ˆ์ด์–ด ์นด๋ฉ”๋ผ ๊ตฌํ˜„ํ•˜๊ธฐ - 3์ธ์นญ TopDown ์นด๋ฉ”๋ผ ๊ตฌํ˜„ํ•˜๊ธฐ  (0) 2024.05.08
[Unity] ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ ์ œ์ž‘ํ•˜๊ธฐ - ์บ๋ฆญํ„ฐ ๋ชจ๋ธ, ์• ๋‹ˆ๋ฉ”์ด์…˜ ์„ค์ •  (0) 2024.05.06
[Unity] ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ ์ œ์ž‘ํ•˜๊ธฐ - NavMeshAgent  (1) 2024.05.06
[Unity] ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ ์ œ์ž‘ํ•˜๊ธฐ - Character Controller  (0) 2024.05.06
'โš™๏ธ ์—”์ง„/๐Ÿค ์œ ๋‹ˆํ‹ฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Unity] ํ”Œ๋ ˆ์ด์–ด ์นด๋ฉ”๋ผ ๊ตฌํ˜„ํ•˜๊ธฐ - 3์ธ์นญ TopDown ์นด๋ฉ”๋ผ ๊ตฌํ˜„ํ•˜๊ธฐ
  • [Unity] ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ ์ œ์ž‘ํ•˜๊ธฐ - ์บ๋ฆญํ„ฐ ๋ชจ๋ธ, ์• ๋‹ˆ๋ฉ”์ด์…˜ ์„ค์ •
  • [Unity] ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ ์ œ์ž‘ํ•˜๊ธฐ - NavMeshAgent
  • [Unity] ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ ์ œ์ž‘ํ•˜๊ธฐ - Character Controller
peewoong
peewoong
peewoong.logpeewoong ๋‹˜์˜ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
peewoong
peewoong.log
peewoong
์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
    • ๐Ÿ™‚ Info
    • ๐ŸŽฎ ๊ฒŒ์ž„ ๊ด€๋ จ ๊ฐœ๋…
    • ๐Ÿ‘ฉโ€๐Ÿ’ป ํ”„๋กœ๊ทธ๋ž˜๋ฐ
      • ๐ŸŽญ C
      • ๐ŸŽ  C++
      • ๐Ÿ• C#
      • โœจ ์ž๋ฃŒ๊ตฌ์กฐ
      • ๐ŸŽ ์•Œ๊ณ ๋ฆฌ์ฆ˜
      • ๐Ÿ”ข ์ˆ˜ํ•™
      • ๐ŸŽจ ๊ทธ๋ž˜ํ”ฝ์Šค
    • โš™๏ธ ์—”์ง„
      • ๐Ÿง€ VS
      • ๐Ÿค ์œ ๋‹ˆํ‹ฐ
      • ๐Ÿซ ์–ธ๋ฆฌ์–ผ
      • ๐Ÿน DirectX
      • ๐Ÿฆฅ error
    • ๐Ÿ“ฝ๏ธ ํ”„๋กœ์ ํŠธ
    • ๐Ÿง ์ฝ”๋”ฉํ…Œ์ŠคํŠธ

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

hELLO ยท Designed By ์ •์ƒ์šฐ.v4.2.0
peewoong
[Unity] ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ ์ œ์ž‘ํ•˜๊ธฐ - Rigidbody
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.