6์›”๋‹ฌ์— ๊ธฐํš์„œ ์ž‘์„ฑํ•ด์„œ ํ”ผ๋“œ๋ฐฑ์ข€ํ•ด๋‹ฌ๋ผ๊ณ ํ–ˆ๋˜ ์ธ๋ถ•์ด์ž„ https://gall.dcinside.com/m/game_dev/98288 (๊ทธ๋•Œ ์˜ฌ๋ ธ์—ˆ๋˜๊ธ€ ๋™์ผ์ธ๋ฌผ ๋งž์Œ)

์›๋ž˜๋Š” 6์›”๋‹ฌ ๋ถ€ํ„ฐ ๊ฐœ๋ฐœํ–ˆ์–ด์•ผํ–ˆ๋Š”๋ฐ ๊ฒŒ์„๋Ÿฌ๊ฐ€์ง€๊ณ  7์›”์— ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ ๋…ธ๋А๋ผ๊ณ  ์‹ค ๊ฐœ๋ฐœ์‹œ๊ฐ„์€ 2์ฃผ์ •๋„๋ฐ–์— ์•ˆ๋˜๋Š”๋“ฏ..


๋งˆ๋ฒ• ์ œ์ž‘ ๋ฌธ๋ฒ• ๋ณ€๊ฒฝ

์›๋ž˜์˜ ๊ธฐํš๋Œ€๋กœ๋ผ๋ฉด ๋งˆ๋ฒ•์˜ ์ •๋ณด๋ฅผ ์ •์˜ํ•˜๊ณ  ์ •์˜ํ•œ ์ •๋ณด์— ๋”ฐ๋ผ์„œ ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋งˆ๋ฒ•์„ ์ œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ–ˆ์—ˆ์Œย 


๊ทผ๋ฐ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ๊นŒ ๋„ˆ๋ฌด ๋ณ„๋กœ์ž„ ๋ฌธ๋ฒ•๋„ ์€๊ทผํžˆ ๋ณต์žกํ•˜๊ณ  ๊ตฌํ˜„๋„ ๊ท€์ฐฎ์„๊ฒƒ ๊ฐ™์•„์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋งŒ๋“ค๊ฒŒ๋˜์—ˆ์Œ.ย 


ย 

๊ทธ๋ž˜์„œ ๋ฐ”๊พผ ๋ฐฉ๋ฒ•์€ ์ฃผ๋ฌธ์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋“ค์˜ ์ง‘ํ•ฉ๋“ค์„ ์ง‘ํ•ฉ์‹œ์ผœ์„œ ํ•˜๋‚˜์˜ ๋งˆ๋ฒ•์„ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๊ฒŒ๋ฌ์Œ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ฌธ๋ฒ•๋„ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ๋งŒ๋“ค์–ด์งˆ์ˆ˜ ์žˆ๋Š” ๋งˆ๋ฒ•์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋„ ๋งŽ์•„์ง€๊ฒŒ ๋˜์„œ ์ข‹์€๋“ฏ


๋งˆ๋ฒ•์˜ ํ˜•ํƒœ๋ณ€๊ฒฝ


์ „์— ๊ธฐํšํ–ˆ๋˜ ๋งˆ๋ฒ•์˜ ๊ฒฝ์šฐย 


๋งˆ๋ฒ•์˜ ํƒ€์ž…(๋ถˆ๋งˆ๋ฒ•,๋•…๋งˆ๋ฒ• ๋“ฑ๋“ฑ...),๋งˆ๋ฒ•์˜ ์ข…๋ฅ˜(๊ณต๊ฒฉ ๋งˆ๋ฒ•,๋ฒ„ํ”„ ๋งˆ๋ฒ• ๋“ฑ๋“ฑ...), ๋งˆ๋ฒ• ์Šคํฌ๋กคย ์‚ฌ์šฉ์— ํ•„์š”ํ•œ ๋งˆ๋‚˜๊ณ„์ˆ˜(์†๋‹˜์ด ๋งˆ๋ฒ•์„ ๊ตฌ๋งคํ• ๋•Œ์— ๊ณ ๋ คํ•˜๊ฒŒ๋˜๋Š” ์š”์†Œ), ๋งˆ๋‚˜์„œํด(์ œ์ž‘ํ•œ ์Šคํฌ๋กค์˜ ์œ„๋ ฅ)ย 

