๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
728x90
 

 

 

๋ฆฌํŒฉํ† ๋ง(Refactoring) ๊ฒฐ์ •

 

์˜ค๋žœ๋งŒ์— ๋‹ค์‹œ Unity ํ”„๋กœ์ ํŠธ ๊ธ€์„ ์˜ฌ๋ฆฌ๊ฒŒ ๋˜์—ˆ๋„ค์š”. 4ํ•™๋…„ 1ํ•™๊ธฐ๊ฐ€ ๋๋‚˜ ๋ฐฉํ•™์ด ์™”๊ณ , ์ž ์‹œ ํœด์‹ ๊ธฐ๊ฐ„์„ ๊ฐ€์กŒ์—ˆ์Šต๋‹ˆ๋‹ค. ์ž ๊น ์‰ฌ๊ณ  ๋‚œ ๋’ค์—๋Š” C++ ๋ฌธ๋ฒ• ๊ณต๋ถ€, Python์œผ๋กœ ๋ฐฑ์ค€ ํ’€๊ธฐ, Unreal Engine5 ๋ฐฐ์šฐ๋Š” ๋“ฑ์œผ๋กœ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๋ฏธ๋ฃจ๊ณ  ๋ฏธ๋ฃจ๋˜ ๊ธฐ์กด ์นด๋ก (Charon) Unity ํ”„๋กœ์ ํŠธ๋ฅผ ์Šฌ์Šฌ ์† ๋ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค๋”๋ผ๊ตฌ์š”.

 

๊ธฐ์กด์— ์ž‘์„ฑํ–ˆ๋˜ ์†Œ์Šค์ฝ”๋“œ ๊ตฌ์กฐ๋Š” ๋„ˆ๋ฌด ๋ง˜์— ์•ˆ ๋“ค์—ˆ๊ณ , ์ด๋Œ€๋กœ ๊ฐ€๋‹ค๊ฐ€๋Š” ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๊ฐ€ ๋˜๋Š” ๊ฑด ์‹œ๊ฐ„ ๋ฌธ์ œ๋ผ๋Š” ๊ฒŒ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ป๊ฒŒ ํ•˜์ง€ ํ•˜๋‹ค๊ฐ€ ๊ฒฐ๊ตญ ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์–ด์š”.

 

์ œ์ผ ๋จผ์ € ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ๋กœ ํ•œ ๊ฑด ์ž…๋ ฅ ์‹œ์Šคํ…œ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์ปดํฌ๋„ŒํŠธ๋ณ„๋กœ ํด๋ž˜์Šค๋ฅผ ๋‚˜๋ˆˆ ๊ฒƒ๊นŒ์ง€๋Š” ์ข‹์•˜์œผ๋‚˜, ๊ฐˆ์ˆ˜๋ก ์™œ ๋‚˜๋ˆ„์—ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์—ˆ๋˜ ๊ตฌ์กฐ๋ผ์„œ ์ œ์ผ ๋จผ์ € ๋ฐ”๊พธ๊ธฐ๋กœ ๊ฒฐ์‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋ฒˆ์—๋Š” Unity Engine์— ์ƒˆ๋กœ ๋„์ž…๋˜์—ˆ๋˜ New Input System์„ ์จ๋ณด๊ธฐ ์œ„ํ•ด, ์ดํ‹€ ์ •๋„ ๊ณต๋ถ€๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด ๋‚ด์šฉ์ด ์ข€ ์–ด๋ ต๋”๊ตฐ์š”. ์•„์ง๊นŒ์ง€ ์˜์–ด๋กœ ๋œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ์ต์ˆ™ํ•˜์ง€ ์•Š๊ธฐ์— ํ•œ๊ธ€ ๋ฒˆ์—ญ๋„ ๊ฐ™์ด ๋ณด๋ฉฐ ๊ณต๋ถ€ํ•˜๊ธด ํ–ˆ์ง€๋งŒ, ํ•œ๊ธ€ ๋ฒˆ์—ญ์€ ๊ทธ ํ•œ๊ณ„ ๋•Œ๋ฌธ์— ๋งค๋„๋Ÿฌ์šด ํ•ด์„์ด ํž˜๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

