인프런 커뮤니티 질문&답변
CanTransitionToSelf 질문 있습니다.
작성
·
15
답변 2
0
수강해주셔서 감사합니다.
MakeTransition에서 canTransitionToSelf를 사용자가 지정하지 못하게 내부적으로 처리해둔 이유는, 사용자가 설정해봤자 아무런 의미가 없기 때문입니다. 두 가지 경우로 나누어 생각해보면 쉽습니다.
1. 다른 상태로 전이할 때 (예: MakeTransition<Idle, Walk>)
이때는 현재 상태(Idle)와 전이할 상태(Walk)가 서로 다릅니다. 애초에 '자기 자신으로의 전이' 상황 자체가 아니기 때문에, 이 옵션에 true를 넣든 false를 넣든 전이 로직에 아무런 영향을 주지 않는 무의미한 값이 됩니다.
2. 같은 상태로 전이할 때 (예: MakeTransition<Attack, Attack>)
개발자가 명시적으로 <Attack, Attack>을 작성했다는 것은 '공격 중에 특정 조건이 맞으면 다시 공격을 처음부터 실행하겠다(콤보 공격 등)'는 확고한 의도입니다. 하지만 여기서 canTransitionToSelf를 false로 설정하게 되면 절대로 전이가 안 되겠죠? 이러면 결국 '스스로에게 전이하라고 명령해놓고 스스로의 전이는 막아놓은' 논리적 모순이 발생하여 동작하지 않는 코드가 됩니다.
다시 말해, MakeTransition은 출발지와 도착지가 명확하기 때문에 옵션을 열어두는 것이 불필요합니다.
MakeAnyTransition과의 차이점
반면 MakeAnyTransition은 '현재 상태가 무엇이든 무조건 지정된 상태로 이동해라'라는 광역 명령입니다. 만약 캐릭터가 이미 '사망' 상태에 진입해 있는데, 매 프레임 체력이 0 이하라는 조건이 맞는다고 계속 사망 상태로 무한 루프하면 안 되겠죠?
MakeAnyTransition은 이미 해당 상태에 진입해 있을 때 불필요한 재진입을 허용할지 말지 결정할 '유연성'이 반드시 필요해서 옵션을 열어둔 것입니다. canTransitionToSelf는 오직 MakeAnyTransition의 무한 루프를 막기 위한 옵션입니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 단짠커피님.
StateMachine 클래스의 MakeTransition 함수에서 canTransitionToSelf를 true로 강제하는 이유는 주로 상태 전이에 대한 유연성을 제공하기 위함입니다. 이 방식은 특정 상태에서 스스로 전이(transition)될 수 있도록 허용함으로써 상태 전이 로직을 간소화합니다.
MakeTransition과 MakeAnyTransition 함수의 사용 목적이 다소 다릅니다. MakeTransition은 지정된 두 상태 간의 전이를 설정하는 데 사용되고, 이는 때로는 동일한 상태로 전환하거나 동일한 상태 내에서 특정 이벤트를 트리거해야 하는 상황이 발생할 수 있음을 의미합니다. 이 경우, canTransitionToSelf를 강제적으로 true로 설정함으로써 코드의 복잡성을 줄이고 특정 조건에서의 상태 전이를 더욱 직관적으로 관리할 수 있게 됩니다.
사용자가 직접 canTransitionToSelf를 지정하게 할 수도 있지만, 이는 코드를 보다 복잡하게 만들 수 있으며, 기본적으로 동일한 상태로의 전이를 허용하는 방식을 통해 이러한 잠재적인 복잡성을 피해가는 것입니다.
비슷한 주제에 대해 다른 수강생들이 논의한 게시물을 확인하시려면 아래 링크를 참고해 주세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
유연성을 생각한다면 오히려 사용자가 지정할 수 있게 해주는게 맞다고 생각합니다. 답변을 보고 제가 이해한건 어차피 현재 상태에서 다시 현재 상태로의 전이를 허용 할 것이기 때문에 true로 설정하는거라고 보여지네요.






답변 감사합니다.
그렇다면
MakeTransition으로 Dead -> Dead 같은 형태의 전이를 허용하는 경우(일반적으로 이런 경우는 없겠지만)라면 무한 루프에 빠지지않는 조건을 사용해야겠군요.즉,
MakeTransition은 같은 상태로의 전이를 사용할 땐 개발자가 조건을 잘 정해야 할 것이고MakeAnyTransition은canTraistionToSelf옵션 덕분에MakeTransition보다는 상대적으로 덜 까다롭게 조건을 지정할 수 있다고 볼 수 있겠네요.+ 추가
- 답변 주신 내용 다시 보니 개발자가 <Attack, Attack>이라는걸 명시(1)한다는건 이미 같은 상태로 전이를 반드시 할 것이고 그렇기 때문에 false(2)를 지정한다면, (1), (2)가 서로 논리적으로 맞지 않는다는 거군요.
- 반대로 MakeAnyTransition은 어느 상태에서 전이될진 모르지만 같은 상태에서 넘어오는 경우 무한 루프 등의 문제가 발생할 수 있어 옵션으로 유연하게 처리할 수 있게 한 것이구요.
이해 되었습니다 감사합니다.