버튼에 이벤트를 연결시키는 간단한 방법입니다.
처음에 개발할때는 버튼 30개에 일일이 하나씩 지정해 줬었는데, 아놔 노가다가 노가다가 이런 일이 없어요.
간혹가다가 멘붕와서 하나라도 빠지면 ㅠㅠ 짜증 만땅나요.
그래서 코드로 직접 이벤트 리스너를 등록하는 신공을 익혔지요.
구현 코드는 정말 간단해요. 이걸 아니까 예전에 왜 그렇게 했지. 머리가 나쁘면 손과 눈이 고생이라는걸...
자 요런식으로 스테이지를 구성할때 리스트 뷰에다가 버튼을 동적으로 생성해서 넣고 저 버튼을 누를때 누른 스테이지를 콜 하는 방법 수많은 게임에서 주로 사용하는 방식이지요.
제가 실제 게임에 사용한 코드전체입니다. (전문가 분들은 멍멍이 발로 코딩했니 이런소리 할수도 있지만 그냥 그러려니 넘겨주세요 ㅋㅋㅋ)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class StageScene : MonoBehaviour {
public Sprite Locked;
public Sprite Unlocked;
public ScrollRect scrollRect;
private int maxStage;
// Use this for initialization
void Start () {
SoundManager.instance.PlayBgm(2);
maxStage = 30;
initStages();
}
private void OnDestroy()
{
//for (int i = 1; i <= nbOfStages; i++)
//{
// scrollRect.content.GetChild(i).GetComponent<Button>().onClick.RemoveListener(() => StageButtonClickListener(i));
//}
}
public void BackToMainScene()
{
SceneManager.LoadScene("MainScene");
}
private void initStages()
{
int nextStage = PlayerPrefs.GetInt("NextStage", 1);
Button toInstance = Resources.Load<Button>("Prefabs/StageButton");
Vector3 nextPosition = new Vector3(0, 0, 0);
for (int i = 1; i <= maxStage; i++)
{
Button stage = Instantiate(toInstance, nextPosition, Quaternion.identity, scrollRect.content.transform);
stage.transform.GetChild(0).GetComponent<Text>().text = i.ToString();
stage.transform.localPosition = nextPosition;
int id = i;
// add listener
stage.onClick.AddListener(() => StageButtonClickListener(id));
if (i <= nextStage)
{
stage.image.overrideSprite = Unlocked;
stage.transform.GetChild(0).GetComponent<Text>().gameObject.SetActive(true);
}
else
{
stage.image.overrideSprite = Locked;
stage.transform.GetChild(0).GetComponent<Text>().gameObject.SetActive(false);
}
// Next position
if (i % 6 == 0)
{
nextPosition.x = 0;
nextPosition.y -= 130;
}
else
{
nextPosition.x += 130;
}
}
RectTransform boundary = (RectTransform)scrollRect.content.transform;
boundary.sizeDelta = new Vector2(780, nextPosition.y * (-1) + 130);
}
void StageButtonClickListener(int stage)
{
if (stage <= PlayerPrefs.GetInt("NextStage", 1))
{
PlayerPrefs.SetInt("CurrentStage", stage);
SceneManager.LoadScene("StageScene" + stage.ToString());
}
}
}
버튼에 이벤트 넣는 부분은 붉은색 마킹해 놓았어요. 한번 보시면 이해가 빠르실꺼에요.
요렇게 개발하면 저 위에 캡쳐한 화면처럼 나온답니다. ^^
'개발 > 코딩' 카테고리의 다른 글
SkCertService.exe 자꾸 오류생기는 문제 해결방법 (3) | 2017.05.30 |
---|---|
크롬에서 '플레시 플레이어' 작동안될때 항상 허용하는 방법 (0) | 2017.04.24 |
핸드폰 공장초기화한다고 데이터가 완전 삭제될까요? (중고폰 판매전 데이터 완전삭제 꿀팁) (0) | 2017.04.13 |
구글 네이버 다음 검색엔진 어떤걸 주로 쓰시나요? (1) | 2017.04.07 |
[문제해결방법] An exception has been encountered this may be caused by an extension activitylog xml (0) | 2017.03.31 |
[유니티 버그] 안드로이드 앱 아이콘 적용안됨 버그 (Unity 버그) (0) | 2017.03.10 |
Android Studio 2.2 한글 깨짐현상 해결 방법 (0) | 2016.12.01 |
포토샵 이미지 크기 변경시 anti-alias 해제 방법 (안티앨리어스 옵션해제 방법) (0) | 2016.11.29 |
최근댓글