(๊ฐœ๋ฐœ์ž์—๊ฒŒ ์˜์–ด๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ ์ธ ๊ฒƒ ๊ฐ™๋„ค์š”.)

 

์ง์ ‘ ์จ๋ณด๋ฉฐ ์‹ค์ œ๋กœ ์ ์šฉํ•ด๋ณด๋Š” ๊ฒŒ ๋” ๋นจ๋ฆฌ ์‹ค๋ ฅ์ด ๋Š˜๊ฒ ๋‹ค ์‹ถ์–ด์„œ, ๊ทธ๋ƒฅ ๋ฐ”๋กœ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.ใ…Žใ…Žใ…Ž... 

 

 

 

1. New Input System ๋„์ž…ํ•˜๊ธฐ

 

Unity์—์„œ ๊ธฐ์กด์— ๋…ธํ›„ํ™”๋œ ์ž…๋ ฅ ์‹œ์Šคํ…œ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด, Unity 2019.1 ๋ฒ„์ „๋ถ€ํ„ฐ ์ถœ์‹œํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด Old Input System์€ ํ”Œ๋žซํผ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ฒŒ์ž„์„ ์ถœ์‹œํ•˜๋ ค๋ฉด, ์ž…๋ ฅ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ž‘์„ฑํ–ˆ๋˜ ์†Œ์Šค์ฝ”๋“œ๋“ค์„ ๋‹ค์‹œ ๊ณ ์ณ์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์—ˆ์ง€์š”. ๋˜ํ•œ ์ž…๋ ฅ ํ‚ค๋“ค์ด ๋Š˜์–ด๋‚ ์ˆ˜๋ก Update() ํ•จ์ˆ˜ ํฌ๊ธฐ๊ฐ€ ๋ฐฉ๋Œ€ํ•ด์ ธ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด์ง€๋Š” ๋ฌธ์ œ์ ๋„ ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Ÿฐ ๋ฌธ์ œ์ ๋“ค์— ๋Œ€ํ•ด ํ”Œ๋žซํผ ๊ฐ„ ํ‚ค ๋ฐ”์ธ๋”ฉ์ด ์ž์œ ๋กญ๊ณ , ์‹ค์‹œ๊ฐ„ ์ž…๋ ฅ ์ฒดํฌ๊ฐ€ ์•„๋‹Œ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ž…๋ ฅ ์ฒดํฌ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์„ ํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ New Input System์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ž…๋ ฅ ๋ฐฉ์‹๊ณผ New Input System ๋ฐฉ์‹์„ ๋‘˜ ๋‹ค ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋„ ์žฅ์ ์ž…๋‹ˆ๋‹ค. ๐Ÿ”—New Input System์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๋Š” ๊ธ€์€ ๋‚˜์ค‘์— ๋”ฐ๋กœ ์˜ฌ๋ฆฌ๋„๋ก ํ• ๊ฒŒ์š”.

 

 

์ž…๋ ฅ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ ๋งŒ๋“ค๊ธฐ

 

Input Actions๋Š” ํ”„๋กœ์ ํŠธ์˜ ์‹ค์ œ ์—์…‹์œผ๋กœ, ์ž…๋ ฅ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋“ค์„ ํ•˜๋‚˜๋กœ ๋‹ด์•„ ๊ด€๋ฆฌํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ €๋Š” "PlayerInputActions"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์‚ฌ์šฉํ•  ์ž…๋ ฅ ํ‚ค๋“ค์„ ์ •์˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ Actions Maps์— "Player"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

์šฐ๋ฆฌ ๊ฒŒ์ž„์€ WASDํ‚ค๋กœ ์บ๋ฆญํ„ฐ๋ฅผ ์›€์ง์ด๋ฏ€๋กœ, "Move"๋ผ๋Š” Action์„ ์ƒ์„ฑํ•˜์—ฌ Action Type์„ Value๋กœ ์ง€์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ๊ฐ€ ์œ„๋กœ ์›€์ง์ด๋Š” ๊ธฐ๋Šฅ์€ ์—†๊ธฐ์— 2์ฐจ์› ๋ฐฉํ–ฅ ์ •๋ณด๋งŒ ์•Œ๋ฉด ํ‰๋ฉด ์œ„์—์„œ ์บ๋ฆญํ„ฐ๋ฅผ ์›€์ง์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Control Type์„ Vector2๋กœ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

 

 

