이 글은 평범한 취준생이 평범하게 자신이 당일 배운것들과 느낀점들을 쓰기 때문에 정보가 정확하지 않을 수 있습니다
자 말해 뭐하겠는가 그냥 간단하게 알아보자.
오늘 뭐함?
일단 어제 아직 하지 못했던 Atlas들을 게속 넣어주었다. 내가 이걸 어제 다 하지 못하고 오늘 한 이유는, Atlas를 적용시키면서 해당 이미지를 실시간으로 바꾸어야 할 때 어떻게 해야 할지 고민이 되었다. 정말 고민이 많이 되었지만, 일단 밑의 방식으로 해결되었다.
using UnityEngine;
using UnityEngine.U2D;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class KnifeCheckObject : CheckObject
{
[Header("SpriteAtlas Settings")]
[SerializeField] private string _atlasAddress; //아틀라스 어드레서블
[SerializeField] private string _originSpriteName; //스프라이트 이름
[SerializeField] private string _replaceSpriteName; //바뀔 스프라이트 이름
private Sprite _originImage; //원래 이미지
private Sprite _replaceImage; //바뀔 이미지
private SpriteAtlas _loadedAtlas; //아틀라스
private void Awake()
{
Init();
}
private void OnAtlasLoaded(AsyncOperationHandle<SpriteAtlas> handle)
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
_loadedAtlas = handle.Result;
_originImage = _loadedAtlas.GetSprite(_originSpriteName);
_replaceImage = _loadedAtlas.GetSprite(_replaceSpriteName);
if (_originImage == null || _replaceImage == null)
{
Debug.LogWarning("Atlas에서 스프라이트를 찾을 수 없습니다.");
return;
}
ChangeToOriginImage(); //이미지 먼저 세팅
base.Init();
}
}
public override void Init()
{
Addressables.LoadAssetAsync<SpriteAtlas>(_atlasAddress).Completed += OnAtlasLoaded;
}
//원래 이미지로 바꾸기
public void ChangeToOriginImage()
{
GetComponent<SpriteRenderer>().sprite = _originImage;
}
//바뀔 이미지로 바꾸기
public void ChangeToReplaceImage()
{
GetComponent<SpriteRenderer>().sprite = _replaceImage;
}
#region OnTrigger
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.GetComponent<GBInteractDetector>() != null)
{
_checkPanel.YesButton.onClick.AddListener(DisplayNextTalk);
_checkPanel.YesButton.onClick.AddListener(ChangeToReplaceImage);
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.gameObject.GetComponent<GBInteractDetector>() != null)
{
_checkPanel.YesButton.onClick.RemoveListener(DisplayNextTalk);
_checkPanel.YesButton.onClick.RemoveListener(ChangeToReplaceImage);
}
}
#endregion
}
그리고 이런 방법으로 나머지 부분도 해결해주었다.
그리고 나머지 시간은 리펙토링에 집중하였다. 리펙토링은 코드의 기능적인 부분은 그대로 두면서 다른 사람들이 알기 쉽도록 개선하는 작업을 말하는데, 처음부터 뭔가 구조적인 부분의 개선을 통해 조금 더 해보려고 했으나, 처음에 그렇게 접근하려니 오류들이 나를 반겨주고 제대로 게임이 굴러가지 않았다. 만약 내가 계속 이런 작업을 계속한다면, 오늘안에 끝내지도 못할 것 같아서 일단 변수명, 주석, 간단한 수정 및 삭제 정도에 집중했다. 물론 구조적으로 개선하면 내 입장에서 제일 베스트지만, 지금 주석, 변수명 등등 기본적인 것들이 일부 잘못잡혀있는 상황에서는 이것들을 먼저 바로잡는게 맞다고 생각했다. 그래서 오늘은 이런 자잘한 리펙토링에 시간을 쏟았다. 그런데도, 많은 시간을 썼다는건 너무 내가 코드를 잘 작성하지 못한다는 것에 대해 반성하기도 했다.