ํ”„๋ฆฌ๋ฃฉ ์นด๋ฉ”๋ผ๋กœ ์‹œ์•ผ ๋Œ๋ฆด ๋•Œ ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ๋Š” ํ˜„์ƒ ๋ฐœ์ƒํ•˜๋Š”๋ฐ ํ˜น์‹œ ํ•ด๊ฒฐ๋ฒ• ์•„๋ƒ


์›์‹ ์ฒ˜๋Ÿผ ์‹œ์•ผ ๋ฐ ์บ๋ฆญํ„ฐ ์กฐ์ž‘ํ•˜๋Š”ย ์‹œ์Šคํ…œ ๋งŒ๋“ค๋ ค๊ณ  ๊ตฌํ˜„์„ ํ–ˆ์Œ

wasd ๋ˆ„๋ฅด๋ฉด ์ƒ์ขŒํ•˜์šฐ๋กœ ์›€์ง์ด๊ณ , ๋งˆ์šฐ์Šค ๋Œ๋ ค์„œ ์‹œ์•ผ ๋Œ๋ฆฌ๊ณ  ํœ  ๊ตด๋ฆฌ๋ฉด ์คŒ์ธ ์คŒ์•„์›ƒ ๊ฐ€๋Šฅํ•œ ๊ทธ๊ฑฐ ใ…‡ใ…‡ alt ๋ˆ„๋ฅด๋ฉด ์‹œ์•ผ ์กฐ์ž‘์ด ์•„๋‹ˆ๋ผ UI ์กฐ์ž‘๋ชจ๋“œ ๋˜๊ณ 


์–ด์จŒ๋“  ๋Œ€์ถฉ ๋”ฐ๋ผํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐ๋Š” ์„ฑ๊ณตํ–ˆ๋Š”๋ฐ, ๋งˆ์šฐ์Šค ์›€์ง์—ฌ์„œ ์‹œ์•ผ ๋Œ๋ฆฌ๋Š” ๋ฐ์„œ ์›์ธ ๋ถˆ๋ช…์˜ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•จ

์‹œ์ž‘ํ•˜๊ณ  ์ตœ์ดˆ ์ƒํƒœ์—์„œ๋Š” ๋งˆ์šฐ์Šค ๋Œ๋ฆฌ๋ฉด X์ถ• Y์ถ• ๋‘˜ ๋‹ค ์˜๋„ํ•œ ์†๋„๋Œ€๋กœ ๋ฐ”๊ฟ”์ง

๋ฌธ์ œ๋Š” ๋ฐฉํ–ฅํ‚ค ๋ˆŒ๋Ÿฌ์„œ ์บ๋ฆญ์„ ์กฐ๊ธˆ์ด๋ผ๋„ ์ด๋™์‹œํ‚ค๋Š” ์ˆœ๊ฐ„ ์†๋„๊ฐ€ ๋ง›ํƒฑ์ด ๊ฐ€์„œ ๋А๋ ค์ง€๊ณ  ๋ฒ„๋ฒ…์ด๋Š” ๊ฒŒ ๋А๊ปด์ง„๋‹ค๊ณ  ํ•ด์•ผ ํ•˜๋‚˜ ๊ทธ๋Ÿฐ ๋ฌธ์ œ์ ์ด ์žˆ์Œ


์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋‚ด๊ฐ€ ์˜๋„ํ•œ ์นด๋ฉ”๋ผ ๋Œ์•„๊ฐ€๋Š” ์†๋„๊ฐ€ X์ถ• 5 Y์ถ• 0.08์ด๋ผ ์น˜๋ฉด, ๊ตฌ๋™ํ•œ ์งํ›„์—๋Š” ๋ฌธ์ œ ์—†์ด ๋Œ์•„๊ฐ€๊ณ  ๋ฒ„๋ฒ…์ž„๋„ ์—†์ด ๋ถ€๋“œ๋Ÿฌ์šด๋ฐ

์บ๋ฆญํ„ฐ ์ขŒํ‘œ ์ด๋™ํ•˜๋ฉด x์ถ• 3 Y์ถ• 0.02 ์ •๋„๋กœ ํ›… ๋–จ์–ด์ง€๊ณ  ์นด๋ฉ”๋ผ๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ๋„ ๋ญ”๊ฐ€ ๋ถ€๋“œ๋Ÿฝ์ง€ ์•Š๊ณ  ๋š๋š ๋Š๊น€