๋ฐ”์ธ๋”ฉ(Binding)์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ๊ฐ€ 8๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์›€์ง์ด๋ฉด ๋˜๊ณ , ๋Œ€๊ฐ์„ ์œผ๋กœ ์ด๋™ํ•  ๋•Œ ๋” ๋น ๋ฅด๊ฒŒ ์ด๋™ํ•˜๋ฉด ์•ˆ ๋˜๋ฏ€๋กœ Mode๋ฅผ Digital Normalized๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ ํ‚ค๋“ค์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋˜๊ฒ ์ง€์š”.

 

 

์šฐ์„  ์ด๋™๊ณผ ๊ด€๋ จํ•ด์„œ๋Š” ์ด ์ •๋„ ์„ธํŒ…๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ํ‚ค ์„ธํŒ…๋“ค์€ ๋ฐ์Šคํฌํƒ‘ PC ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๋”ฐ๋กœ ์Šคํ‚ค๋งˆ๋ฅผ ์ €์žฅํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

.

์Šคํ‚ค๋งˆ

 

๋‚˜์ค‘์— ํ”Œ๋žซํผ์ด ์ ์ฐจ ๋Š˜์–ด๋‚˜๋ฉด ์ด๋Ÿฐ ์‹์œผ๋กœ ํ•˜๋‚˜์”ฉ ์Šคํ‚ค๋งˆ๋ฅผ ๋Š˜๋ ค์ฃผ๊ณ , ๋นŒ๋“œํ•  ๋•Œ ์›ํ•˜๋Š” ํ”Œ๋žซํผ ์Šคํ‚ค๋งˆ๋ฅผ ๊ณจ๋ผ ๋นŒ๋“œ๋งŒ ํ•ด์ฃผ๋ฉด ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋”ฐ๋กœ ๊ฑด๋“œ๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. New Input System์— ๋Œ€ํ•œ ๋‚ด์šฉ ์„ค๋ช…์„ ์ƒ๋žตํ•ด์„œ ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ ๊ฐ€์‹ค ์ˆ˜๋„ ์žˆ๊ฒ ๋„ค์š”. ๋‚˜์ค‘์— ๊ธ€์„ ๋”ฐ๋กœ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์€ ๐Ÿ”—์—ฌ๊ธฐ์— ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋‚จ๊ฒจ ๋†“๋„๋ก ํ• ๊ฒŒ์š”.

 

Auto-Save๋ฅผ ์ฒดํฌํ•œ ๋’ค, ์ฐฝ์„ ๋‹ซ์•„์ค๋‹ˆ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ ์˜ค๋ธŒ์ ํŠธ์—๋‹ค๊ฐ€ Player Input ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ€์ฐฉํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Actions์—๋Š” ์œ„์—์„œ ๋งŒ๋“  PlayerInputActions๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ , ๋‚˜๋จธ์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธํŒ…ํ•ด์คฌ์Šต๋‹ˆ๋‹ค.

 

์ €๋Š” Unity Event์„ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ด์ œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ฐจ๋ก€๋„ค์š”!

 

 

 

2. ์บ๋ฆญํ„ฐ ์ด๋™ ๊ตฌํ˜„ํ•˜๊ธฐ

 

๋ฐ์ดํ„ฐ์™€ ๊ด€๋ จ๋œ ๋‚ด์šฉ๋“ค์€ Player ์Šคํฌ๋ฆฝํŠธ์—, ์ž…๋ ฅ ๋ฐ ์ปจํŠธ๋กค์— ๊ด€ํ•œ ๋‚ด์šฉ๋“ค์€ PlayerController ์Šคํฌ๋ฆฝํŠธ์— ๊ฐ๊ฐ ๋ถ„๋ฆฌํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

Player ์Šคํฌ๋ฆฝํŠธ

 

ํ”Œ๋ ˆ์ด์–ด๋Š” ์ตœ๋Œ€ ์ฒด๋ ฅ, ํ˜„์žฌ ์ฒด๋ ฅ, ๋ฐฉ์–ด๋ ฅ, ์ด๋™ ์†๋„, ์—ฐ์† ๋Œ€์‹œ ๊ฐ€๋Šฅ ํšŸ์ˆ˜ ๋ฐ์ดํ„ฐ๋“ค์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

