์๋ ํ์ธ์, ๊ฒ์์ ์ฌ๋ํ๊ณ ๊ฐ๋ฐ์ ์ฌ๋ํ๋ ๊ฒ์ ํ๋ก๊ทธ๋๋จธ Developer G์ ๋๋ค.
์ ๋ ์ด๋ป๊ฒํ๋ฉด ๊น๋ํ๊ณ ์ฒด๊ณ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์์ง ํญ์ ๊ณ ๋ฏผํ๋๋ฐ์,
์ ๊ณ ๋ฏผ์ ๊ฒฐ๊ณผ๋ฌผ๋ค์ ์ฌ๋ฌ๋ถ๋ค์๊ฒ ์๋์์ด ๊ฐ๋ฅด์ณ๋๋ฆฌ๊ฒ ์ต๋๋ค!
Courses
Reviews
- [Unity Level Up!] Quest & Achievement System Developed Modularly
- [Unity Level Up!] Quest & Achievement System Developed Modularly
- [Unity Level Up!] Modularly Developing Skill System
- [Unity Level Up!] Modularly Developing Skill System
- [Unity Level Up!] Quest & Achievement System Developed Modularly
Posts
Q&A
๋์งํด์ ๋ชธ๋ฐ์ํ๋ฉด ํผ๊ฒฉ์๋ฅผ ๋ ๋ฆฌ๋ฉด์ ๋ฐ๋ฏธ์ง๋ฅผ ์ ํ๋ ์คํฌ์ ์ด ์์คํ ์์ ์ด๋ป๊ฒ ๋ง๋ค ์ ์์๊น์??
์๊ฐํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.๋์ง ๋ถ๋ถ ์ ์ฒด๋ฅผ SkillAction์ผ๋ก ๊ตฌํํด์ฃผ์๋ฉด ๋ฉ๋๋ค.DashAttackAction.csStart => ๋์ง ์์, owner.Movement.StartDash();Apply => Target๋ค์๊ฒ Skill์ ์ ์ฉํจ, target.SkillSystem.Apply(skill)Release => ๋์ง ์ข ๋ฃ, owner.Movement.StopDash();ApplyCycle๊ณผ ApplyCount๋ฅผ 0(๋ฌดํ)์ผ๋ก ์ฃผ๊ณ , SelectionAction์ Entity ์์ , SearchAction์ Entity ์ฃผ๋ณ์ผ๋ก ํ๋ฉด Entity๊ฐ ๋์งํ๋ฉฐ ์๊ธฐ ์ฃผ๋ณ ์ ์ ๋๋ฆฌ๊ฒ ์ฃ ? ๋๋ฆฐ ์ ์ ๋ ๋๋ฆฌ์ง ์๊ธฐ ์ํด์๋ ํ๋ฒ ๋๋ฆฐ ์ ์ Caching ํด๋๋ค๊ฐ ๊ฐ์ ์ ์ด Target์ผ๋ก ์กํ๋ฉด ๋ฌด์ํด์ผํ ๊ฒ๋๋ค.owner.StartDash์์ผ๋ก Entity์ ๋์ง์ ๊ตฌํ์ ํ์ง ์๊ณ DashAttackAction.cs ์์ฒด์ Coroutine์ด๋ Task๋ก Action ์์ฒด์ Entity๋ฅผ ๋์ง ๊ตฌํ์ ํ์๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.๊ฐ์ฌํฉ๋๋ค.
- 0
- 2
- 51
Q&A
์์ดํ ์์คํ ๊ฐ์
์๋ ํ์ธ์.ํ์ฌ ๊ฒ์ ์ถ์๊ฐ ๋ฆ์ด์ง๋ฉด์ ๊ฐ์ ์ถ์ ์๊ธฐ๋ ๊ฐ์ด ๋ฏธ๋ค์ก์ต๋๋ค. ํ์ฌ ๋ง๋ฌด๋ฆฌ ๋จ๊ณ์ ์์ผ๋ฉฐ ๋ค์ ๋ฌ ์ด์๋ ํ์คํ ๊ฐ์ ์ถ์๊ฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ธฐ๋ค๋ ค์ฃผ์๋๋ฐ ๋ฆ์ด์ง ์ ์ ๋ง ์ฃ์กํฉ๋๋ค.
- 0
- 2
- 58
Q&A
์คํฌ ๊ด๋ จ ์ง๋ฌธ์ ๋๋ค
์๊ฐํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.์คํฌ์ ๊ฐํํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง ์์ต๋๋ค.1. ๊ฐํ ๋ฒ์ ์ ์คํฌ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๊ณ ํ์ํ ๋ ํ์ฌ ์คํฌ์ ๊ฐํ๋ ์คํฌ๋ก ๊ต์ฒดํ์ผ๊ตฌ -> ๊ฐํยทํ์ผ๊ตฌ์๊ธฐํ์ ์๋ก๋ ํน์ ์คํฌ์ ํ๋ํ๋ฉด ํ์ผ๊ตฌ๋ฅผ ๊ฐํยทํ์ผ๊ตฌ๋ก ๊ต์ฒดํ๊ณ , ํน์ ์คํฌ์ด ์ฌ๋ผ์ง๋ฉด ๋ค์ ๊ธฐ๋ณธ ํ์ผ๊ตฌ๋ก ๊ต์ฒดํด์ฃผ๋ฉด ๋ ๊ฒ๋๋ค.2. Skill์ Effect๋ฅผ ์ค์๊ฐ ์ ๋ฐ์ดํธSkill์ Effect๋ฅผ ์ถ๊ฐํ ์ ์๊ฒ ์์ ํด์ฃผ์๊ณ , Effect์ ํจ๊ณผ๋ ์์ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด์ฃผ์๋ฉด ๋ฉ๋๋ค.// Skill์ ์๋ก์ด ํจ๊ณผ ์ถ๊ฐskill.AddEfffect(newEffect);// Skill์ ์๋ ํ์ ํจ๊ณผ๋ฅผ ๊ฐ์ ธ์ดvar targetEffect = skill.Effects.First(x => x.CodeName == "BURN");// ๊ฐ์ ธ์จ ํ์ ํจ๊ณผ์์ Action์ ๊ฐ์ ธ์ ์ ์ฉ Stack์ 2๋ก ์์ (targetEffect.Action as BurnAction).ApplyStack = 2;๊ฐ์ฌํฉ๋๋ค.
- 0
- 2
- 75
Q&A
Quest System์ ํ์ฅ์ฑ์ ๋ํ ์ง๋ฌธ
์๊ฐํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.-์ ํ ์๊ฐ ์์ ํด๋ฆฌ์ด ํ๋๊ฐ์ด๊ฑด ์๋์ ๊ฐ์ด ๋ฌด์ธ๊ฐ๋ฅผ ํด๋ฆฌ์ด์ ๊ทธ ์ ๋ณด๋ฅผ Target์ผ๋ก ๋ง๋ค์ด Report๋ฅผ ๋ณด๋ด๋ฉด ๋ฉ๋๋ค.// ClearInfostruct ClearInfo { int stageLevel, flaot clearTime }// QuesrSystemQuestSystem.Instance.ReceiveReport(CATEGORY_STAGE_CLEAR, clearInfo, 1);// TaskTarget.IsEqual// ์คํ ์ด์ง ํด๋ฆฌ์ด ์ ๋ณด๊ฐ ์กฐ๊ฑด์ ๋ง๋ค๋ฉด true๋ฅผ return.if (target is ClearInfo clearInfo)return clearInfo.level == targetStageLevel && clearInfo.clearTime elsereturn false; -ํน์ ์คํฌ์ ์ฌ์ฉํ์ง ์์๋๊ฐ, ํน์ ์์ดํ ์ ๋ณด์ ํ๊ณ ์๋ ์ํ๋ก ์๋ฃํ๋๊ฐTask์ชฝ์ Task ๋์๋ง๋ค ํธ์ถ๋๋ ๋ชจ๋์ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.// Task์ ๊ฐ ๋จ๊ณ์์ ์คํ๋ Module// TaskCustomAction.cspublic virtual OnStart(Task task) {} // Task์ Start ํจ์์์ ์คํpublic virtual OnEnd(Task task) {} // Task์ End ํจ์์์ ์คํ// Taskvoid Start(){...customAction.OnStart(this);}void End(){...customAction.OnEnd(this);}OnStart์์ ์บ๋ฆญํฐ๊ฐ ์ด๋ค ์คํฌ์ ์ฌ์ฉํ๋์ง ์ด๋ฒคํธ๋ก ๊ฐ์ํ๋ ๋ชจ๋์ ๋ง๋ค๊ณ ,ํน์ ์คํฌ์ ์ฌ์ฉํ๋ฉด Task๊ฐ ์คํจ๋๊ฒ ๋ง๋ค๋ฉด ๋๊ฒ ์ฃ .// SkillObservingAction : TaskCustomActionpublic override OnStart(Task task){// ํน์ ์คํฌ์ ์ฌ์ฉํ๋ฉด Task ์คํจtask.Owner.Owner.onSkillUsed += OnSkillUsed;}public overrride OnEnd(Task task){// Task๊ฐ ๋๋ฌ์ผ๋ ์ถ์ ์ข ๋ฃtask.Owner.Owner.onSkillUsed -= OnSkillUsed;}๋ณด์๋ ๊ฒ์ฒ๋ผ Task์ ์กฐ๊ฑด์ ๋ง๋๋๊ฑด ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์'QuestReport๋ก ๋ณด๋ผ Target Data๋ฅผ ๋ค๋ฌ์ ๊ฒ์ธ๊ฐ? ์๋๋ฉด Task์ Module์ ๋ง๋ค ๊ฒ์ธ๊ฐ?'Quest๋ฅผ ๋ง๋ค ๋ ํ๋จ์ด ํ์ํฉ๋๋ค.์์ธ๋ฌ Task์ Module ๊ฐ์ ๊ฒฝ์ฐ๋ ๋ง๋ค์ด๋ Module์ ์ฐจ๊ณก์ฐจ๊ณก ์ ์์๋๋ฉด ์ดํ์ ๋ค๋ฅธ ๊ฒ์์ ๊ฐ๋ฐํ ๋๋ ์ฌ์ฉํ ์ ์์ผ๋ ๊ฐ๋ฅํ๋ฉด ๋ด์ฉ์ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋์๋๊ฒ ์ข์ต๋๋ค.Module์ ๋ํ Reference๋ฅผ ์์ฑํด๋๋ค๋ฉด, ๊ธฐํ์๋ ๋์์ด๋๊ฐ ์ฐธ๊ณ ํด์ ๋ง๋ค์ด๋ Module๋ค์ ์ฌ์ฉํด ์ง์ Quest๋ฅผ ์ ์ํ๊ณ ํ ์คํธ ํด๋ณผ ์๋ ์์ ๊ฒ๋๋ค.๊ฐ์ฌํฉ๋๋ค.
- 0
- 1
- 56
Q&A
ํต์ผ๋ Stat์ ์ฌ์ฉํ์ง ์๊ณ ๋ชจ๋ํ ๋ฐฉ์์ผ๋ก Stats๋ฅผ ๋ง๋์ ์ด์ ๊ฐ ๊ถ๊ธํฉ๋๋ค.
์๊ฐํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.๋ฐฉ์์ ๊ดํด์๋ ๋ชจ๋ Entity๊ฐ ํต์ผ๋ Stat์ ๊ฐ์ ธ๋ ์๊ด์ ์์ต๋๋ค.๋ค๋ง, ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ํน์ Entity๋ง ๊ฐ์ง๊ณ ์๋ Stat์ด๋ Player๋ง ๊ฐ์ง๊ณ ์๋ Stat์ ๋ง๋ค ๋๋ ์กด์ฌํฉ๋๋ค. Player๋ง ์ฌ์ฉํ Stat์ ์ ์ญ, ์ ๋ฐฑ ์ข ์ ๋ชจ๋ Monster๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒ๋ ๋ญ๋น์ด๊ธฐ ๋๋ฌธ์ ๊ณต์ฉ์ผ๋ก ๋ชจ๋ ๊ฐ์ Stat์ ๊ฐ์ง๊ฒ ํ ์ง, Stat์ ๋ฐ๋ก ์ ๋ณํด์ ๋ฃ์ด์ค์ง ์ ํ์ง๋ฅผ ๋ง๋ค์ด์ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค. Stat์ด๋ผ๋๊ฒ ์ ์ ์ ์ ์ฅ์์ ํ, ์ง๋ฅ, ๋ฏผ์ฒฉ ์ด๋ฐ ๊ฒ๋ง ์์ ๊ฒ์ด๋ผ ์๊ฐํ๊ธฐ ์ฝ์ง๋ง, ์ค์ ๊ฐ๋ฐ์์๋ ํ๊ธ ๊ฒฐ์ ๋ ๊ด๊ณ , ๊ณ์ ์ ๋ํ ์ ๋ณด, ๊ฒ์ ๋ด์ Data ๋ฑ ๋ค์ํ ๊ฒ๋ค์ด Player์ ๋์ ๋ณด์ด์ง ์๋ Stat์ผ๋ก ๋ง๋ค์ด์ง๊ธฐ๋ ํฉ๋๋ค.์ ๊ฐ์ ๊ฒฝ์ฐ ๊ณต์ฉ์ผ๋ก ์ฌ์ฉํ Stat๋ค์ System์์ ์ค์ ํด๋๊ณ , Entity๊ฐ ๋ง๋ค์ด์ง ๋ ์๋์ผ๋ก Entity์ Stats์ ์ค์ ๋๊ฒ ๋ง๋ค์ด๋์๊ตฌ์, ๊ฑฐ๊ธฐ์ ๋ฐ๋ก Stat์ด ํ์ํ Entity์ ๊ฒฝ์ฐ ์ง์ ํ์ํ Stat์ ์ถ๊ฐํด์ฃผ๋ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.๊ฐ์ฌํฉ๋๋ค.
- 0
- 1
- 80
Q&A
Effect์ ๊ธฐ๋ฅ ํ์ฅ์ ๋ํด์ ์ง๋ฌธ์ด ์์ต๋๋ค.
์๊ฐํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.Effect๋ฅผ ๋ค์ํ ์ํฉ์ ์ ์ฉ์ํค๊ธฐ ์ํด์๋ EffectAction์ Callback ํจ์๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ ๋ค์ํ event๋ค์ ์ด์ดํ ๋ง๋ค๊ณ , ๋์ ๋ฐ๋ผ์๋ ํน์ Damage ์ ํ์ Stat์ผ๋ก ๋ง๋๋ ๋ฑ ์ ์ ํ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํด์ผํฉ๋๋ค.์๋ฅผ ๋ค์ด, ์ฃฝ์ผ๋ฉด ์ฆ์ ๋ถํํ๋ ํจ๊ณผ๋ผ๊ณ ๊ฐ์ ํ๋ฉด ์๋์ ๊ฐ์ด EffectAction์ ๋ง๋ค ์ ์์๊ฒ๋๋ค. EffectAction.cs public override Start(Effect effect) { effect.Owner.Owner.onTakeDamage += OnTakeDamage; } public override bool Apply(Effect effect) { // event๋ฅผ ํตํด ํจ๊ณผ๋ฅผ ์ ์ฉํ๋ค๋ฉด, ์ํ๋ฅผ ๋ฆฌ์ ํ๊ณ true๋ฅผ return if (isApplied) { isApplied = false; return true; } return isApplied; } public override Release(Effect effect) { effect.Owner.Owner.onTakeDamage -= OnTakeDamage; } public void OnTakeDamage(Entity target, float damage); { // ๋์์ด ์ด๋ฒ์ Damage๋ฅผ ๋ฐ๊ณ ์ฃฝ์๋ค๋ฉด HP๊ฐ 1์ธ ์ํ๋ก ๋ถํ์ํด if (target.IsDead) { target.HPStat.Value = 1f; isApplied = true; } }Effect๊ฐ ์คํ๋ ๋ Owner Entity์ onTakeDamage Event์ Callback ํจ์๋ฅผ ์ฐ๊ฒฐํด๋๊ณ , Entity๊ฐ ์ฃฝ์ผ๋ฉด ํจ๊ณผ๊ฐ ๋ฐ๋ํ๋ ํ์์ ๋๋ค.ํน์ ์ข ์กฑ์๊ฒ ๊ฐํ๋ ํผํด ์ฆ๊ฐ๋ ์ข ์กฑ ํผํด ๋ฐฐ์จ์ Stat์ผ๋ก ๋ง๋ค ์ ์์๊ฒ๋๋ค.์๋ฅผ ๋ค์ด, Elf ์ข ์กฑ์ ๋ํ Damage ์ฆ๊ฐ๋ฅผ ๋ด๋นํ๋ INCREASED_DAMAGE_TO_ELF Stat์ ๋ง๋ค๊ณ , Effect๋ Stat์ ์์น๋ฅผ ์ฆ๊ฐ์ํค๋ฉด ๋ฉ๋๋ค. EffectAction.cs public override Start(Effect effect) { } public override bool Apply(Effect effect) { effect.Owner.Owner.Stats.SetBonusValue("STAT_INCREASED_DAMAGE_TO_ELF", this, 0.2f); } public override Release(Effect effect) { effect.Owner.Owner.Stats.RemoveBonusValue("STAT_INCREASED_DAMAGE_TO_ELF", this); }// Entity.cs public void GiveDamage(Entity target) { float damage = Stats.GetValue("DAMAGE"); if (target.Race == Race.Elf) damage *= Stats.GetValue(STAT_INCREASED_DAMAGE_TO_ELF); target.TakeDamage(damage) }์๋ ์์๋ผ์ if๋ฌธ์ผ๋ก ํ๋ ์ฝ๋ฉํ์ง๋ง, ์ ๋๋ก ๋ง๋ค ๋๋ Entity๊ฐ ์ ๋๋ก๋ ์ข ์กฑ ๊ฐ์ ๊ฐ์ง๋๋ก ํ์ฅ์ ํด์ผ๊ฒ ์ฃ .Damage ๊ฐ์ ๊ฐ์๊ฑด Damage๋ฅผ ๊ณ์ฐํ ๋ ์ฌ์ฉํ Action Callback๋ค์ ๋ฐ์์Invocation์ ํตํด์ ์ฐ๊ฒฐ๋ Action๋ค์ ์ํํ๋ฉด์ ์ต์ข ๊ฐ์ ๊ตฌํ ์ ์์ต๋๋ค EffectAction.cs public override Start(Effect effect) { effect.Owner.Owner.CalcDamage += CalcDamage; } public override bool Apply(Effect effect) { // event๋ฅผ ํตํด ํจ๊ณผ๋ฅผ ์ ์ฉํ๋ค๋ฉด, ์ํ๋ฅผ ๋ฆฌ์ ํ๊ณ true๋ฅผ return if (isApplied) { isApplied = false; return true; } return isApplied; } public override Release(Effect effect) { effect.Owner.Owner.CalcDamage -= CalcDamage; } private float CalcDamage(Entity instigator, DamageType damageType, float damage) { // ๊ณต๊ฒฉํ ์ ์ Damage Type์ด ํ์์ฑ์ด๋ฉด Damage๋ฅผ ๋ฌด๋ฌํ์ํด. if (damage > 0f && damageType == DamageType.Fire) { isApplied = true; return 0f; } // ์ ์ Damage Type์ด ํ์์ฑ์ด ์๋๋ผ๋ฉด Effect๊ฐ ์๋ํ์ง์์ else return damage; }// TakeDamage ํจ์ ์ // ์ฐ๊ฒฐ๋ Callback ํจ์๋ค์ ์ํํ๋ฉฐ ์ต์ข Damage ๊ณ์ฐ์ ํจ. // ์ Effect๊ฐ ๋ฐ๋ํ ๊ฒฝ์ฐ ์ต์ข Damage๋ 0์ด ๋จ. foreach (var calc in CalcDamage.GetInvocationList().Cast()) damage = calc.Invoke(this, damageType, damage);๋ณด์๋ฏ ๋ณต์กํ ์ฒด๊ณ๋ฅผ ๊ฐ์ง ์ ํฌ ์์คํ ์ ๋ณตํฉ์ ์ธ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๊ตฌํํ์ฌ์ผํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ํ๋ก๊ทธ๋๋ฐ์ ์ญ๋์ ๋์ด์ฌ๋ฆด ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋์ RPG ๊ฒ์ ๊ฐ๋ฐ์ด ์ด๋ ต๋ค๊ณ ๋ง์ด๋ค ์๊ธฐํ๋ ๊ฒ์ ๋๋ค.๊ฐ์ฌํฉ๋๋ค.
- 0
- 2
- 92
Q&A
๊ณต๋ถ ๋ฐฉํฅ์ ๋ํด ๊ถ๊ธํ ์ ์ด ์์ต๋๋ค.
์๊ฐํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.์๊ฐ์ ๋ถ๊ป์๋ ์์ง ํ์ตํ์๋ ์ ์ฅ์ด๋ ํ์ธ์ ์ง์์ ๋ฐ์๋ค์ฌ์ผํ๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ์ตํ๊ธฐ ์ด๋ ค์ด๊ฑด ๋น์ฐํ ๊ฒ๋๋ค.ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๋๊ฒ ํญ์ ๊ตฌ์กฐ์ ์ผ๋ก ์๋ก์ด ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ฒ์ด ์๋๋๋ค. ๋ด๊ฐ ๊ณต๋ถํ๊ณ ๊นจ๋ฌ์ ๊ฒ๋ค์ ํ ๋๋ก ์์ ๋ง์ ์ฝ๋ฉ ์คํ์ผ์ด ๋ง๋ค์ด์ง๋ฉด, ๊ทธ๋๋ถํฐ๋ ์ฌ๋ฌ ๊ฒ์์ ๋ง๋ค์ด๋ ๊ตฌ์กฐ๋ ๋น์ทํด์ง๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ฌ ๊ฐ์ ๊ตฌ์กฐ๋ QuestSystem - Quest - Task Group - Task์ธ๋ฐ, ์ ๋ค๋ฅธ ๊ฐ์์ธ SkillSystem ๊ฐ์์ ๊ฒฝ์ฐ์๋ SkillSystem - Skill - Effect Group - Effect ์ด๋ฐ ์์ผ๋ก ๋ง๋ค์ด์ง๋๋ค. ์ ๋ ์ด๋ฏธ ์ ๋ ์ ์ด๋ ๊ฒ ํ๋ก๊ทธ๋๋ฐ ํด์๊ธฐ์ ๋ณ ์๊ฐ์ ์ํด๋ ์์ฐ์ค๋ฝ๊ฒ ์ด๋ ๊ฒ ํ๋ก๊ทธ๋๋ฐํ๊ฒ ๋๊ณ , ์ฝ๋๋ฅผ ์๋ฏ์ด๋ด๋ ๋ด๊ฐ ์ ์์คํ ์ ์ด๋ค ๊ตฌ์กฐ๋ก ๋ง๋ค์๊ณ , ์ด๋ค ํจ์๋ค์ด ์์์ง ์์์ด ๋ฉ๋๋ค.๊ทธ๋ฆฌ๊ณ ์ฌ์ค ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ๋ณดํต์ ์๋ฐฑ ๊ฐ์ Class, ๋ง๊ฒ๋ ์ ์ฒ ๊ฐ์ Class ๋ง๋๋๋ฐ ๊ฐ๋ฐ ๊ธฐ๊ฐ์ด ๊ธธ์ด์ง๋ค๋ณด๋ฉด ์ ๋ ๋ํ ์ผํ ๋ถ๋ถ์ ๊น๋จน๊ธด ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Inventory์ ์ด๋ค ๊ธฐ๋ฅ์ด ํ์ํด์ ๋ง๋ค๋ ค๊ณ ํ๋๋ ์ด๋ฏธ ์ ์ ๋ง๋ค์ด๋จ๋ค๊ฑฐ๋, ํจ์๋ฅผ ๋ง๋ ์ง ์ค๋ ๋์ ์ธ๋ถ ๊ธฐ๋ฅ์ ๊น๋นกํ๊ณ ์ค์ํ๋ค๊ฑฐ๋ ์ฌ๋์ธ ์ด์ ๊น๋จน๊ณ ์ค์ํ๊ธฐ ๋ง๋ จ์ด์ฃ . ์์งํ ๋ง์๋๋ฆฌ๋ฉด ๊ฐ๋ฐ ์์ฃผ ์ด๊ธฐ์ ์์ฑํ ์ฝ๋๋ฅผ ๋ค์ ๋ณด๊ณ ์ ๊ฐ ์ ์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์งฐ๋์ง ์๋ฆฌ์กํ ๋๋ ๊ฐ๋ ์์ต๋๋ค. ์ฝ๋๋ฅผ ๊ฑด๋๋ ค๋ณด๊ณ ์ ๊ทธ๋ ๊ฒ ๋ง๋ค์๋์ง ๋ค์ ๊นจ๋ซ๊ฒ ๋์ฃ . ์ฌ๋ ํ๋ ์ผ์ ๋ค ๋๊ฐ๊ณ , ํ์ ์ ๊ณ์ ๋ถ๋ค, ๊ฐ์๋ฅผ ๋ง๋์๋ ๋ถ๋ค ๋ชจ๋ ์๊ฐ์ ๋ถ๋ณด๋ค ๊ณต๋ถํ ๊ธฐ๊ฐ ๊ธธ๊ณ , ๊ฒฝ๋ ฅ์ด ์์ผ๋ ๋ ์ํ ๋ฟ, ์๊ฐ์ ๋ถ๋ณด๋ค ์ธ๊ฐ์ ์ผ๋ก ๋ฐ์ด๋์ ์ผ์ ํด๋ด๊ณ ์๋๊ฒ ์๋๋ ๊ฑฑ์ ํ์ง ์์ผ์ ๋ ๋ฉ๋๋ค. ์ ๋ฅผ ํฌํจํ ๋ค๋ฅธ ๋ถ๋ค๋ ๋ชจ๋ ์๊ฐ์ ๋ถ ๊ฐ์ด ์๊ฐํ๋ ์๊ธฐ๊ฐ ์์์ต๋๋ค. ์ค์ค๋ก ๊ณต๋ถํ๊ณ ๊ณ์ ๊ฒ ์์ฒด๋ก ์ณ์ ๊ธธ์ ๊ฑท๊ณ ๊ณ์๋ค๊ณ ๊ฐํ ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค.๊ฐ์ฌํฉ๋๋ค.
- 0
- 2
- 94
Q&A
SkillData ๊ตฌ์กฐ์ฒด ์ง๋ฌธ
์๊ฐํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.๊ธฐ๋ณธ์ ์ธ ์ด์ ๋ ๊ฐ์ฒด ์ธ๋ถ์์ Data๋ฅผ ํจ๋ถ๋ก ์์ ํ์ง ๋ชปํ๊ฒ ํ๊ธฐ ์ํจ์ด๊ตฌ์, ๋ถ๊ฐ์ ์ผ๋ก Data ๊ฐ์ฒด๋ค์ ์ด๋ฆ ๊ทธ๋๋ก ๋ณ ๋ค๋ฅธ ๋์ ์์ด ๋ด๋ถ์์๋ง ์ ์ด๋ Data์ ๋ฌถ์์ผ ๋ฟ์ด๊ณ , ์ด๋ฐ Data ๊ฐ์ฒด๋ค์ struct๋ฅผ ์ฌ์ฉํ๋๊ฒ ๊ถ์ฅ๋์ ๊ทธ๋ ์ต๋๋ค.๋ค๋ง, ์ด๋ ์ Coding Style์ผ ๋ฟ ์ ๋์ ์ธ๊ฒ ์๋๊ธฐ ๋๋ฌธ์, ํ๋จ ํ์ class๊ฐ ๋ซ๋ค๊ณ ์๊ฐ์ด ๋์ ๋ค๋ฉด ๋น์ฐํ class ๊ฐ์ฒด๋ก ๋ฐ๊พธ์ ๋ ์๊ด ์์ต๋๋ค.๊ฐ์ฌํฉ๋๋ค.
- 0
- 1
- 83
Q&A
์คํฌํธ๋ฆฌ ์ ์ฅ ์ง๋ฌธ์ ๋๋ค
์๊ฐํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ Entity๋ฅผ DontDestroyObject๋ก ๋ง๋ค์ด์ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ญ ๊ฐ์ ธ๊ฐ๋ ๊ฒ์ ๋๋ค.Entity๋ฅผ ์ฌ์ค์ ํ๋ ๊ฒ์ด ๋ฒ๊ฑฐ๋ก์ธ ๋ ๋ง์ด ์ฐ๋ ๋ฐฉ์์ ๋๋ค.๋๋ฒ์งธ ๋ฐฉ๋ฒ์ Skill Tree๋ ํ์ฌ SkillSystem์ ๋ฑ๋ก๋ Skill๋ค์ ํตํด ์๋์ผ๋ก ๋ณต์๋๋ฏ๋ก ๊ฒฐ๊ตญ SkillSystem์ Save, Load ํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.SkillSystem์ ์ ์ฅํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ json์ ์ด์ฉํ๋ ๊ฒ์ ๋๋ค.1. ํ์ฌ ๋ฑ๋ก๋ Skill๋ค์ ID, Level์ Json ํํ๋ก ๋ง๋ค์ด์ PlayerPrefs๋ ES3 ๊ฐ์ Save Asset์ ํตํด ์ ์ฅ.2. ์ ์ฅ๋ Data๊ฐ ์์ ๋ ๊ธฐ์ด Setup ๋์ Load๋ฅผ ์งํ. Resources.Load๋ก Skill Database๋ฅผ ๋ถ๋ฌ์ ์ ์ฅํ๋ Skill๋ค์ id๋ก Skill๋ค์ ์ฐพ์์ค๊ณ , Skill๋ค์ SkillSystem์ ๋ฑ๋กํ ๋ค, ๋ฑ๋ก๋ Skill๋ค์ Level์ ์ ์ฅํ๋ Level๋ก ์ค์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.Save๋ ๊ฐ๋ตํ ๋ค์๊ณผ ๊ฐ์ ํ์์ผ๋ก ๋ง๋ค ์ ์์๊ฑฐ๊ตฌ์,var root = new JObect();var array = new JArray();foreach (var skill in ownedSkills){// skill์ ์ ๋ณด๋ฅผ Json ํํ๋ก ๋ง๋ค์ด Json ๋ฐฐ์ด์ ๊ธฐ๋กvar skillData = new JObject();skillData["id"] = skill.ID;skillData["level"] = skill.Level;array.Add(skillData);}root["skills"] = array;PlayerPrefs.SetString("playerSkills", root.ToString());Load๋ ๊ฐ๋ตํ ๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค ์ ์์๊ฒ๋๋ค.string savedData = PlayerPrefs.GetString("playerSkills", null);if (savedData == null)// ๊ธฐ์ด Setupelsevar root = JObject.Parse(savedData);var array = root["skills"].Value();var database = Resources.Load(path);foreach (JToken token in array){// ์ ์ฅํ๋ Json Data๋ฅผ ํตํด Database์์ Skill์ ์ฐพ๊ณ , SkillSystem์ ๋ฑ๋กํ ๋ค Level์ ๋ณต์.var skillData = token.Value();var id = skillData["id"].Value();var level = skillData["level"].Value();var skill = database.datas.Select(x => x.ID == id);var registeredSkill = Register(skill);registeredSkill.Level = level;}๋ง์ฝ Data๋ฅผ ์ ์ฅํ ํ์๊น์ง๋ ์๋ค๋ฉด, ๊ผญ Json์ ์์จ๋ Skill๋ค์ ID์ Level์ ๋ณ์๋ก ์ด๋๊ฐ์ ๊ธฐ๋กํด๋๊ณ ๋ณต์ํด์ฃผ๊ธฐ๋งํ๋ฉด ๋ฉ๋๋ค.๋ ์ค ํธํ ๋ฐฉ์์ ๊ณจ๋ผ ์ฌ์ฉํ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.(P.S: ์ค๋๋์ ์ ๋ ์์๋๋ฐ ์ฐธ๊ณ ํ์ค๋งํ ๋น์ทํ ์ง๋ฌธ์ด ์์๋ค์. https://inf.run/4XAay)๊ฐ์ฌํฉ๋๋ค.
- 0
- 2
- 95
Q&A
BT์ FSM์ ํ์ฉํด ๋ชฌ์คํฐ AI ๊ตฌํ
์๊ฐํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ํ์ ๋๋ก๊ฐ ๋ง์ต๋๋ค.๋ชจ๋ ์ธ๋ถ ๋์์ FSM์ผ๋ก ๊ตฌํํ ํ์๋ ์๊ตฌ์, FSM์ Skill์ฒ๋ผ ๋์์ด ์์ฐจ์ ์ผ๋ก ์งํ๋๋ Sequence๋ฅผ ์ด๋ฃฐ ๋ ํ์ฉํ๋ฉด ์ข์ต๋๋ค.์ ์ฒด ๋ก์ง๊ณผ ๋จ๋ฐ์ ๋์๋ค์ BT์ Node๊ฐ ์ ์ดํ๋, ์ํ์ ๋ํ ์ ์ด์ Sequence์ ๋ํ ์ ์ด๋ FSM์ ๋งก๊ธฐ๋๊ฒ ์ข์ต๋๋ค.BTโ ์กฐ๊ฑด (๋ฒ์ ์์ ์ ์ด ์๋?) โ ์กฐ๊ฑด (Entity๊ฐ Idle ์ํ์ธ๊ฐ?) โ Skill ์ฌ์ฉ (SkillSystem.Use)โโโโโโโโโโโโโ Patrol (๋จ๋ฐ์ ๋์)โโโโโ ์คํฌ ์ฌ์ฉ ์๋ฃ๊น์ง ๋๊ธฐ๊ฐ์ฌํฉ๋๋ค.
- 0
- 2
- 180