상세 컨텐츠

본문 제목

[Unity] 유니티 GUI 버튼(Button)에 이벤트, 연결등등 관련

게임엔진관련/유니티 엔진

by AlrepondTech 2019. 1. 29. 17:26

본문

반응형

 

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

출처: https://m.blog.naver.com/PostView.nhn?blogId=nicecapj&logNo=220396155254&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

 

 

 

클릭이나, 터치에 의해 정해진 처리를 하는 컨트롤이다. 유니티사에서는 UI요소(Element)

라고 부른다. 앞으로는 UI요소라고 부르기로 하겠다.

 

 


Canvas밑에 Buttone이 생기고, 버턴에 메시지를 추가할 수 있도록 Text가 자식으로 추가된다. 

 


버턴은 크게, 반응여부 / 변화/ 버턴이미지 / 이벤트로 구성되어 있다.
 
하나씩 보도록 하자
 
 
Interactalbe

 

  버턴이 유저의 입력에 반응할 것인가를 결정하는 기능이다. 
  체크되어 있지 않으면, Noraml/Highlighted/Press/Disabled가 모두 무시된다.
  단순 정보 표시용으로 사용할때, 체크를 해제해주면 된다.
 
Transition(전환 효과)
버턴의 각 상태에 따라, 변화가 일어난다.
 
Normal : 유저와 상호작용이 없는 상태
Pressed : 누르거나, 터치하고 있는 상태
Highlighted : Hover라고도 하며, 마우스 포인터가 올라가 있거나, 모바일에서 터치중인 상태
Disabled : 비활성화 된 상태
 
3가지 타입(색상지정 / 이미지 교체 / 애니메이션)을 지원한다.

 


PC에서는 Sprite Swap방식을 사용해서, 버턴을 누르던가, 클릭하게 되면
반응을 유저가 느낄수 있도록 이미지를 교체하는 것이 보통이었습니다.
 
하지만 모바일로 오면서, 버턴에 터치를 하게 되는데, 이때 손이 가리는 경우가 많고,
화면이 작아서, 색상변경정도만 해주거나, 아예 효과는 주지 않는 경우도 있습니다.
 
3가지 타입중에서 선택해서 사용하면 될 것 같습니다.
 
 
None(아무것도 안함)

 

버턴의 각 상태에 아무것도 변화가 일어나지 않는다.
 
Color Tint(색상 전환)

 

Target Graphic에 설정된 스프라이트 이미지에 각 상태마다 색상을 섞어서 보여주는 형식
 
Color Multipier는 원래 색조의 강도가 0~1인 각 상태에 지정된 Color를 그 이상으로 확장할때
사용한다. 5를 지정하면 각 상태들의 색에 x 5가 된다.
4가지 상태에 색조를 좀 약하게 하거나, 함께 강조할 때 사용한다.
 
Fade Duration은 각 상태전환에 사용되는 시간
(버턴을 누르면, Normal 빨간색에서 0.1초후에 회색으로 변경됨)
 
 
Sprite Swap(스프라이트 이미지 교체)

 

버턴의 각 상태마다 스프라이트 이미지를 실제로 교체하는 형식

 

Animation(애니메이션 교체)  

 

이미지나 색상을 교체하는 것이 아니라, 애니메이션을 지정해서, 변화를 표시하는 방식
 
Navigation
여러개의 버턴이 있는경우, 키보드로 이동키를 누를때, 어느 버턴으로 이동할지를 지정한다.
Visualize를 누르면 흐름을 볼 수 있다.



동작은 플레이를 한 후에 키보드 이동키를 눌러보면 된다.  

 

Horizontal로 설정된 경우는 ←→에 반응하고
Vertical인 경우는 ↑↓에 따라 움직인다.
Automatic은 자동으로 적당하게 움직인다.
Explicit의 경우는 키보드 방향별로, 어떠 버턴으로 움직일 지 지정할 수 있다.

 


 
 
이미지(스프라이트)
버턴에서 기본적으로 표시될 이미지를 지정하는데, 색상(Color)도 지정해서 보여줄 수 있다.
지정된 이미지는 버턴 맨아래쪽에, 아래와 같이 이미지를 프리뷰해준다.



 


Image Type(처리할 형태)은 4가지(Simple / Sliced / Tield / Filled)를 지원하는데, 
Image항목에서 세부적으로 보기로 한다.

 


 
버턴이 주로 사용하는 Click이벤트를 기본 제공한다.
+버턴을 눌러서, Click이벤트를 처리할 함수가 정의되 있는 스크립트가 추가된
게임오브젝트를 지정해주면 된다.



