[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 33회차 미션 시작합니다.
04. 배틀로얄 - 11, 12 번을 진행합니다.
저번 시간에 이어 Save, Add, Remove, Copy 등의 구현을 시작합니다.
아래 진행하는 코드 중 ArrayHelper라는 클래스는 제공되는 프로젝트에 포함되어 있는 코드를 사용합니다.
Array 기능을 좀더 쉽게 사용할 수 있는 기능을 가진 함수 모음 클래스라고 생각하면 됩니다.
크게 중요하지 않은 내용이므로 제공된 소스를 사용만 하면 됩니다. Tool용 ArrayHelper 입니다.
public class EffectData : DataBase
{
// 저번시간코드들..
public void SaveData() {
using (XmlTextWriter xml = new XmlTextWriter(xmlFilePath + xmlFileName, System.Text.Encoding.Unicode) {
xml.WriteStartDocument();
xml.WriteStartElement(EFFECT); // EFFECT Key
xml.WriteElementString("length", GetDataCount().ToString());
for (int i = 0; i < this.names.Length; i++) {
EffectClip clip = this.effectClips[i];
xml.WriteStartElement(CLIP); // CLIP Key
xml.WriteElementString("id", i.ToString());
xml.WriteElementString("name", this.names[i]);
xml.WriteElementString("effectType", clip.effectType.ToString());
xml.WriteElementString("effectPath", clip.effectPath);
xml.WriteElementString("effectName", clip.effectName);
xml.WriteEndElement(); // CLIP End
}
xml.WriteEndElement(); // EFFECT End
xml.WriteEndDocument();
}
}
public override int AddData(string newName) {
if (this.names == null) {
this.names = new string[] { name };
this.effectClips = new EffectClip[] { new EffectClip() };
}
else {
this.names = ArrayHelper.Add(name, this.names);
this.effectClips = ArrayHelper.Add(new EffectClip(), this.effectClips);
}
return GetDataCount();
}
public override void RemoveData(int index) {
this.names = ArrayHelper.Remove(index, this.names);
if (this.names.Length == 0) this.names = null;
this.effectClips = ArrayHelper.Remove(index, this.effectClips);
}
public void ClearData() { // Bonus function
foreach (EffectClip clip in this.effectClips) {
clip.ReleaseEffect();
}
this.effectClips = null;
this.names = null;
}
public EffectClip GetCopy(int index) {
if (index < 0 || index >= this.effectClips.Length) return null;
EffectClip original = this.effectClips[index];
EffectClip clip = new EffectClip();
clip.effectFullPath = original.effectFullPath;
clip.effectName = original.effectName;
clip.effectType = original.effectType;
clip.effectPath = original.effectPath;
clip.realId = this.effectClips.Length;
return clip;
}
/// <summary>
/// 원하는 인덱스를 프리로딩해서 찾아준다
/// </summary>
public EffectClip GetClip(int index) {
if (index < 0 || index >= this.effectClips.Length) return null;
effectClips[index].PreLoad();
return effectClips[index];
}
public override void Copy(int index) {
this.names = ArrayHelper.Add(this.names[index], this.names);
this.effectClips = ArrayHelper.Add(GetCopy(index), this.effectClips);
}
}
여기까지가 EffectData 에 대한 처리 마무리였고 이제부터 본격적인 Tool 개발에 들어갑니다 ^^~
공통 툴 레이어 작성입니다.
본격적인 EffectTool 제작 전에, 공통 툴을 만들어두면 다른 툴을 만들때에도 재사용 가능하기 때문에 제작해두는 것이 좋습니다.
EditorHelper 클래스입니다.
ArrayHelper와 비슷하게 Tool 개발을 용이하게 해주는 함수들의 모음이며 프로젝트에 포함되어 배포되어 있습니다.
다음의 2가지 함수는 구현되어 있고, 나머지 함수들을 추가 구현합니다.
+ GetPath() - Resource를 전달하면 Resource의 경로를 리턴해주는 함수
+ CreateEnumStructure() - Enum 객체를 만들어주는 함수
public class EditorHelper
{
public static string GetPath(UnityEngine.Object p_clip) {}
public static void CreateEnumStructure(string enumName, StringBuilder data) {}
// Tool UI 상단
public static void EditorToolTopLayer(BaseData data, ref int selection, ref UnityObject source, int uiWidth) {
EditorGUILayout.BeginHorizontal();
{
if (GUILayout.Button("ADD", GUILayout.Width(uiWidth))) {
data.AddData("New Data");
selection = data.GetDataCount() - 1; // 최종 Item 선택
source = null;
}
if (GUILayout.Button("COPY", GUILayout.Width(uiWidth))) {
data.Copy(selection);
source = null;
selection = data.GetDataCount() - 1;
}
if (data.GetDataCount() > 1) {
if (GUILayout.Button("REMOVE", GUILayout.Width(uiWidth))) {
source = null;
data.RemoveData(selection);
}
}
if (selection > data.GetDataCount() - 1) { // out of range
selection = data.GetDataCount() - 1;
}
}
EditorGUILayout.EndHorizontal();
}
// Tool UI 리스트
public static void EditorToolListLayer(ref Vector2 ScrollPosition, BaseData data, ref int selection, ref UnityObject source, int uiWidth) {
EditorGUILayout.BeginVertical(GUILayout.Width(uiWidth);
{
EditorGUILayout.Separator();
EditorGUILayout.BeginVertical("box");
{
ScrollPosition = EditorGUILayout.BeginScrollView(ScrollPosition);
{
if (data.GetDataCount() > 0) {
int lastSelection = selection;
selection = GUILayout.SelectionGrid(selection, data.GetNameList(true), 1);
if (lastSelection != selection) { // 선택이 바뀌었으면
source = null;
}
}
}
EditorGUILayout.EndScrollView();
}
EditorGUILayout.EndVertical();
}
EditorGUILayout.EndVertical();
}
}
다음시간에 공통 툴 레이어 완성 및 본격적인 EffectTool 만들기를 시작합니다 ^^~
<위의 코드들은 제가 보면서 주요한 함수, 코드를 확인하기 위해 타이핑한 용도로, 전체 소스코드가 아님에 주의해 주세요. 전체 코드는 교육 수강을 하면 완벽하게 받으실 수가 있답니다 ^^>
패스트캠퍼스 - 올인원 패키지 : 유니티 포트폴리오 완성 bit.ly/2R561g0
'[컴퓨터] > 웹 | 앱 | 게임 개발' 카테고리의 다른 글
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 35회차 미션 (0) | 2020.11.22 |
---|---|
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 34회차 미션 (0) | 2020.11.21 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 32회차 미션 (0) | 2020.11.19 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 31회차 미션 (0) | 2020.11.18 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 30회차 미션 (0) | 2020.11.17 |