ํ•จ๋ถ€๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด ์•ˆ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด๊ธฐ์— ์™ธ๋ถ€์—์„œ๋Š” ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ฝ๊ธฐ ์ „์šฉ ํ”„๋กœํผํ‹ฐ๋กœ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

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

public class Player : MonoBehaviour
{
    public float MaxHP     { get { return maxHP; } }
    public float CurrentHP { get { return currentHP; } }
    public float Armor     { get { return armor; } }
    public float MoveSpeed { get { return moveSpeed; } }
    public float DashCount { get { return dashCount; } }

    [SerializeField] protected float maxHP;
    [SerializeField] protected float currentHP;
    [SerializeField] protected float armor;
    [SerializeField] protected float moveSpeed;
    [SerializeField] protected float dashCount;

    public void OnUpdateStat(float maxHP, float currentHP, float armor, float moveSpeed, float dashCount)
    {
        this.maxHP = maxHP;
        this.currentHP = currentHP;
        this.armor = armor;
        this.moveSpeed = moveSpeed;
        this.dashCount = dashCount;
    }
}

 

์›๋ž˜๋ผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ ์ •๋ณด๋ฅผ ์ฝ์–ด ์™€์„œ ๋กœ๋“œ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•˜์ง€๋งŒ, ์ง€๊ธˆ์€ ๊ทธ ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฏ€๋กœ Inspector ์ฐฝ์—์„œ ํŽธํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด [SerializeField]๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์ค‘์— ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์„ ๋•Œ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋˜๊ฒ ์ง€์š”.

 

 

PlayerController ์Šคํฌ๋ฆฝํŠธ์™€ ์ด๋ฒคํŠธ ํ•จ์ˆ˜ ๋“ฑ๋ก

 

PlayerController ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด์ œ ์บ๋ฆญํ„ฐ ์ด๋™ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณผ ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋Ÿด๋ ค๋ฉด ์šฐ์„  ์บ๋ฆญํ„ฐ์˜ ์ด๋™ ์†๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์ด๊ฒƒ์€ Player ์Šคํฌ๋ฆฝํŠธ์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ PlayerController ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ€์ฐฉํ•˜๋ฉด, ์ž๋™์œผ๋กœ Player ์Šคํฌ๋ฆฝํŠธ ๋˜ํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ€์ฐฉ๋˜๋„๋ก [RequireComonponent()]๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;  // New Input System์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”


[RequireComponent(typeof(Player))]
public class PlayerController : MonoBehaviour
{
    protected Player player;
    
    void Start()
    {
        player = GetComponent<Player>();
    }
   
   ...
}

 

์ด์ œ ์บ๋ฆญํ„ฐ ์ด๋™ ์ž…๋ ฅ๊ณผ ๊ด€๋ จํ•˜์—ฌ, ์ž…๋ ฅ ์‹œ์Šคํ…œ์— ๋“ฑ๋กํ•  ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[RequireComponent(typeof(Player))]
public class PlayerController : MonoBehaviour
{
    public Vector3 direction { get; private set; }
    ...
    
    public void OnMoveInput(InputAction.CallbackContext context)
    {
        Vector2 input = context.ReadValue<Vector2>();
        direction = new Vector3(input.x, 0f, input.y);
    }
}

 

์ด์ œ ์ด OnMoveInput() ํ•จ์ˆ˜๋ฅผ Player Input ์ปดํฌ๋„ŒํŠธ์— ์ด๋ฒคํŠธ ํ•จ์ˆ˜๋กœ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Events ํ† ๊ธ€์„ ์—ด์–ด๋ณด๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ–ˆ๋˜ Action Maps์ธ "Player"๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. Player ํ† ๊ธ€์„ ์—ด์–ด๋ณด๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ–ˆ๋˜ "Move" Action ์ด๋ฒคํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์— ์œ„์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•ด์ค๋‹ˆ๋‹ค.

(Unity Event ๋ฐฉ์‹์€ ๋“ฑ๋กํ•  ํ•จ์ˆ˜์˜ ์ ‘๊ทผํ•œ์ •์ž๊ฐ€ public์ด์–ด์•ผ Inspector ์ฐฝ์—์„œ ๋“ฑ๋ก ๊ฐ€๋Šฅ)

 

 

