[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 36회차 미션 시작합니다.
04. 배틀로얄 - 17, 18 번을 진행합니다.
이번 시간에는 저번시간에 제작한 SoundClip을 사용하는 SoundData 모델을 제작합니다.
내용 난이도는 EffectData와 크게 다르지 않지만, 다양한 옵션 등으로 인해 코드가 좀 깁니다.
위의 위치에 SoundData Script를 생성하고 작업을 시작합니다.
/// <summary>
/// 사운드 클립을 배열로 소지, 사운드 데이터를 저장하고 로드하고, 프리로딩을 가짐.
/// </summary>
public class SoundData : BaseData
{
public SoundClip[] soundClips = new SoundClip[0];
private string clipPath = "Sound/";
private string xmlFilePath = "";
private string xmlFileName = "soundData.xml";
private string dataPath = "Data/soundData";
private static string SOUND = "sound";
private static string CLIP = "clip";
public SoundData() {}
public void SaveData() {
using (XmlTextWriter xml = new XmlTextWriter(xmlFilePath + xmlFileName, System.Text.Encoding.Unicode)) {
xml.WriteStartDocument();
xml.WriteStartElement(SOUND);
xml.WriteElementString("length", GetDataCount().ToString());
xml.WriteWhitespace("\n");
for (int i = 0; i < names.Length; i++) {
SoundClip clip = soundClips[i];
xml.WriteStartElement(CLIP);
xml.WriteElementString("id", i.ToString());
xml.WriteElementString("name", names[i]);
xml.WriteElementString("loops", clip.checkTime.Length.ToString());
xml.WriteElementString("maxvol", clip.maxVolume.ToString());
xml.WriteElementString("pitch", clip.pitch.ToString());
xml.WriteElementString("dopplerlevel", clip.dopplerlevel.ToString());
xml.WriteElementString("rolloffmode", clip.rolloffMode.ToString());
xml.WriteElementString("mindistance", clip.minDistance.ToString());
xml.WriteElementString("maxdistance", clip.maxDistance.ToString());
xml.WriteElementString("spartialblend", clip.spartialBlend.ToString());
if (clip.isLoop == true) {
xml.WriteElementString("loop", "true");
}
xml.WriteElementString("clippath", clip.clipPath);
xml.WriteElementString("clipname", clip.clipName);
xml.WriteElementString("checktimecount", clip.checkTime.Length.ToString());
string str = "";
foreach (float t in clip.checkTime) {
str += t.ToString() + "/";
}
xml.WriteElementString("checktime", str);
str = "";
xml.WriteElementString("settimecount", clip.setTime.Length.ToString());
foreach (float t in clip.setTime) {
str += t.ToString() + "/";
}
xml.WriteElementString("settime", str);
xml.WriteElementString("type", clip.playType.ToString());
xml.WriteEndElement(); // CLIP
}
xml.WriteEndElement(); // SOUND
xml.WriteEndDocument();
}
}
public void LoadData() {
xmlFilePath = Application.dataPath + dataDirectory;
TextAsset asset = (TextAsset)Resources.Load(dataPath, typeof(TextAsset));
if (asset == null || asset.text == null) {
AddData("NewSound");
return;
}
using (XmlTextReader reader = new XmlTextReader(new StringReader(asset.text))) {
int currentID = 0;
while (reader.Read()) {
if (reader.IsStartElement()) {
switch (reader.Name) {
case "length":
int length = int.Parse(reader.ReadString());
names = new string[length];
soundClips = new SoundClip[length];
break;
case "clip":
case "id":
currentID = int.Parse(reader.ReadString());
soundClips[currentID] = new SoundClip();
soundClips[currentID].realId = currentID;
break;
case "name":
names[currentID] = reader.ReadString();
break;
case "loops":
int count = int.Parse(reader.ReadString());
soundClips[currentID].checkTime = new float[count];
soundClips[currentID].setTime = new float[count];
break;
case "maxvol":
soundClips[currentID].maxVolume = float.Parse(reader.ReadString());
break;
case "pitch":
soundClips[currentID].pitch = float.Parse(reader.ReadString()));
break;
case "dopplerlevel":
soundClips[currentID].dopplerLevel = float.Parse(reader.ReadString());
break;
case "rolloffmode":
soundClips[currentID].rolloffMode = (AudioRolloffMode)Enum.Parse(typeof(AudioRolloffMode), reader.ReadString()));
case "mindistance":
soundClips[currentID].minDistance = float.Parse(reader.ReadString());
break;
case "maxdistance":
soundClips[currentID].maxDistance = float.Parse(reader.ReadString());
break;
case "spartialblend":
soundClips[currentID].spartialBlend = float.Parse(reader.ReadString());
break;
case "loop":
soundClips[currentID].isLoop = true;
break;
case "clippath":
soundClips[currentID].clipPath = reader.ReadString();
break;
case "clipname":
soundClips[currentID].clipName = reader.ReadString();
break;
case "checktimecount":
break;
case "checktime":
SetLoopTime(true, soundClips[currentID], reader.ReadString());
break;
case "settime":
SetLoopTime(false, soundClips[currentID], reader.ReadString());
break;
case "type":
soundClips[currentID].playType = (SoundPlayType)Enum.Parse(typeof(SoundPlayType), reader.ReadString()));
}
}
}
}
// 미리 불러와 놓기. 리소스가 많아 로딩이 느리다면 제거하라.
foreach (SoundClip clip in soundClips) {
clip.PreLoad();
}
}
void SetLoopTime(bool isCheck, SoundClip clip, string timeString) {
string[] time = timeString.Split('/');
for (int i = 0; i < time.Length; i++) {
if (time[i] != string.Empty) {
if (isCheck == true)
clip.checkTime[i] = float.Parse(time[i]);
else
clip.setTime[i] = float.Parse(time[i]);
}
}
}
public override int AddData(string newName) {
if (names == null) {
names = new string[] { newName };
soundClips = new SoundClip[] { new SoundClip() };
}
else {
names = ArrayHelper.Add(newName, names);
soundClips = ArrayHelper.Add(new SoundClip(), soundClips);
}
}
public override void RemoveData(int index) {
names = ArrayHelper.Remove(index, names);
if (names.Length == 0) names = null;
soundClips = ArrayHelper.Remove(index, soundClips);
}
public SoundClip GetCopy(int index) {
if (index < 0 || index >= soundClips.Length) return null;
SoundClip clip = new SoundClip();
SoundClip original = soundClips[index];
clip.realId = index;
clip.clipPath = original.clipPath;
clip.clipName = original.clipName;
clip.maxVolume = original.maxVolume;
clip.pitch = original.pitch;
clip.dopplerLevel = original.dopplerLevel;
clip.rolloffMode = original.rolloffMode;
clip.minDistance = original.minDistance;
clip.maxDistance = original.maxDistance;
clip.spartialBlend = original.spartialBlend;
clip.isLoop = original.isLoop;
clip.checkTime = new float[original.checkTime.Length];
clip.setTime = new float[original.setTime.Length];
clip.playType = original.playType;
for (int i=0; i < clip.checkTime.Length; i++) {
clip.checkTime[i] = original.checkTime[i];
clip.setTime[i] = original.setTime[i];
}
clip.PreLoad();
return clip;
}
public override void Copy(int index) {
names = ArrayHelper.Add(names[index], names);
soundClips = ArrayHelper.Add(GetCopy(index), soundClips);
}
}
여기까지가 SoundData의 완료입니다.. ^^;;;
xml로 저장하고 불러와서 파싱하기가 주요코드인데 옵션들이 많다보니 반복적인 코드가 많고 눈이 빙글빙글 ㅎㅎ..
다음 시간에는 SoundTool을 제작합니다...
<위의 코드들은 제가 보면서 주요한 함수, 코드를 확인하기 위해 타이핑한 용도로, 전체 소스코드가 아님에 주의해 주세요. 전체 코드는 교육 수강을 하면 완벽하게 받으실 수가 있답니다 ^^>
패스트캠퍼스 - 올인원 패키지 : 유니티 포트폴리오 완성 bit.ly/2R561g0
'[컴퓨터] > 웹 | 앱 | 게임 개발' 카테고리의 다른 글
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 38회차 미션 (0) | 2020.11.25 |
---|---|
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 37회차 미션 (0) | 2020.11.24 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 35회차 미션 (0) | 2020.11.22 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 34회차 미션 (0) | 2020.11.21 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 33회차 미션 (0) | 2020.11.20 |