본문 바로가기

카테고리 없음

UNITY 게임개발트랙 - 내일배움캠프 18일차 TIL

내일배움캠프 18일차 TIL

오전에는 유니티 입문 주차 발제와 코드카타 시간이 있었다. 이후 유니티 입문 강의를 수강하고 해당 주차 내용을 복습하는 시간을 가졌다.
기억에 남는 문제는 문자열 내림차순으로 배치하기 이다.

[level 1] 문자열 내림차순으로 배치하기 - 12917

문제 설명

문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

제한 사항
  • str은 길이 1 이상인 문자열입니다.
입출력 예
s return
"Zbcdefg" "gfedcbZ"

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

알파벳을 정렬하는 것 정도는 문자열을 ToCharArray()메서드를 통해 배열로 변환한 후 OrderByDescending 메서드를 이용해서 역순으로 재배치하는 방식으로 쉽게 구현할 수 있다고 생각했다. 일단 이렇게 구현하고 대문자를 어떻게 구분하고 배치할지 고민해보자는 생각으로 일단
코드를 작성하고 실행해보았으나 허무하게 그대로 문제가 풀렸다. 알고 보니 Char 자료형에서 대문자와 소문자를 비교하면 대문자가 더 크기 때문에, OrderByDescending 메서드로 문제의 요구사항대로 대문자가 자연스럽게 뒤쪽으로 배치된 것이었다. 이렇게 하나 알아간다...

using System.Linq;

public class Solution {
    public string solution(string s) {
        string answer = "";
        char[] arr = s.ToCharArray();
        arr = arr.OrderByDescending(x => x).ToArray();
        foreach (char letter in arr)
        {
            answer += letter.ToString();
        }
        return answer;
    }
}

Unity 게임 개발 입문

사전캠프 때 들었던 게임개발 종합반 수업에서 웬만한 기본기는 다 익혔기 때문에, 이번 입문 강의는 별로 어려운 내용이 없을 줄 알았는데, 생각보다 이해하기 어렵고 새로운 내용들이 있었다.

Input Manager

Input.GetAxis 등 메서드를 통해 인풋을 받아오던 방식과는 다르게, 패키지 매니저에서 Input Manager라는 패키지를 받아서 사용해보았다. 먼저 이벤트를 정의하고 , 이벤트를 부르는 메서드를 정의하는 CharacterController 스크립트를 작성한다.

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


public class TopDownCharacterController : MonoBehaviour
{
    public event Action<Vector2> OnMoveEvent;
    public event Action<Vector2> OnLookEvent;


    public void CallMoveEvent(Vector2 direction)
    {
        OnMoveEvent?.Invoke(direction);
    }

    public void CallLookEvent(Vector2 direction)
    {
        OnLookEvent?.Invoke(direction);
    }

}

방금 작성한 캐릭터 컨트롤러를 상속받고, 인풋에 따라 캐릭어 컨트롤러의 메서드를 호출하는 인풋 컨트롤러 스크립트를 작성한다.

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

public class PlayerInputController : TopDownCharacterController
{
    private Camera _camera;
    private void Awake()
    {
        _camera = Camera.main;
    }

    public void OnMove(InputValue value)
    {
        // Debug.Log("OnMove" + value.ToString());
        Vector2 moveInput = value.Get<Vector2>().normalized;
        CallMoveEvent(moveInput);
    }

    public void OnLook(InputValue value)
    {
        // Debug.Log("OnLook" + value.ToString());
        Vector2 newAim = value.Get<Vector2>();
        Vector2 worldPos = _camera.ScreenToWorldPoint(newAim);
        newAim = (worldPos - (Vector2)transform.position).normalized;

        if (newAim.magnitude >= .9f)
        {
            CallLookEvent(newAim);
        }
    }

    public void OnFire(InputValue value)
    {
        Debug.Log("OnFire" + value.ToString());
    }
}

이후 별도의 스크립트에서 CharacterController 스크립트의 이벤트들에 구독하고, 이동 및 시선처리 등 이벤트를 통해 전달되는 값을 통해 다양한 기능을 구현할 수 있다. 아래는 이동 구현의 예시다.

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

public class TopDownMovement : MonoBehaviour
{
    private TopDownCharacterController _controller;

    private Vector2 _movementDirection = Vector2.zero;
    private Rigidbody2D _rigidbody;

    private void Awake()
    {
        _controller = GetComponent<TopDownCharacterController>();
        _rigidbody = GetComponent<Rigidbody2D>();
    }

    private void Start()
    {
        _controller.OnMoveEvent += Move;
    }

    private void FixedUpdate()
    {
        ApplyMovment(_movementDirection);
    }

    private void Move(Vector2 direction)
    {
        _movementDirection = direction;
    }

    private void ApplyMovment(Vector2 direction)
    {
        direction = direction * 5;

        _rigidbody.velocity = direction;
    }
}