์™œ ์ขŒํ‘œ ์ด๋™์ด๋ผ๊ณ  ์ผ๋ƒ๋ฉด ์ขŒํด๋ฆญ ํ•˜๋ฉด ์บ๋ฆญํ„ฐ๊ฐ€ ํ‰์งˆํ•˜๋Š” ๋ชจ์…˜์ด ์žˆ๋Š”๋ฐ ๊ณต๊ฒฉ ์กฐ์ž‘๋งŒ ํ•˜๋ฉด ํ•ด๋‹น ๋ฌธ์ œ์ ์€ ์—†๋‹ค. ๋ฌด์กฐ๊ฑด ์บ๋ฆญํ„ฐ ์›€์ง์ด๋Š” ์ˆœ๊ฐ„ ๋ฐœ์ƒํ•จ



์—๋””ํ„ฐ์—์„œ๋Š” ์ง„์งœ ๋ง‰๋ˆˆ์ด๋ผ๋„ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ์ €ํ•˜๊ฐ€ ์‹ฌํ•˜๊ณ  ์—๋””ํ„ฐ ์ƒ์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ธ๊ฐ€ ์‹ถ์–ด์„œ ๋นŒ๋“œํ•ด์„œ ๊ตด๋ ค๋ดค๋Š”๋ฐ

์—๋””ํ„ฐ๋งŒํผ ์ €ํ•˜๊ฐ€ ์‹ฌํ•˜์ง€ ์•Š๋‹ค ๋ฟ์ด์ง€ ๋นŒ๋“œ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ



ํ”„๋ฆฌ๋ฃฉ ๊ด€๋ จํ•œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฑด๋“œ๋ฆฌ๋Š” ๊ฒŒ ๊ฑฐ์˜ ์—†์–ด์„œ ๋ญ๊ฐ€ ๋ฌธ์  ์ง€๋„ ๋ชจ๋ฅด๊ฒ ๊ณ  ์•„๋ฌด๋ฆฌ ์˜์–ด๋กœ ์„œ์น˜ํ•ด๋ด๋„ ๋‚ด ์„œ์น˜๋Šฅ๋ ฅ์ด ๋ณ‘์‹ ์ด๋ผ ๊ทธ๋Ÿฐ์ง€ ํ•ด๊ฒฐ๋ฒ•์ด ์•ˆ ๋ณด์ธ๋‹ค

์‹œ๋„ค๋จธ์‹  ์ž์ฒด๊ฐ€ ์ž๋ฃŒ ์ ์€ ๊ฒƒ๋„ ํ•œ๋ชซํ•˜๋Š” ๊ฒƒ ๊ฐ™๊ณ 

๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ๋‹ค ์˜ฌ๋ ค๋ณด๊ณ  ์•ˆ ๋˜๋ฉด ์œ ๋‹ˆํ‹ฐํฌ๋Ÿผ๊นŒ์ง€ ๊ฐ€์„œ ๋ฌผ์–ด๋ณด๊ณ  ๋‹ต ๋ชป ๊ตฌํ•˜๋ฉด ์นด๋ฉ”๋ผ ์กฐ์ž‘ ์ฝ”๋“œ ์งœ์•ผ์ง€ ์‹ถ๊ธด ํ•จ





์ง€๊ธˆ ํ”„๋ฆฌ๋ฃฉ ์„ค์ •์€ ์ด๋ ‡๊ฒŒ ๋˜์–ด์žˆ์Œ


์ƒ๊ด€์ด ์žˆ์„์ง„ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ ํ˜น์‹œ๋‚˜ ์‹ถ์–ด์„œ ์•„๋ž˜์— ์บ๋ฆญํ„ฐ ์กฐ์ž‘ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋„ ๊ฐ™์ด ์ฒจ๋ถ€ํ•จ


public class CharacterMovement : MonoBehaviour