์ด๋Ÿฌํ•œ ์ •๋ณด๋“ค์„ ๋‹ด๊ณ ์žˆ์—ˆ์Œ ๊ทธ์—๋”ฐ๋ผ ํ‚ค์›Œ๋“œ์— ๋‹ด๊ฒจ์ ธ์žˆ๋Š” ์ •๋ณด๋“ค๋„ ๋„ˆ๋ฌด ๋งŽ์•˜์Œย 


ํ‚ค์›Œ๋“œ์˜ ํƒ€์ž…(๋ถˆ๋งˆ๋ฒ• ์„ฑํ–ฅ์˜ ํ‚ค์›Œ๋“œ์ธ์ง€ ๋•…๋งˆ๋ฒ• ์„ฑํ–ฅ์˜ ํ‚ค์›Œ๋“œ์ธ์ง€ ๋“ฑ๋“ฑ...), ํ‚ค์›Œ๋“œ์˜ ์„ฑํ–ฅ(๊ณต๊ฒฉ ๋งˆ๋ฒ•์˜ ํ‚ค์›Œ๋“œ์ธ์ง€ ๋ฒ„ํ”„ ๋งˆ๋ฒ•์˜ ํ‚ค์›Œ๋“œ์ธ์ง€ ๋“ฑ๋“ฑ...), ๋งˆ๋‚˜(์‚ฌ์šฉํ•œ ํ‚ค์›Œ๋“œ๋“ค์˜ ๋งˆ๋‚˜์˜ ํ•ฉ์ด ๋งˆ๋‚˜๊ณ„์ˆ˜๊ฐ€ ๋จ),ํ‚ค์›Œ๋“œ์˜ ์œ„๋ ฅ(์‚ฌ์šฉํ•œ ํ‚ค์›Œ๋“œ์ค‘ ์œ„๋ ฅ์ด ๊ฐ€์žฅ ํฐ๊ฐ’์ด ๋งˆ๋‚˜ ์„œํด์ด ๋จ)

๋„ˆ๋ฌด ๋งŽ์•„๊ฐ€์ง€๊ณ  ๋งˆ๋ฒ•์„ ๋งŒ๋“œ๋Š”๋ฐ์— ์ƒ๊ฐํ•ด์•ผํ• ๊ฒŒ ๋„ˆ๋ฌด ๋งŽ๊ณ  ๋ณต์žกํ•ด์„œ ๋งˆ๋ฒ• ํ˜•ํƒœ๋ฅผ ๋ฐ”๊พธ์—ˆ์Œ


ํ‚ค์›Œ๋“œ์˜ ์„ฑํ–ฅ(๊ณต๊ฒฉ ๋งˆ๋ฒ•์˜ ํ‚ค์›Œ๋“œ์ธ์ง€ ๋ฒ„ํ”„ ๋งˆ๋ฒ•์˜ ํ‚ค์›Œ๋“œ์ธ์ง€ ๋“ฑ๋“ฑ...),ํ‚ค์›Œ๋“œ์˜ ์œ„๋ ฅ(์‚ฌ์šฉํ•œ ํ‚ค์›Œ๋“œ์ค‘ ์œ„๋ ฅ์ด ๊ฐ€์žฅ ํฐ๊ฐ’์ด ๋งˆ๋‚˜ ์„œํด์ด ๋จ),๋งˆ๋‚˜(์Šคํฌ๋กค์„ ์ œ์ž‘ํ• ๋•Œ์— ํ•„์š”ํ•œ ๋งˆ๋‚˜์˜ ๊ฐ’์ด๋จ)


์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ”๊พธ๊ฒŒ๋˜์—ˆ์Œ ์ด๋Ÿฌ๋ฉด ๊ณ ๋ คํ•ด์•ผํ•˜๋Š”๊ฑด ํ‚ค์›Œ๋“œ์˜ ์„ฑํ–ฅ,๋งˆ๋‚˜,์œ„๋ ฅ ์ •๋„๋งŒ ์ƒ๊ฐํ•˜๋ฉด๋˜๋‹ˆ๊นŒ ํ›จ์‹  ๊ฐ„๊ฒฐํ•ด์ง„๊ฒƒ ๊ฐ™์Œย 


