유니티에서 폴더가 많아지다 보면 리소스를 유니티에 넣어야 할 때 폴더가 많아 넣어야 할 폴더를 찾기 어려울 수 있습니다. 그럴 때 아무 폴더에나 넣은 후 쉽게 다른 폴더로 이동시킬 수 있는 방법을 소개하겠습니다.
바로 들어갑시다.
딱히 개념을 설명하는 글은 아니기에 바로 알아봅시다.
유니티에는'MenuItem'라는 클래스가 있습니다. (UnityEditor를 using 해야 사용할 수 있습니다.)
유니티의 Project창에서 우클릭을 했을 때 또는
유니티 상단의
툴바를 눌렀을 때
새로운 생성목록이 생기게 됩니다.
예를들어
[MenuItem("Assets/Move to Resource/Hero", false)]
이런 식으로 유니티에 추가를 하면
그림과 같이 Assets안에 Move to Resource안에 Hero가 생기게 됩니다.
이제 이를 활용해서 본격적인 코드를 설명하겠습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEditor;
public class MoveIconToResource
{
[MenuItem("Assets/Move to Resource/Hero")]
private static void MoveToHero()
{
MoveToResource("Hero");
}
private static void MoveToResource(string resourceType)
{
// 선택된 에셋 경로 가져오기
string selectedPath = AssetDatabase.GetAssetPath(Selection.activeObject);
string destinationPath = $"Assets/Resources/Sprites/{resourceType}";
if(!Directory.Exists(destinationPath))
{
Debug.LogWarning($"{destinationPath}라는 경로는 없습니다.");
return;
}
string fileName = Path.GetFileName(selectedPath);
string fullDestinationPath = Path.Combine(destinationPath, fileName);
AssetDatabase.MoveAsset(selectedPath, fullDestinationPath);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
Debug.Log($"파일이 {fullDestinationPath}로 이동하였습니다."); //디버그
}
[MenuItem("Assets/Move To Resource/Hero", true)]
private static bool VaildMoveToHero()
{
return Selection.activeObject != null;
}
}
우선 [MenuItem("Assets/Move to Resource/Hero")]로 MenuItem을 하나 만들어줍시다.
Assets폴더에 저 이름으로 생기는 것이기에 Assets만 똑같이 적고 뒤에는 아무렇게나 적어주면 됩니다.
(리소스를 이동시키는 목적이고 Hero폴더로 이동시키는 목적이기에 저런 식으로 지었습니다.)
그리고 MoveToResource에 string을 넘겨줍니다. 이때 넘겨주는 string은 여러분이 옮기고 싶은 파일이름으로 넘겨주셔야 합니다.
그리고 string selectedPath = AssetDatabase.GetAssetPath(Selection.activeObject);를 사용해서 에셋의 경로를 가져옵니다. AssetDatabase는 에디터에서 Asset을 관리할 수 있게 해주는 클래스입니다. GetAssetPath는 말 그대로 에셋의 경로를 가져오는 것이고 Selection.activeObject는 현재 선택된 오브젝트를 뜻합니다.
그리고 아래에 이동시킬 폴더의 경로를 string으로 받아줍시다.
그리고 혹시나 경로를 잘못입력할 수 있으니 경로가 존재하는지 한 번 체크해 줍니다.
그리고 경로를 가져왔으니 이번에는 string fileName = Path.GetFileName(selectedPath);로 선택된 경로의 파일의 이름을 가져옵니다.(다른 경로에 똑같은 이름이 있을 수 있기 때문에 선택된 경로의 파일을 가져오게 하는 것이 좋습니다.)
string fullDestinationPath = Path.Combine(destinationPath, fileName);은 전체 대상 경로를 생성합니다.
그리고 SaveAssets()로 변경 사항을 저장합니다.
저장하면 끝 아닌가?라고 생각하실 수 있지만
AssetDatabase.Refresh();로 변경 사항을 반영해주어야 합니다.
이제 사실상 끝났지만 마지막에 메서드 하나가 있습니다.
VaildMoveToHero() 메서드인데, 이 메서드는 유효성을 검사하는 역할을 합니다.
선택된 에셋이 유효할 때(true) 메뉴 항목을 활성화하는 역할을 합니다.
Selection.activeObject != null;를 리턴하여 에셋을 선택하지 않았을 때는 메뉴 항목을 활성화하지 않아서 더욱 효율적입니다.
코드 적용모습
마무리
이번 글은 여기까지입니다.
오블완 챌린지라는 것을 지금 알았네요.
'개발' 카테고리의 다른 글
[C++] 게임프로그래밍 수행평가 회고록 (0) | 2024.12.15 |
---|---|
[C++ winapi] 콘솔창 흔들기 (1) | 2024.11.19 |
[유니티] UI컴포넌트 (2) | 2024.10.29 |
유니티 타임라인 (1) | 2024.10.11 |