기록은 기억을 이기고 시간보다 오래 남는다.

게임 개발/Unity

[Unity] Player Controller

준_준 2024. 5. 29. 14:44

플레이어 이동

if (Input.GetKey(KeyCode.W))
        {
            transform.position += Vector3.up * Time.deltaTime * _speed;
        }
        else if (Input.GetKey(KeyCode.S))
        {
            transform.position += Vector3.down * Time.deltaTime * _speed;

        }
        else if (Input.GetKey(KeyCode.A))
        {
            transform.position += Vector3.left * Time.deltaTime * _speed;

        }
        else if (Input.GetKey(KeyCode.D))
        {
            transform.position += Vector3.right * Time.deltaTime * _speed;

        }
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static Define;

public class PlayerController : MonoBehaviour
{
    public Grid _grid;
    public float _speed = 5f;

    Vector3Int _cellPos= Vector3Int .zero;
    MoveDir _dir = MoveDir.None;
    bool _isMoving = false;

    void Start()
    {
        Vector3 pos = _grid.CellToWorld(_cellPos)+new Vector3(0.5f,0.5f);
        transform.position = pos;
    }

    void Update()
    {
        GetDirInput();  //키보드 입력
        UpdatedPosition();//실질적으로 스르륵 이동하는거
        UpdateIsMoving(); //이동가능 상태일때 업데이트 
    }
    void UpdatedPosition()
    {
        if (_isMoving == false)
            return;
        Vector3 destPos = _grid.CellToWorld(_cellPos) + new Vector3(0.5f, 0.5f);
        Vector3 moveDir=destPos-transform.position;
        float dist = moveDir.magnitude;
        if(dist < _speed*Time.deltaTime)
        {
            transform.position = destPos;
            _isMoving = false;
        }
        else
        {
            transform.position+=moveDir*_speed*Time.deltaTime;
            _isMoving=true;
        }
       

    }
    void UpdateIsMoving()
    {
        if (_isMoving == false)
        {
            switch (_dir)
            {
                case MoveDir.Up:
                    _cellPos += Vector3Int.up;
                    _isMoving = true;
                    break;
                case MoveDir.Down:
                    _cellPos += Vector3Int.down;
                    _isMoving = true;
                    break;
                case MoveDir.Left:
                    _cellPos += Vector3Int.left;
                    _isMoving = true;
                    break;
                case MoveDir.Right:
                    _cellPos += Vector3Int.right;
                    _isMoving = true;
                    break;
            }
        }
    }
    void GetDirInput()
    {
        if (Input.GetKey(KeyCode.W))
        {
            // transform.position += Vector3.up * Time.deltaTime * _speed;
            _dir = MoveDir.Up;
        }
        else if (Input.GetKey(KeyCode.S))
        {
            // transform.position += Vector3.down * Time.deltaTime * _speed;
            _dir = MoveDir.Down;

        }
        else if (Input.GetKey(KeyCode.A))
        {
            //transform.position += Vector3.left * Time.deltaTime * _speed;
            _dir = MoveDir.Left;

        }
        else if (Input.GetKey(KeyCode.D))
        {
            //transform.position += Vector3.right * Time.deltaTime * _speed;
            _dir = MoveDir.Right;
        }
        else
        {
            _dir = MoveDir.None;
        }
    }
}
반응형

'게임 개발 > Unity' 카테고리의 다른 글

[Unity] 커서 생성 혹은 감추기  (0) 2024.05.29
[Unity] Map tool  (0) 2024.05.29
[UNITY] 코드로 Collider/isTrigger 설정 방법  (1) 2023.12.02
[Unity] 2D에서 캐릭터 따라다니는 카메라  (0) 2023.10.16
Unity 기초 함수  (0) 2022.10.19