์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“ ๊ฑฐ


UI ํšจ๊ณผ

ui๋Š” ๊ทธ๋ƒฅ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งˆ์šฐ์Šคํด๋ฆญ์œผ๋กœ ์กฐ์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Œ ํด๋ฆญํ•˜๋ฉด ์œ„๋กœ ์˜ฌ๋ผ์˜ค๊ฒŒ ๋˜๊ณ  ๊ฐ–๋‹ค๋Œ€๋ฉด ์ปค์ง€๋Š” ํ˜•์‹์œผ๋กœ ๋งŒ๋“ค์—ˆ์Œ


๋งˆ๋ฒ• ์ œ์ž‘



์—๋Ÿฌ๋ฅผ ์žก์•„์ฃผ๊ฑฐ๋‚˜ ํŽธ์˜์„ฑ๋ถ€๋ถ„์€ ์•„์ง ๊ตฌํ˜„์„ ์•ˆํ•ด๊ฐ€์ง€๊ณ  ์•„๋ฌด๊ฑฐ๋‚˜ ์ž…๋ ฅํ•ด๋„ ๋งˆ๋ฒ•์„ ๋งŒ๋“ค์ˆ˜์žˆ๋Š” ์ˆ˜์ค€์ž„



๊ตฌํ˜„


ํ‚ค์›Œ๋“œ๋“ค์˜ ์ •๋ณด๋“ค์€ KeyWord๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ‚ค์›Œ๋“œ๋“ค์˜ ์ง‘ํ•ฉ์ธ keywordInfo๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œย KeywordSO ๋ผ๋Š” ScriptableObjectํ˜•์‹์œผ๋กœ ๋งŒ๋“ค์—ˆ์Œย 


์—ฌ๊ธฐ์„œ์ข€ ์• ๋จน์€๊ฒŒ ์žˆ๋Š”๋ฐ ํ‚ค์›Œ๋“œ๋“ค์˜ type๋“คํ•˜๊ณ  type๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•์‹์œผ๋กœ ์ €์žฅํ•˜๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•์‹์€ ์ง๋ ฌํ™”๊ฐ€ ์•ˆ๋˜์„œ ๊ณ ์ƒ์ข€ํ–ˆ์Œ ๊ฒฐ๊ตญ์—” ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜๋Š”๋ฐย ISerializationCallbackReceiver ๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์–ด์„œ ์ด๊ฑธ๋กœ ์ง๋ ฌํ™”๊ฐ€ ์•ˆ๋˜๋Š” ์ž๋ฃŒํ˜•๋“ค์„ ์ง๋ ฌํ™” ์‹œํ‚ฌ์ˆ˜์žˆ์—ˆ์Œย 

๋”•์…”๋„ˆ๋ฆฌ ์ง๋ ฌํ™”์— ๋Œ€ํ•ด์„œ ๊ตฌ๊ธ€๋งํ•ด๋ณด๋ฉดย 

์ง๋ ฌํ™”๊ฐ€ ๋˜๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ํ•ด๋ณด๋‹ˆ๊นŒ ๊ธธ์ด๋ฅผ ๋Š˜๋ฆฌ๋ ค๊ณ  ํ•˜๋‹ˆ๊นŒ key์˜ ๋ฆฌ์ŠคํŠธ์™€ value์˜ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ ๋‹ฌ๋ผ์„œ ์ž‘๋™์ด ์•ˆ๋˜์—ˆ์Œย 


https://gall.dcinside.com/m/game_dev/100004 (๊ทธ๋•Œ ๋‹น์‹œ ์ƒํ™ฉ)


๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•์˜ ๊ฒฝ์šฐ

