• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

점프관련해서 UI버튼클릭을 통한 전달값에 대한 질문입니다.

22.10.06 17:18 작성 조회수 177

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

oort_cloud98님의 프로필

oort_cloud98

2022.10.06

onclick 메서드에 추가된 함수의 경우 Update문이 실행 되기 전에 실행 됩니다.

실행은 되고 있지만 바로 그 후에 update문으로 덮어씌어지니 실행이 안되었다고 생각하실 수도 있을 것 같습니다.
isJump = false; 앞에 로그 찍어 보시면 이해하기 쉬울 것 같습니다.

허인호님의 프로필

허인호

질문자

2022.10.10

답변 감사합니다.

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

oort_cloud98님의 프로필

oort_cloud98

2022.10.11

버튼형식으로 동작되게끔 하고 싶으시다는게

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를 삭제 해주시면 됩니다.

허인호님의 프로필

허인호

질문자

2022.10.11

친절한 답변 감사드립니다.

일단은 답변에 많은 도움이되어 조금은 다른방식이지만 해결하게되었습니다.

MoveInput스크립트에서 각 버튼들로부터의 OnPointerEvent에 대한 정보를 어떻게 받아와야할지를 몰라서 버튼들을 public으로 받아와 해당 버튼들에게 ButtonEvent라는 스크립트를 추가하여 각 버튼들로부터 OnPointerDown과 OnPointerUp의 정보를 받아오게 하였습니다.

이 방법이 좋은 방법인지는 잘은 모르겠습니다만 기존 강의 코드와 유사하게 만드는데는 성공한것 같습니다;;

oort_cloud98님의 프로필

oort_cloud98

2022.10.11

원하는 기능을 구현했다니 다행입니답.
아무래도 2번같은 기능을 원하셨던 걸까요?

추후에 계속해서 수정해가시면 될 것 같습니답

허인호님의 프로필

허인호

질문자

2022.10.16

음...2번을 원했다기보단 한번만 Jump의 True값을 받아오면 되긴 했었긴해요. 답변해주신신것처럼 Update에서 fale로 초기화가 최종적으로 이루어지다보니 Movement스크립트에서 원하던 값 전달이 안됬었던것에 고민하고 있었고 해결하였습니다. 그러나 다른 버튼들의 기능을 보니 1,2,3번 모두 필요하긴 했었던것 같습니다. 감사합니다.