์ด์ œ Move Action์— ๋ฐ”์ธ๋”ฉํ–ˆ๋˜ ์ž…๋ ฅ ํ‚ค๋“ค(WASD)๋ฅผ ๋ˆ„๋ฅด๋ฉด, ์—ฌ๊ธฐ์— ์ด๋ฒคํŠธ๋กœ ๋“ฑ๋กํ–ˆ๋˜ OnMoveInput() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜ ์•„์…”์•ผ ํ•  ๊ฒƒ์€ ๋ˆŒ๋ €์„ ๋•Œ ํ•œ ๋ฒˆ, ๋—์„ ๋•Œ ํ•œ ๋ฒˆ ์ด๋ ‡๊ฒŒ ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

 

/*

์˜ˆ๋ฅผ ๋“ค์–ด ์™ผ์ชฝ์œผ๋กœ ๊ฐ€๋ ค๊ณ  Aํ‚ค๋ฅผ ๋ˆŒ๋ €๋‹ค ๋–ผ๋ฉด, (-1, 0), (0, 0) ์ด๋ ‡๊ฒŒ ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฐ”์ธ๋”ฉ ๊ด€๋ จ ์ด๋ฒคํŠธ(Started, Performed, Canceled ๋“ฑ)๊ณผ ๊ด€๋ จ ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ๋„ ๋‚˜์ค‘์— ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

*/

 

์ด์ œ ์ž…๋ ฅ ๊ฐ’๋“ค์€ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ, ์ด ๊ฐ’์„ ํ† ๋Œ€๋กœ ์บ๋ฆญํ„ฐ๋ฅผ ์›€์ง์—ฌ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ฆฌ ๊ธฐ๋ฐ˜์œผ๋กœ ์›€์ง์ผ ๊ฒƒ์ด๋ฏ€๋กœ RigidBody ์ปดํฌ๋„ŒํŠธ๋„ ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

protected const float CONVERT_UNIT_VALUE = 0.01f;

protected void Move()
{
    float currentMoveSpeed = player.MoveSpeed * CONVERT_UNIT_VALUE;
    LookAt();
    rigidBody.velocity = direction * currentMoveSpeed + Vector3.up * rigidBody.velocity.y;
}

protected void LookAt()   // ์บ๋ฆญํ„ฐ๊ฐ€ ์ด๋™ํ•˜๋Š” ๋ฐฉํ–ฅ์„ ๋ฐ”๋ผ๋ด„
{
    if(direction != Vector3.zero)
    {
        Quaternion targetAngle = Quaternion.LookRotation(direction);
        rigidBody.rotation = targetAngle;
    }
}

 

๋‹ค๋งŒ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋ฉด, ํ‚ค๋ฅผ ์—ฐํƒ€ํ•˜์—ฌ ๋ˆŒ๋Ÿฌ์•ผ ์บ๋ฆญํ„ฐ๊ฐ€ ์กฐ๊ธˆ์”ฉ ์›€์ง์ผ ๊ฒ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ ํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ณ  ์žˆ๋Š”๋‹ค๊ณ  ๊ณ„์† ํ˜ธ์ถœ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด์ง€์š”. ๊ทธ๋ž˜์„œ FixedUpdate()์— Move() ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด ํ•ด๊ฒฐํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. 

void FixedUpdate()
{
    Move();
}

 

๊ทธ๋ฆฌ๊ณ  ์ด๋™ ์†๋„์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์ด ์กฐ๊ธˆ ์ดํ•ด๊ฐ€ ์•ˆ ๋˜์‹ค ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์‹ค์ œ ๊ธฐํš์„œ ์ƒ์— ์ด๋™ ์†๋„ ํ‘œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์ด ์ˆ˜์น˜๊ฐ€ ์–ด๋Š ์ •๋„์˜ ์†๋„์ธ์ง€๋ฅผ ๊ฐ€๋Š ํ•  ์ˆ˜๊ฐ€ ์—†์–ด, ๊ธฐํš์ž์™€ ์–˜๊ธฐํ•˜๋ฉฐ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ’์„ ์กฐ์ •ํ•˜๋ฉฐ ๋งž์ถ”๋‹ค ๋ณด๋‹ˆ