public class SerializableDictionary<TKey, TValue> :Dictionary<TKey, TValue>, ISerializationCallbackReceiver
{
[SerializeField]
private TKey key;
[SerializeField]
private TValue value;
// save the dictionary to lists
public void OnBeforeSerialize()
{
foreach (var kvp in this)
{
key = kvp.Key;
value = kvp.Value;
}
}

์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌํ˜„์„ ํ• ๋•Œ์— ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ keyํ•˜๊ณ  value๋งŒ ๋ฐ›๊ณ ย ์‚ฌ์šฉํ• ๋•Œ SerializableDictionaryํ˜•์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฑธ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Œ


public class TypeAndCount : SerializableDictionary<Type, int> { }public List<TypeAndCount> typeAndCount = new List<TypeAndCount>();

์ด๋Ÿฐ์‹์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Œ


๊ทธํ›„์—” ๋‚˜๋จธ์ง€๋Š” ์‰ฌ์› ์Œ ์œ ์ €๊ฐ€ ์ž…๋ ฅํ•œ ํ…์ŠคํŠธ๋ฅผ ์ค„๋‹จ์œ„๋กœ ๋‚˜๋ˆˆ๋’ค์— ๊ทธ๊ฑธ ๋˜ ๋‹ค์‹œ <cast = 0,1,2,3.....> </cast = 0,1,2,3....> ์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ casts๋ผ๋Š” list์—๋‹ค๊ฐ€ ๋„ฃ์€๋’ค์— LInq์ด์šฉํ•ด์„œ ์ž…๋ ฅํ•œ ํ‚ค์›Œ๋“œ๋“ค์ค‘์— keywordinfo์— ์ •์˜๋œย ํ‚ค์›Œ๋“œ๋“ค๋งŒ ๊ฐ€์ ธ์™€์„œย ย ํ•ด๋‹น ํ‚ค์›Œ๋“œ๋“ค์˜ ํƒ€์ž…๋“ค์˜ ๊ณ„์ˆ˜๋งŒํผ ์ œ์ž‘๋  ๋งˆ๋ฒ•์˜ ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค์—ˆ์Œ

void CastOperation(List<string> Operation)
{
var keyword =
from keywordSo in keywordSo.KeywordInfo
from type in keywordSo.typeAndCount
join operation in Operation on keywordSo.name equals operation
select new { Name = keywordSo.name, Key = type.GetKey(),Value = type.GetValue()};

foreach (var VARIABLE in keyword)
{
int temp = newSpell.TypeCount[(int)VARIABLE.Key];
newSpell[(int)VARIABLE.Key] = temp + VARIABLE.Value;
}
}

์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ ์ธ๋ฑ์„œ ์‚ฌ์šฉํ•˜๋‹ˆ๊นŒ ๋„ˆ๋ฌด ๋ณ„๋กœ์ธ๊ฒƒ ๊ฐ™์•„์„œ ํ”„๋กœํผํ‹ฐ ์†์ข€๋ด์„œ ์ธ๋ฑ์„œ ์‚ฌ์šฉ์•ˆํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€์•ผํ• ๋“ฏ


๋งˆ๋ฌด๋ฆฌ

๋‹ค์Œ ๊ฐœ๋ฐœ์ผ์ง€์—์„œ๋Š” ๋งˆ๋ฒ•์ œ์ž‘ ์ปดํŒŒ์ผ๋Ÿฌ ์™„์„ฑ(์—๋Ÿฌ๊ตฌ๋ถ„, ์ œ์ž‘ํ•˜๊ณ  ์žˆ๋Š” ๋งˆ๋ฒ•์˜ ์ •๋ณด ์•Œ๋ ค์ฃผ๊ธฐ ๋“ฑ๋“ฑ... ํŽธ์˜์„ฑ๋ถ€๋ถ„)ํ•˜๊ณ  ์˜ฌ๋ฆฌ๊ฒ ์Œย ย 

์˜ฌํ•ด์•ˆ์— ์ถœ์‹œํ•˜๋Š”๊ฒŒ ๋ชฉํ‘œ์ด๊ธดํ•œ๋ฐ ๊ตฌํ˜„ํ• ๊ฒŒ ๋งŽ์•„์„œ ๊ฐ€๋Šฅํ•˜์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค ใ…‹ใ…‹...