public class BuffSO : ScriptableObject
{ public float duration; public float tick; public int id; public bool isOverlapable; public Sprite icon; public Health target; public Coroutine cor; public virtual void ActiveBuff() { } public virtual void EndBuff() { } } public struct Buff { public BuffSO buff; float Ticker; WaitForSeconds tick; public GameObject coolUI; public void SetBuff(BuffSO buff, Health target) { this.buff = buff; buff.target = target; tick = new WaitForSeconds(buff.tick); Ticker = 0; } public IEnumerator ActiveBuff() { while(buff.duration > Ticker) { buff.ActiveBuff(); yield return tick; Ticker += buff.tick; } EndBuff();//์ด๊ฑด ์๋จ } public void EndBuff() { buff.target.RemoveBuff(this); } } -------------------------------------------------------------------------------------------- public List<Buff> buffList; public virtual void AddBuff(BuffSO buff) { Buff selectedBuff = buffList.Find(so => so.buff.id == buff.id); if(selectedBuff.buff != null &&!selectedBuff.buff.isOverlapable) { selectedBuff.EndBuff();//์ด๊ฑด ๋จ } selectedBuff = new Buff(); selectedBuff.SetBuff(buff, this); if (_character.CharacterType == Character.CharacterTypes.Player) { selectedBuff.coolUI = GUIManager.Instance.SetBuffUI(selectedBuff); } buffList.Add(selectedBuff); selectedBuff.buff.cor = StartCoroutine(selectedBuff.ActiveBuff()); } public virtual void RemoveBuff(Buff buff) { unsafe { TypedReference tr2 = __makeref(buff); IntPtr ptr1 = **(IntPtr**)(&tr2); Debug.Log(ptr1); } StopCoroutine(buff.buff.cor); buffList.Remove(buff); Destroy(buff.coolUI);ย }
addbuff ์์์ ํธ์ถํ removeBuff๋๋ฆฌ์คํธ์์ย ์ง์์ง๊ณ Buff๊ตฌ์กฐ์ฒด ์์์ ํธ์ถํ removeBuff๋ ์์ง์์ง. ๋ฉ์๋๋ ํธ์ถ ๋๋๊ฑฐ ๋ดค๊ณ ์ฃผ์๊ฐ ๊ฐ์๊ฑฐ๋ ํ์ธ ํ๋๋ฐ ์ ์์ง์์ง์ง..
์ ๋ด ๋ฒํ๋ ์์คํ ์ด๋ ๋ฉ์๋ ๋ณ์๋ช ๊ฑฐ์ ๋น์ทํ๋ค ใทใท;
ใทใท;
๋๋ ๋ฒํ ๊ตฌ์กฐ์ฒด์ isEnd ๋ง๋ค์ด์ ๊ฐ์ฒด ์ฑ์ฑ์ true๋ก ํ๊ณ , ๋๋๋ฉด ์ฝ๋ฃจํด ๋ด์์ false ๋ฐํํ ๋ค, EndSearcher๋ผ๋ ์น๊ตฌ ๋ง๋ค์ด์ ๋ฆฌ์คํธ ์ํํ๋ฉฐ false๊ฐ ์๋ค๋ฉด, ๋ฆฌ์คํธ์์ ์ ๊ฑฐํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์ด.
ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ์๋์ผ ใ
์ด์งํผ ๋ฒํ/๋๋ฒํ ์กฐ๊ฑด์ ๋ฐ๋ผ ์์ด์ง๊ฒ ๋ง๋ค๊ณ ์ถ์ด์ ์ ๋ฐ์ดํธ ์ฐ๋ ค ํ๋๋ฐ ๊ทธ๋ฅ ์ ๋ฐ์ดํธ๋ก ํด๊ฒฐ ๋ด์ผํ๋.. ๊ทผ๋ฐ ์ ๊ฒ ์ ์๋๋์ง ๋๋ฌด ๊ถ๊ธํด์
์๋ง callbyref callbyval ๋ฌธ์ ์ผ ๊ฒ ๊ฐ๊ธดํ๋ฐ, ๊ตฌ์กฐ์ฒด ๋ด์์๋ ์ ์ ํ๋ ์๋๋ฉด ์ ๊ทผ ํ๋ฝ์ ์ ํ๋ ๊ฑธ๋ก ์์. static์ผ๋ก bufflist ๊ด๋ฆฌํ๋ฉด ์ ๋ ๊ฒ ๊ฐ๊ธดํ๋ฐ..
์ ๊ทธ๋ผ ์ ์ด์ ๊ตฌ์กฐ์ฒด๋ก ๋ง๋ค๋ฉด ์๋๋๊ฑด๊ฐ.. ์๋ฐ๋ง ํ๋ค ์์ ๊ทธ๋ฐ์ง ๊ตฌ์กฐ์ฒด ๊ฐ๋ ์ด ์์ง ์ต์ํ์ง๊ฐ ์๋ค..
์ฝ๋๋ฅผ ๋ค ๋ณด์ฌ์ค์ผ์ง BuffSO๋ ๊ตฌ์กฐ์ฒด์ธ์ง ๋ญ์ง BuffSO ์์ target ํ๋๊ฐ ๋ญ๊ฐ๋ฅดํค๋๊ฑด์ง; buffList๋ ๋ญํ์ ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ๊ณ
์ ๋ง๋ค
๊ทธ๋ฆฌ๊ณ ๊ตฌ์กฐ์ฒด๋ฅผ ๋๊ฒจ๋๊ณ ์ฃผ์๊ฐ ๋๊ฐ๋ค๋๊ฑด ๋ญ์๋ฆฐ์ง;; ๊ตฌ์กฐ์ฒด๋ฅผ this๋ก ๋๊ฒผ๋๋ฐ ์ด๋ป๊ฒ ์ฃผ์๊ฐ์ด ๋๊ฐ๋ค๋ผ๋๊ฑด์ง๋ ์ดํด๊ฐ์๋๋ค
buffList์์ buff ๊ตฌ์กฐ์ฒด๊ฐ ์์ง์์ง๋ค๋๊ฑด์ง ๋ญ์ง; ๋ญ๊ฐ ์๋๋์ง๋ฅผ ์ข ์ ํํ๊ฒ ์ค๋ช ํด์ผ์ง
์ผ๋จ BuffSO๋ bufflist์ฌ๋ฆผ ์ฃผ์๊ฐ์ buff๊ตฌ์กฐ์ฒด์์ ์ฃผ์๊ฐ์ ์ถ๋ ฅํด๋ณด๊ณ remove๋ฅผ ํธ์ถํ ๋๋ ์ฃผ์๊ฐ์ ์ถ๋ ฅํด๋ณด๋๊น ๊ฐ์๋ค๋ ์๊ธฐ
bufflist์์ buff ๊ตฌ์กฐ์ฒด๊ฐ ์์ง์์ง๋๊ฑฐ ๋ง์
๋ฐ์ ์๋ addbuff๋ removebuff๋ health ํด๋์ค์ ์์
์ฝ๋๋ฅผ ๋ค ์งค๋ผ๋์ผ๋ฉด ๋ญ ์ด๋ป๊ฒ ๋ณด๋ผ๋๊ฑฐ์ผ ใ ใ RemoveBuff๋ ์ด๋ ํด๋์ค ๊ตฌ์กฐ์ฒด ๋ฉ์๋์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ๊ณ ๋๋์ฒด ์ด๋ค์๋ผ๊ฐ ๊ตฌ์กฐ์ฒด ์ฃผ์๋ฅผ __makeref๋ก ํ์ธํ๋ผ๊ณ ํ๋์ง๋ ๋ชจ๋ฅด๊ฒ ๊ณ ใ ใ
C# ์ฃผ์๊ฐ ์ถ๋ ฅํ๋๊ฑฐ ๊ตฌ๊ธ์ ์ฐพ์๋ณด๋๊น ๊ทธ๋ ๊ฒ ํ๋ผ๊ธธ๋ ๊ทธ๋ ๊ฒ ํ๊ฑฐ๊ณ ์ฝ๋๊ฐ ์ข ๊ธธ์ด์ ธ์ ํ๋ฒ์ ์ฌ๋ฆฌ๊ธฐ๋ณด๋จ ์๋ผ์ ์ฌ๋ฆฌ๋ ค๋ค ์ง๋ฌธ์ ์ง์ด ๋จ์ด์ง๊ฑด ๋ง๊ธดํ๋ค
๊ทธ๋ ๋ด๋ถํด ์ข ์ฌ๋ฆด๊ฑฐ๋ฉด ๋ค ์ฌ๋ฆฌ๋๊ฐ ํด๋ผ ์ผ๋จ ์ ์ฝ๋์์ ์ ์๋๋์ง ๋ต๋ง ์๋ ค์ค ์์ง์์ง๋ ์ด์ ๋ Ticker ํ๋๋๋ฌธ์
ใ ใ ใ ใ ๋ค์๋ถํด ์ ์ฌ๋ ค๋ด
์ง์ง Ticker๋๋ฌธ์ธ์ง ๊ถ๊ธํ๋ฉด selectedBuff.EndBuff();//์ด๊ฑด ๋จ ์ฌ๊ธฐ ์์๋ค๊ฐ selectedBuff.Ticker += 1; ํ์ค ๋ฃ๊ณ ๋๋ ค๋ด ๋ฐ์๋ ์์ง์์ง๊ฑฐ์ผ
์ ์ง์ง๋ค ์ด๋ฐ ๊ฐ๋ ์ ๋จ์ํ ๊ตฌ์กฐ์ฒด์ค๋ช ์ ๋ด์๋ ๋ชจ๋ฅด๊ฒ ๋๋ฐ
์์ใ ์ดํดํ๋ค TIcker๊ฐ ๋ฐ๋๋ฉด์ ์๋ ๋ฆฌ์คํธ์ ์๋๊ฑฐ๋ ๋ค๋ฅธ ์กด์ฌ๊ฐ ๋๊ฑด๊ฐ?
๋ญ ์ด๋ป๊ฒ ์ง์ผ ์ข๋ค๋ผ๋๊ฐ ๊ผฐ๋์ง ํ ์๊ฐ์ ์๊ณ ์ ๋ต ์๋ ค์คฌ์ผ๋ ์ด์ ์์์ ํด ์๊ณ ~
๊ทธ๊ฑด ๋น์ฐํ์ง.. ์๋์ ๊ฐ์ฌ