37. Unity 게임개발 숙련 1주차(5)

이규성·2023년 12월 14일
0

TIL

목록 보기
42/106

12/14 개인 과제 수정의 날. . .

📌알고리즘 코드 카타 (Algorithm Code Kata)

핸드폰 번호 가리기

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

입출력 예

phone_numberreturn
"01033334444""***4444"
"027778888""*8888"
public class Solution 
{
    public string solution(string phone_number) 
    {        
        char[] chars = phone_number.ToCharArray();
        string answer = "";
        
        for (int i = 0; i < chars.Length; i++)
        {
            if (i < chars.Length - 4)
            {
                chars[i] = '*';
            }
            answer += chars[i];
        }        
        return answer;
    }
}

문자열을 char[] 문자 배열로 변환하여 손쉽게 해결하였다.

📌오류 수정

어제 실패했던 기능들을 오늘 해설 강의를 보며 영감을 받아 수정하였다.

아이템의 플립 문제 해결

우선 Aim 오브젝트를 하나 생성하고 투명으로 만들어 준다. 그리고 태그 "Item"을 Aim과 weapon들에게 적용해 준다.

해당하는 스크립트들을 수정해 준다.

AssignmentAimRotation.cs

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEditor.Progress;

public class AssignmentAimRotation : MonoBehaviour
{
    [SerializeField] private SpriteRenderer armRenderer;    
    [SerializeField] private Transform armPivot;

    [SerializeField] private SpriteRenderer characterRenderer;

    private AssignmentCharacterController _controller;

    private void Awake()
    {
        _controller = GetComponent<AssignmentCharacterController>();        
    }

    void Start()
    {
        _controller.OnLookEvent += OnaAim;
    }

    public void OnaAim(Vector2 newAimDirection)
    {
        RotateArm(newAimDirection);
    }

    private void RotateArm(Vector2 direction)
    {
        armRenderer = GameObject.FindWithTag("Item").GetComponent<SpriteRenderer>();
        // 활성화된 오브젝트 중 "Item" 태그를 찾아서 그 오브젝트의 SpriteRenderer를 적용한다.

        float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;

        armRenderer.flipY = Mathf.Abs(rotZ) > 90f;
        characterRenderer.flipX = armRenderer.flipY;

        armPivot.rotation = Quaternion.Euler(0, 0, rotZ);
    }
}
ItemEquipment.cs

using System.Collections;
using System.Collections.Generic;
using Unity.Burst.Intrinsics;
using UnityEngine;

public class ItemEquipment : MonoBehaviour
{
    [SerializeField] private GameObject item;
    [SerializeField] private GameObject equipItemImage;

    [SerializeField] private GameObject aim; // 만들어둔 Aim 오브젝트의 값을 가져온다.

    [SerializeField] private CharacterStatsHandler characterStatsHandler;
       
    public void EquipItem()
    {        
        bool isActive = equipItemImage.activeSelf;
        equipItemImage.SetActive(!isActive);
        item.SetActive(!isActive);

        aim.SetActive(isActive); // 만들어둔 Aim 오브젝트를 켜고 꺼준다.

        if (item.activeSelf == true)
        {            
            characterStatsHandler.UpdateEquipedStats();
            gameManager.Instance.UpdateStatText();
        }
        else if (item.activeSelf == false)
        {            
            characterStatsHandler.UpdateUnEquipedStats();
            gameManager.Instance.UpdateStatText();
        }
    }
}

그리고 ItemEquipment.cs가 연결된 오브젝트에 Aim 오브젝트를 연결시켜 준다.

그러면 Aim과 weapon 오브젝트가 활성화, 비활성화 되면서 로테이션이 적용이 된다.


0개의 댓글