인프런 커뮤니티 질문&답변
점프관련해서 UI버튼클릭을 통한 전달값에 대한 질문입니다.
작성
·
293
0
moveInput스크립트에서 점프를 UI버튼으로 통제하려고하는데
Awake부문에서
OnClick.AddListener(Jump)를 통해 Jump함수를 불러와
public void Jump()
{
isJump = true;
}
을 전달한 후
void update()
{
isJump = false;
}
업데이트부문에서 UI버튼이 클릭되지 않았을시는 false 계속 반환되게 하려고 만들었습니다. Movement스크립트에서 Jump코드는 그대로 사용을 했을때 Jump함수의 true값이 MoveInput스크립트로 전달이 되지을 않는데 어떠한 문제때문인지를 모르겠습니다.
update에서의 false로 하지 않으면 MoveInput 스크립트로 잘 전달은 됩니다.
기존 코드는 Update부분에서
jump = Input.GetButtonDown(jumpButtonName);
이렇게 받아오는 방식이시던데 저방식도 false로 계속 값을 받아드리다가 버튼 클릭을 통해 한번의 true를 받아오는걸로 아는데 뭐가 다른지 궁금합니다.
답변 1
0
onclick 메서드에 추가된 함수의 경우 Update문이 실행 되기 전에 실행 됩니다.
실행은 되고 있지만 바로 그 후에 update문으로 덮어씌어지니 실행이 안되었다고 생각하실 수도 있을 것 같습니다.
isJump = false; 앞에 로그 찍어 보시면 이해하기 쉬울 것 같습니다.
버튼형식으로 동작되게끔 하고 싶으시다는게
1. 기존 코드 처럼 버튼 클릭시 한번의 true를 받는 경우
2. 버튼 클릭을 하는 동안 계속해서 true를 받는 경우
3. 버튼 클릭 후 다시 버튼을 클릭하기 전까지 true를 받는 경우
둘 중 어느 것인지 가늠이 안되어 제 지식선에서 적겠습니다.
1번의 경우 jump에 false를 대입하는 구문 앞에 jump가 true일 때 동작들을 if문의 형태로 적는 방식 입니다. 해당 방식은 꽤나 투박한 방식이라 bool 값의 종류(제어해야하는 동작)이 늘어날 경우 코드가 다소 난잡해 질 수 있습니다.(해당 방식에 대해 유지보수를 쉽게 하기 위한 디자인패턴이 있습니다 컴포지트 패턴..이였던 것 같습니다.)
if(jump) {동작할 코드}
jump = false; 이런 형식이 될 것 같습니다.
2번의 경우 다소 복잡해집니다. onclick으로 추가해주신 메서드는 버튼 클릭 후 클릭이 종료되는 순간 한번만 호출되어서 따로 click 이벤트를 만들어 주어야 합니다.
스크립트를 하나 추가하셔서
using UnityEngine.EventSystems; // click 이벤트 인터페이스를 포함
using UnityEngine.Events; // UnityAction 클래스 포함
해당 구문을 추가해 주시고,
IPointerDownHandler와 IPointerUpHandler 인터페이스를 상속받아 줍니다.(Monobehaviour는 그대로 둡니다.)
bool isTest // 클릭 체크용 bool값
static public UnityAction testFunction// jump 함수 추가해줄 변수 AddListener라고 생각하시면 될 것 같습니다
OnPointerDown(PointerEventData data)
OnPointerUp(PointerEventData data) 두 가지 메서드를 구현해줍니다. (각각 버튼 클릭시 한번, 버튼에서 클릭 종료시 한번 호출 됩니다.)
Down 함수에 isTest = true를 Up 함수에 false를 대입하는 구문을 추가해줍니다.
Update 함수를 추가해줍니다
if(isTest)
{
testFunction?.Invoke();
// ? 기호는 함수가 추가 되지 않아 null인 경우에 대비 C# 6.0 이상부터
// invoke() -> 함수 실행 메서드
} 해당 구문을 추가해줍니다.
3번의 경우 Jump() 함수의 내용을
isJump = (isJump == false) 로 변경 하시고 Update문의
isJump = false를 삭제 해주시면 됩니다.
친절한 답변 감사드립니다.
일단은 답변에 많은 도움이되어 조금은 다른방식이지만 해결하게되었습니다.
MoveInput스크립트에서 각 버튼들로부터의 OnPointerEvent에 대한 정보를 어떻게 받아와야할지를 몰라서 버튼들을 public으로 받아와 해당 버튼들에게 ButtonEvent라는 스크립트를 추가하여 각 버튼들로부터 OnPointerDown과 OnPointerUp의 정보를 받아오게 하였습니다.
이 방법이 좋은 방법인지는 잘은 모르겠습니다만 기존 강의 코드와 유사하게 만드는데는 성공한것 같습니다;;
음...2번을 원했다기보단 한번만 Jump의 True값을 받아오면 되긴 했었긴해요. 답변해주신신것처럼 Update에서 fale로 초기화가 최종적으로 이루어지다보니 Movement스크립트에서 원하던 값 전달이 안됬었던것에 고민하고 있었고 해결하였습니다. 그러나 다른 버튼들의 기능을 보니 1,2,3번 모두 필요하긴 했었던것 같습니다. 감사합니다.






답변 감사합니다.
혹시 괜찮으시면 여기서 제가 원하는것은 MoveInput의 스크립트내 bool 변수들의 값을 버튼형식으로 동작되게끔 하고 싶으나 그 방법에 대해 여러 시도를 해봤는데 도무지 답이 나오지 않는것 같아 그에 대한 해결책을 좀 도와주실 수 있을까요?