빈 오브젝트를 하나 만들자.  



F2를 눌러서, 이름을 ButtonHandler로 바꾸자.  

 


ButtonTestHandler.cs라는 스크립트를 하나 만들고, ButtonTestHandler오브젝트에 추가하자.
Buttone에서 핸들러로 지정할 수 있는 함수는 public void형에 인자가 없거나 1개여야 한다.
인자가 1개인 경우는, string/bool/int/float/Object가 가능하다.
 
using UnityEngine;
using System.Collections;

public class ButtonTestHandler : MonoBehaviour {
   
    public void OnClickHello()
    {
        Debug.Log("안녕하세요");
    }
}
 
 
+를 눌러서 Runtime Only밑에, ButtoneHandler를 드래그 앤 드롭한 후, 옆에 No Function을 
클릭하면 사용할수 있는 오브젝트와, 오브젝트가 가진 함수 목록이 나온다.
ButtoneTestHandler를 선택해서 미리 정의한 함수인 OnClickHello를 선택해주자.

 


 
실행을 누른후, 버턴을 클릭하면, 콘솔창에 정상적으로 원하는 처리가 되는것을 볼 수 있다.



Text에는 버턴에 표시될 텍스트를 입력하면 된다.  

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

버튼이밴트를 받을때 버튼이 속한 객체클래스를 바로 받을수있다.

 

 

 

 

-그림(1번) 컴포넌트  스크립트 C# 추가코드

class CUserListCell 

{

      public int a = 5;

      public int b = 2;

      [SerializeField] private Button _btnInvite    = null;

      //codes..

      //..

}

 

- 그림(1번)을 "Cell" 오브젝트를 눌러서 "[SerializeField] private Button _btnInvite"부분의 속성링크란이 생기는데

 그림(2번)의 버튼과 연동 시켜준다. 

 

 

- 아래와 같이 아무 오브젝트에 스크립트 C#추가 코드를 넣어준다 [그림에선 "CUserlistView" 에 넣어주었다)

class CUserlistView

{

    public void OnPressCellBtn(CUserListCell cell)

    {

        int test1 = cell.a;

        int test2 = cell.b;

    }

}

 

 

- 그림 그림(2번)을 눌러서 왼쪽에서 오브젝트트리란에 위에서 추가해준 "CUserlistView"C#코드를 컴포넌트를 넣어준 오브젝트와

연결시켜 그림(3번)처럼 해준다.  함수 "OnPressCellBtn(...)" 가보인다 그걸 연결시켜주고 그러면 "CUserListCell"객체를 넣어주는

란이 나온다. 그러면 오브젝트트리란의 그림(1번)을 드래그해서 링크시켜주면 된다.

 

-이렇게 완성후 실행하고 버튼을 클릭하면 위의 코드 OnPressCellBtn()의 cell.a 와 cell.b가 객체클랙스 값 그대로 들어올것이다.

 

 

 

=======================

=======================

=======================

 

 

 

출처: https://blog.danggun.net/2881

 

유니티가 5.0이 되면서 플러그인 몇 개를 흡수해서 GUI를 구성하는 방법이 비주얼 적으로 바뀌었습니다.

(4.6 때 바뀐 거 같지만 넘어가고 ㅎㅎㅎ)

새로워진 GUI 작성방법을 배워 봅시다.

 

이전 포스팅을 참고하시면 좋을 듯 하네요.

참고 : [Unity] GUI 작성하기

 

 

0. 테스트 화면 만들기

방향키를 'GUI'로 만들고 방향키를 누르면 카메라가 이동하도록 만들 것입니다.

 

테스트를 위해 프로젝트를 생성하고 3D 큐브를 하나 추가 합니다.

테스트용이니 적당한 이미지를 큐브에 적용합니다.

 

 

 

1. 버튼 만들기

이제 'GameObject'메뉴에 'UI'카테고리가 생겼습니다!!!!

 

1-1. 버튼 추가 하기

UI > Button

을 눌러 GUI 버튼을 추가 합니다.

 

 

 

 

이제 트랜스폼툴에 새로 추가된 'UI 툴'을 눌러 UI 편집을 활성화 시킵니다.

 

 

 

반응형

 

728x90

 

 

게임창을 확인하면 버튼이 추가 된것을 알 수 있습니다.

 

1-2. 방향키 만들기

위와 같은 방법으로 4개의 버튼을 만듭니다.

 

하이어라키에 보면 'Canvas>Button'이 추가 된 것을 볼 수 있습니다.