๊ธฐํš์„œ ์ด๋™ ์†๋„ 300  →  Unity Rigidbody ์†๋„ 3 ์ •๋„๋กœ ๋œ๋‹ค๋Š” ๊ฑธ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์‹ค์ œ UI ํ‘œ์‹œ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•  ์ด๋™ ์†๋„๋Š” ๊ธฐํš์„œ ์ด๋™ ์†๋„ ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ˆ, ๊ทธ๋ƒฅ ์ฝ”๋“œ ๋‚ด๋ถ€์—์„œ ๋ณ€ํ™˜ ์ž‘์—…์„ ํ•ด์ค€ ๊ฒƒ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

// ๊ธฐํš์„œ ์ด๋™์†๋„ 300 -> ๊ฒŒ์ž„ ์›”๋“œ ๋‚ด ์ด๋™์†๋„ 3
protected const float CONVERT_UNIT_VALUE = 0.01f;

protected void Move()
{
    float currentMoveSpeed = player.MoveSpeed * CONVERT_UNIT_VALUE;
    ...
}

 

๊ทธ๋ฆฌ๊ณ  ๊ณต์ค‘์— ๋œฌ ์ƒํƒœ์—์„œ ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ๊ฐ€ ์ฒœ์ฒœํžˆ ๋‚ด๋ ค์˜ค๋˜ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, RigidBody ์†๋„์˜ y์ถ• ๋ฐฉํ–ฅ์—๋„ ํž˜์„ ๊ฐ€ํ•ด์ฃผ์–ด์•ผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ค‘๋ ฅ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

rigidBody.velocity = direction * currentMoveSpeed + Vector3.up * rigidBody.velocity.y;

/* 2022-08-18 ์ˆ˜์ •)
   ์ด ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฝ์‚ฌ๋กœ ์ง€ํ˜•์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋„ค์š”.
   ์ถ”ํ›„ ๊ฒŒ์‹œ๊ธ€์—์„œ ํ•ด๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.
*/

 

๋ฌธ์ œ ํ•ด๊ฒฐ ์ „

 

๋ฌธ์ œ ํ•ด๊ฒฐ ํ›„

 

์ด์ œ ์‹คํ–‰ ํ•ด๋ณด๋ฉด ์ž˜ ์›€์ง์ด๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ๋ฅผ ํ•˜๋‚˜ ํ•ด๊ฒฐํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ, ๋ฒฝ์— ๋ถ™์–ด ์ด๋™ํ•˜๋ฉด ๋ฒฝ๋ฉด์— ๋‹ฌ๋ผ๋ถ™์–ด ์›€์ง์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๋ฒฝ์— ๋‹ฌ๋ผ ๋ถ™์–ด์„œ ์›€์ง์ด์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ

 

์ด๊ฒƒ์€ ๋ฒฝ์˜ ์ฝœ๋ผ์ด๋”์™€ ์บ๋ฆญํ„ฐ์˜ ์ฝœ๋ผ์ด๋” ๊ฐ„ ๋งˆ์ฐฐ๋ ฅ์ด ๋„ˆ๋ฌด ์„ธ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

PhysicsMaterial์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ , ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•œ ํ›„ ์บ๋ฆญํ„ฐ ์ฝœ๋ผ์ด๋”์— ๋„ฃ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ๋ฒฝ์— ๋ถ™์–ด์„œ ์ด๋™ํ•ด๋„ ๋งค๋„๋Ÿฝ๊ฒŒ ์ž˜ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋งˆ์ฐฐ๋ ฅ ๋ฌธ์ œ ํ•ด๊ฒฐ

 

 

๋งˆ๋ฌด๋ฆฌ

 

์ƒ๊ฐ๋ณด๋‹ค ๊ธ€์ด ๊ต‰์žฅํžˆ ๊ธธ์–ด์กŒ๋„ค์š”. ์ด๋™ ์• ๋‹ˆ๋ฉ”์ด์…˜๊นŒ์ง€ ๋‹ค๋ฃจ๋Š” ๊ฑธ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๋‹ค์Œ ๊ธ€์—์„œ ์ž‘์„ฑํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

 

 

728x90
๋ฐ˜์‘ํ˜•