{

ย  ย  #region SetVariables

ย  ย  [SerializeField] private float MovingSpeed = 8f; //์บ๋ฆญํ„ฐ ์ด๋™ ์†๋„

ย  ย  [SerializeField] private float RotateSpeed = 0.4f; //์บ๋ฆญํ„ฐ ํšŒ์ „ ์†๋„

ย  ย  [SerializeField] private Camera MainCamera; //๋ฉ”์ธ ์นด๋ฉ”๋ผ


ย  ย  private PlayerInput CharaInput;

ย  ย  [SerializeField] private GameObject SwordObject;

ย  ย  private Sword SwordScript;


ย  ย  private Rigidbody CharaRigid;

ย  ย  private Animator CharaAnimator;

ย  ย  private Transform MainCameraTr;

ย  ย  private Vector3 CameraLook; //์นด๋ฉ”๋ผ๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ

ย  ย  private Vector3 MovingDirection; //์ด๋™ ๋ฐฉํ–ฅ

ย  ย  private CheckAnimeState AnimeState; //์• ๋‹ˆ๋ฉ”์ด์…˜ ์•ก์…˜

ย  ย  private bool IsAttackAnime; //๊ณต๊ฒฉ ๋ชจ์…˜ ์ค‘๋ณต ๋ฐฉ์ง€์šฉ

ย  ย  private bool CanMove;ย  ย //์›€์ง์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€


ย  ย  #endregion


ย  ย  private void Start()

ย  ย  {

ย  ย  ย  ย  CharaInput = GetComponent<PlayerInput>();

ย  ย  ย  ย  SwordScript = SwordObject.GetComponent<Sword>();


ย  ย  ย  ย  CharaRigid = GetComponent<Rigidbody>();

ย  ย  ย  ย  CharaAnimator = GetComponent<Animator>();


ย  ย  ย  ย  if (MainCamera == null)

ย  ย  ย  ย  ย  ย  MainCamera = Camera.main;ย  ย //๋ฉ”์ธ ์นด๋ฉ”๋ผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ณ€์ˆ˜๊ฐ€ null์ด๋ฉด ๋ฉ”์ธ ์นด๋ฉ”๋ผ๋ฅผ ์ฐพ์•„์„œ ์ €์žฅํ•œ๋‹ค

ย  ย  ย  ย  MainCameraTr = MainCamera.transform;


ย  ย  ย  ย  AnimeState = CharaAnimator.GetBehaviour<CheckAnimeState>();

ย  ย  ย  ย  IsAttackAnime = false;

ย  ย  ย  ย  CanMove = true;

ย  ย  }


ย  ย  private void Update()

ย  ย  {

ย  ย  ย  ย  if (CharaInput.Attack && !IsAttackAnime)

ย  ย  ย  ย  ย  ย  SwordAttack();

ย  ย  ย  ย  else if ((CharaInput.MoveX != 0 || CharaInput.MoveZ != 0) && CanMove)

ย  ย  ย  ย  ย  ย  Move();

ย  ย  ย  ย  else

ย  ย  ย  ย  ย  ย  CharaAnimator.SetBool("IsRunning", false);

ย  ย  }


ย  ย  /// <summary>

ย  ย  /// ์บ๋ฆญํ„ฐ ์ด๋™์„ ๋‹ด๋‹น

ย  ย  /// </summary>

ย  ย  private void Move()

ย  ย  {

ย  ย  ย  ย  if (CharaInput && CharaRigid)

ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  //์บ๋ฆญํ„ฐ ํšŒ์ „

ย  ย  ย  ย  ย  ย  CameraLook = MainCameraTr.forward * CharaInput.MoveZ + MainCameraTr.right * CharaInput.MoveX;

ย  ย  ย  ย  ย  ย  CameraLook.y = 0;

ย  ย  ย  ย  ย  ย  CameraLook.Normalize();


ย  ย  ย  ย  ย  ย  CharaRigid.rotation = Quaternion.Lerp(CharaRigid.rotation, Quaternion.LookRotation(CameraLook), RotateSpeed);


ย  ย  ย  ย  ย  ย  //์บ๋ฆญํ„ฐ ์ด๋™

ย  ย  ย  ย  ย  ย  Vector3 V = transform.forward * CharaInput.MoveZ * MovingSpeed;

ย  ย  ย  ย  ย  ย  CharaRigid.velocity = V;

ย  ย  ย  ย  ย  ย ย 

ย  ย  ย  ย  ย  ย  MovingDirection = CameraLook * CharaInput.MoveZ * MovingSpeed;

ย  ย  ย  ย  ย  ย  CharaRigid.velocity = CameraLook * MovingSpeed;


ย  ย  ย  ย  ย  ย  CharaAnimator.SetBool("IsRunning", true);

ย  ย  ย  ย  }

ย  ย  }

}


๊ณต๊ฒฉ ๋ชจ์…˜ ๋ถ€๋ถ„ ์Šคํฌ๋ฆฝํŠธ๋Š” ์ž˜๋ผ์„œ ์—†๋Š” ๊ฑฐ์ž„ ๊ทธ๊ฑด ํ•„์š” ์—†์„ ๊ฑฐ ๊ฐ™์•„์„œ