해당 클래스 다른 자잘한 내용들 다 빼고 딱 질문과 관련된 부분만 옮겨서 적을게요.
public class SkillObject : MonoBehaviour
{
// 이 오브젝트와 부딪힌 오브젝트들 저장 (사이클마다 검사)
private HashSet<Monster> collidingObjects = new HashSet<Monster>();
private bool isApplicable => (currentApplyCount < applyCount)
&& (currentApplyCycle >= applyCycle);
private void Update()
{
if (isApplicable)
Apply(); -----------> Update에서 시간지날때마다 Apply를 시도
}
private void Apply()
{
foreach (Monster monster in collidingObjects)
{
monster.EffectSystem.Apply(skill); -----------> 현재 해시셋 순회하면서 하나하나 Apply 해주기
}
}
private void OnTriggerEnter(Collider other)
{
Monster monster = other.GetComponent<Monster>();
if (monster != null)
collidingObjects.Add(monster);
}
private void OnTriggerExit(Collider other)
{
Monster monster = other.GetComponent<Monster>();
if (monster != null)
collidingObjects.Remove(monster);
}
}
걍 트라이 캐치하면 되는거 아닌가? 루프 도는 중에도 해시셋 수정이 발생하는게 에반데
루프 도중에 안생기게 하려면 스킬의 사이클 n초마다 그 지역의 몬스터를 탐색한다거나 충돌체를 그때마다 생성한다던가 뭐 그런식이여야하는데 이게 더 비효율적이지 않나 싶어서요... 초보라서 아직 잘모르는데 일단 지금 제가 생각한건 그냥 충돌체 고정적으로 그자리에 생성해서 냅두고 n초마다 그 맞은 대상들 싹 순회하는 방식 선택한거거든요
저라도 그렇게 할듯?? 이벤트 외엔 안 떠오르능
왜 스킬오브젝트란 클래스가 업데이트? ㄷㄷ?쪽에서 몬스터를 쭉탐색해서 apply함수를 호출하는거야? 이유가 시간차 두고 효과를 주는거라면 ontriggerenter에서 그냥 참조한 몬스터에게 함수를 발동시키는 식으로 하면되잖아.액션클래스로 스킬오브젝트에 함수구현해서 전달하는 식의 방법도 가능하고, 아니면 몬스터쪽 클래스에서 스크립트 수정은 있어야하겠지만.
선생님, 'ontriggerenter에서 그냥 참조한 몬스터에게 함수를 발동시키는 식'이라는게 잘 이해가 안갑니다ㅠ 플레이어가 스킬쓰면 저 스킬오브젝트라는걸 스폰하는건데 스폰된 그 스킬오브젝트랑 부딪힌 몬스터들에게 그 스킬의 고유 어플라이 사이클마다 적용시키려는 거거든요. 그래서 전 걍 스킬옵젝에 콜라이더 넣고 부딪힌 애들 한꺼번에 n초마다 순회하면서 어플라이 돌리려했던건데.. 더 좋은방법 말씀해주신게 이해가 안가요
그러면 참조한 몬스터가 함수가 발동되기 전에 죽거나, 죽고나서 바로 다른 곳에 스폰되면요?
님이 충돌할 때 이미 Monster monster = other.GetComponent(); 충돌한 놈 정보를 가져왔잖아요? 그럼 monster.점찍으면 멤버 함수로 접근이 가능하다는 말씀을 드린겁니다. 그 함수에 Action 클래스로 함수를 전달할 수도 있고요.
보통 죽인다는게 실제 destroy함수를 쓴다는 건지 오브젝트 풀링을 하는지 구현마다 다른데 저는 일단 풀링하는 시긍로 말씀드리면 이미 처음에 오브젝트 생성된 후 액티브를 꺼놓으면서 초기화 설정을 해줍니다. 죽으면 비활성화 다시 살아날땐 스크립트에 void Awake랑 void Start함수로 간단히 초기화 처리가능합니다.
그러니깐 충돌한 몬스터를 다같이 저 스킬옵젝에서 관리하지말고 그냥 충돌한 몬스터 각자에게 이 스킬오브젝트의 효과를 적용시키는 작업을 각자 따로 진행하라는거죠?
네네 충분히 가능하고요. 저렇게 업데이트를 쓴다는건 스킬이 몇개를 쓰시는지 모르겟는데 매 프레임마다 체크하니까 스킬이 100개만써도 렉걸릴 듯합니다 -ㅅ-.
Brakey 유니티 전문가가 오브젝트 풀링 다룬 영상있는데 잠시 주소조 ㅁ가져올게요 이거함 보세요.
https://youtu.be/tdSmKaJvCoA
요고 보시면 완벽히 해결 될?것 같습니다.
감사합니다. 말씀해주신대로 다시 생각해보면서 해결해볼게요
네네 저 영상 꼭 보세요. 간단하게 유니티에 맞춰서 작성한 스크립트라 이해하기 쉬울겁니다. interface 클래스는 따로 찾아보셔야될 겁니다.
음 저라면 스킬 늘어날 떄마다 초기화 로직을 추가하는 것보다는 대상 몬스터가 지연 피해 스킬 이벤트를 구독하게 하고 지연 피해가 터지면 이벤트 null 할당 지연 피해가 터지기도 전에 죽었을 경우에도 이벤트 null 할당해서 대상이 죽으면 없던 일로 하고, 비활성화되자마자 다시 활성화되서 이전에 걸렸던 지연 피해가 들어가는 경우를 막을 것 같아요
아.. 이게 더 복잡하네요 그냥 몬스터 OnDeath 이벤트 있는 거 구독하고서 파괴되거나 비활성화될 떄 코루틴(타이머) 밀어버리고 구독 해제하면 될 것 같아여
제가c#을 잘몰라서 도움이 될진 모르겠는데 컨테이너를 저렇게 쓰지 마시고 충돌했을때 몬스터에 해당 스킬이나 스킬오브젝트를 넘겨주면서타이머나 코루틴?을 거는방식이 낫지 않을까요? 코루틴이나 타이머내부에서는 몬스터가 이미 죽었다면 아무것도 하지않고 리턴하고요
윗분이 말씀해준거랑 같은 조언같은데 확실히 그 방법이 더 나은가보네요. 그 방법대로 해보겠습니다 감사해요
맞습니다! 이거죠!
오브젝트풀링이 어떻게 되고있는지 모르겠지만 몬스터죽을경우 해당 타이머나 코루틴 다 밀어버리면 죽은거 다시 참조할일도 없을 것같네요
이런 너무나도 간단하게 해결하시네 거진 1시간 생각했는데