김김김의 게임개발
  • 유니티 게임개발 입문 #2
    2023년 09월 05일 21시 13분 55초에 업로드 된 글입니다.
    작성자: noun06

    [게더 클론 개인 프로젝트]

    캐릭터 이동

    • New Input System을 사용하여 WASD를 통해 플레이어의 이동 제어.
    • 키보드 입력값에 따라 x축 반전을 통해 캐릭터의 방향 바꾸기.
    //PLayer.cs
    
    using UnityEngine.InputSystem;
    
    public class Player : MonoBehaviour
    {
        [SerializeField] private float _speed;
    
        private Rigidbody2D _rigidbody;
        private Vector2 _movementInput;
    
        private bool isFlipped = false;
    
        private void Awake()
        {
            _rigidbody = GetComponent<Rigidbody2D>();
        }
    
        private void FixedUpdate()
        {
            _rigidbody.velocity = _movementInput * _speed;
        }
    
        private void OnMove(InputValue inputValue)
        {
            _movementInput = inputValue.Get<Vector2>().normalized;
    
            if (_movementInput.x > 0 && isFlipped)
            {
                FlipCharacter();
            }
            else if (_movementInput.x < 0 && !isFlipped)
            {
                FlipCharacter();
            }
        }
    
        private void FlipCharacter()
        {
            transform.localScale = new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z);
            isFlipped = !isFlipped;
        }
    
    }

     

    이름 입력 시스템

    • 메인메뉴 씬의 사용자가 입력한 이름을 게임 씬으로 넘겨주어 UI로 보여주기.
    //Player.cs
    
    public class Player : MonoBehaviour
    {
        //...
    
        public static string playerNameStr;
        public TMP_Text playerName;
        public TMP_Text playerName2;
    
        private void Awake()
        {
            playerName.text = playerNameStr;
            playerName2.text = playerNameStr;
    
        }
        //...
    }

     

    • StartGame()함수는 "방 입장" 버튼에 붙여서 다음 씬 로드와 동시에 사용.
    //MainMenu.cs
    
    public class MainMenu : MonoBehaviour
    {
        public TMP_InputField playerName;
    
        //...
        public void StartGame()
        {
            Player.playerNameStr = playerName.text;
            Application.LoadLevel(1);
            //...
        }
    }

     

    캐릭터 선택 시스템

    • 사용할 캐릭터들을 public 배열로 선언 후 각 요소에 번호를 할당.
    • Next/Back 버튼 클릭 시 해당 번호에 맞는 프리팹만을 활성화.
    //MainMenu.cs
    
    public class MainMenu : MonoBehaviour
    {
        public GameObject[] characters;
        public int selectedCharacter = 0;
    
        public void NextCharacter()
        {
            characters[selectedCharacter].SetActive(false);
            selectedCharacter = (selectedCharacter + 1) % characters.Length;
            characters[selectedCharacter].SetActive(true);
        }
    
        public void PreviousCharacter()
        {
            characters[selectedCharacter].SetActive(false);
            selectedCharacter--;
            if(selectedCharacter < 0)
            {
                selectedCharacter += characters.Length;
            }
            characters[selectedCharacter].SetActive(true);
        }
    
        public void StartGame()
        {
            //...
            PlayerPrefs.SetInt("selectedCharacter", selectedCharacter);
        }
    }

     

    • PlayerPrefs를 사용하여 선택된 캐릭터를 저장하여 게임 씬에 Instantiate하여 로드.
    //LoadCharacter.cs
    
    public class LoadCharacter : MonoBehaviour
    {
        public GameObject[] characterPrefabs;
        public Transform spawnPoint;
    
        private void Start()
        {
            int selectedCharacter = PlayerPrefs.GetInt("selectedCharacter");
            GameObject prefab = characterPrefabs[selectedCharacter];
            GameObject clone = Instantiate(prefab, spawnPoint.position, Quaternion.identity);
    
            clone.SetActive(true);
        }
    }

     

    시간 표시

    • DataTime.Now.ToString() 메서드를 사용하여 현재 날짜 및 시간을 보여줌.
    //CurrentTime.cs
    
    public class CurrentTime : MonoBehaviour
    {
        [SerializeField] TMP_Text currentTime;
    
        private void Update()
        {
            currentTime.text = DateTime.Now.ToString();
        }
    }

     

    NPC 대화

    • OnTrigger2D를 통해 플레이어가 특정한 구역과 닿아있을 경우 대화창 활성화.
    //ShowUI.cs
    
    public class ShowUI : MonoBehaviour
    {
        public GameObject uiObject;
    
        private void Start()
        {
            uiObject.SetActive(false);
        }
    
        private void OnTriggerStay(Collider other)
        {
            if (other.tag == "Player")
            {
                uiObject.SetActive(true);
                gameObject.SetActive(false);
            }
        }
    
        private void OnTriggerExit(Collider other)
        {
            if (other.tag == "Player")
            {
                uiObject.SetActive(false);
            }
        }
    }

     

     

    댓글