이곳에 'Button'을 확장해보면 'Text'가 포함되어 있음을 볼 수 있습니다.

이 'Text'를 수정하면 버튼에 표시되는 텍스트를 꾸밀 수 있습니다.

 

 

 

 

우리는 방향키에 맞게 각각의 버튼의 텍스트를 수정 합시다.

 

 

 

 

모양도 이쁘게 배치해 봅시다.

 

 

 

 
 
2. 기능 연결하기

이제 스크립트를 만들어 버튼과 카메라를 연결해 봅시다.

 

2-1. 스크립트 만들기

c# 스크립트를 생성하여 메인카메라에 추가 합니다.

 

 

 

 

버튼을 누르면 카메라가 움직이도록 하기위해 카메라 오브젝트를 가지고 있을 변수 'GameObject goCamera;'를 추가합니다.

 

/// <summary> /// 움직일 카메라 /// </summary> GameObject goCamera;  void Start ()  { 	//움직일 카메라를 찾는다. 	this.goCamera_Minmap = GameObject.Find("Main Minmap"); } 

 

 

버튼을 누르면 카메라를 움직여줄 함수 'PressKey(int nKey)'를 만듭니다.

 

public void PressKey(int nKey) { 	//처음 데이터 받기 	Vector3 rectTemp = this.goCamera.transform.localPosition; 	 	switch (nKey) 	{ 	case 1:	//left 		rectTemp.x -= 0.1f; 		break; 	case 2:	//up 		rectTemp.y += 0.1f; 		break; 	case 3:	//right 		rectTemp.x += 0.1f; 		break; 	case 4:	//down 		rectTemp.y -= 0.1f; 		break; 		 	} 	 	//완성된 데이터 저장 	this.goCamera.transform.localPosition = rectTemp; } 

 

2-2. 스크립트 연결하기

 

이제는 스크립트 안에서 모든 GUI를 관리하던 방식이 아니기 때문에 작성한 스크립트를 GUI와 연결하는 작업이 필요합니다.

 

하이어라키에 있는 버튼을 클릭하고 인스팩터의 'Button'에 보면 'On Click ()'이라는 이벤트가 있습니다.

 

 

 

 

이 이벤트에 '+'를 눌러 구성요소를 추가합니다.

'None'이라고 쓰여있는 곳에 메인카메라를 끌어서 넣고 'No Function'을 눌러보면 카메라에 추가한 'claArrowKeys'클래스가 보입니다.

이 클래스를 선택하면 포함된 멤버들이 표시되는데 아까 우리가 만든 'PressKey(int)'를 선택해 줍니다.

 

 

 

 

그러면 아래와 같이 'PressKey(int)'에 넘겨줄 파라메타를 써줄 칸이 생깁니다.

여기에 버튼이 눌렸을 때 보낼 값을 넣어 줍니다.

 

버튼별로 같은 작업을 한 후 아래와 같이 버튼별로 다른 값을 넣어 줍니다.

Left : 1

Up : 2

Right : 3

Down : 4

 

 

 

 

3. 테스트

이제 완성된 코드를 테스트 해봅시다.

 

 

카메라가 움직이는 것이므로 큐브가 반대로 움직이는 것처럼 보입니다.

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: https://vallista.tistory.com/entry/Unity3D-UGUI-button-cant-touching-UGUI-%EB%B2%84%ED%8A%BC-%ED%84%B0%EC%B9%98%EA%B0%80-%EC%95%88%EB%90%A0-%EB%95%8C

 

 

UGUI 버튼 터치가 안될 때 확인을 몇개를 해야 한다.

 

1. 먼저 Hierarchy에 Event System이 있는지 확인

그 다음 Event System에 아래와 같이 있는지 확인

 

 

 

2. 캔버스 확인

 

 

 

가장 하단의 Graphic Raycaster 있어야 된다.

 

3. 앞의 Depth에 위치한 카메라에 Boxcollider 있는지 확인.

 

*더 있으면 덧글에 써주시면 추가하도록 하겠습니다.*



출처: https://vallista.tistory.com/entry/Unity3D-UGUI-button-cant-touching-UGUI-버튼-터치가-안될-때 [VallistA]

 

 

 

=======================

=======================

=======================

 

 

 

 

 

출처: https://unitytip.tistory.com/48

 

 

안녕하세요.

 또 새로운 내용으로 포스팅하겠습니다.

 유니티 UI작업을 할 때, 버튼을 만들면 드래그&드랍으로 끌어다가 메소드를 연결시키는데요. 어떻게 보면 유니티를 잘 활용한다고 할 수도 있습니다만, 수가 많아지거나 연결해야 할 메소드가 바뀌어 일일이 연결 작업을 하려면 그게 여간 귀찮은 일이 아닐 수 없습니다. 그래서 스크립트로 연결하는 방법이 없을까 하다가 찾아보니까 있길래 기록하는 마음가짐으로 포스팅을 남깁니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ObjectTest : MonoBehaviour
{
    public Button button;
    void Start ()
    {
        button.onClick.AddListener(PrintYes);
    }
    void PrintYes()
    {
        print("yes");
    }
}
cs

 이렇게 onClick.AddListener를 하고 버튼에 연결할 메소드를 붙여주면 에디터에서 일일이 연결해주지 않아도 버튼에 메소드가 연결됩니다. 아주 꿀팁이 아닐 수 없습니다. 오늘은 좀 짧은 내용입니다만 비교적 유용한 내용이 될 것 이라고 생각합니다. 이렇게 한 김에 Button 클래스에 대한 유니티 매뉴얼을 읽고 한번 본격적으로 다뤄보는 시간을 가져보는게 좋을 것 같단 생각이 듭니다. 다음에 할 게 없으면 그렇게 하는 걸로 목표로 하고 하겠습니다.

 감사합니다.

 

 

 



출처: https://unitytip.tistory.com/48 [Unity Tip 모음 by dnrkckzk]

 

 

=======================

=======================

=======================

 

 

 

 

 

출처: http://blog.kpaper.com/2017/02/unity3d-ugui-button.html

 

Unity3D에서 uGUI Button 을 동적으로 생성할 때, 클릭 이벤트 추가 하는 방법

 
uGUI 로 동적 버튼을 생성할 때 코드로 클릭 이벤트를 추가하려면,
아래와 같은 방법으로 onClick 이벤트를 추가한다.
 
 _spawnedButton.GetComponent<Button>().onClick.AddListener(delegate() { 게임오브젝트.GetComponent<컴포넌트 클래스 이름>().실행할 함수(); });

 

 

=======================

=======================

=======================

 

 

 

 

 

출차: https://answers.unity.com/questions/938496/buttononclickaddlistener.html

 

Question by Raynoko · '15년 Apr월 02일 AM 11시 44분 · uibuttoninputupdateclick

Button.onClick.AddListener

Hi everybody, im using this code:

  1. public int index;
  2. private Button myselfButton;
  3. void Start()
  4. {
  5. myselfButton = GetComponent<Button>();
  6. }
  7. void Update () {
  8. if (Input.GetMouseButtonUp(0))
  9. {
  10. myselfButton.onClick.AddListener(() => actionToMaterial(index));
  11. }
  12. }
  13. void actionToMaterial(int idx)
  14. {
  15. Debug.Log("change material to HIT on material : " + idx);
  16. }

and when i click on the button, console write me some debug, in one time, but i need call this function only one. How can i do it? Anybody knows what im doing wrong? Thanks

Add comment ·  Show 1

2 Replies

 · Add your reply
avatar image
17
 

Answer by HarshadK 

Just add the listener to your button in start only and not required to be done inside Update on each click.

  1. public int index;
  2. private Button myselfButton;
  3. void Start()
  4. {
  5. myselfButton = GetComponent<Button>();
  6. myselfButton.onClick.AddListener(() => actionToMaterial(index));
  7. }
  8. void actionToMaterial(int idx)
  9. {
  10. Debug.Log("change material to HIT on material : " + idx);
  11. }

You should also RemoveListener when gameobject is destroyed or disabled

  1. void Destroy()
  2. {
  3. myselfButton.onClick.RemoveListener(() => actionToMaterial(index));
  4. }
Add comment ·  Hide 1 · Share
 

it's working perfect, thank you

avatar image
0
 

Answer by Pressler487 

first create class for button in my case (ToolButton.cs) then add this script like below

  1. currentButton = Instantiate(tool) as GameObject;
  2. button = currentButton.AddComponent<ToolButton>();
  3. button.tool = btn;
  4. button.counter = counter;

in ToolButton scripts on Start() function you need to add Addlistener to each button

  1. UnityEngine.Events.UnityAction action = () => { Play();}; GetComponent ().onClick.AddListener (action);

lite blue login

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

#기타관련링크

 

https://twoicefish-secu.tistory.com/10  

 

https://samablog.tistory.com/120

 

 

=======================

=======================

=======================

 

 

 

반응형


관련글 더보기

댓글 영역