반응형

아무 게임오브젝트에 해당 스크립트를 붙이면 Debug가 출력 될 때 화면에 똑같이 출력해준다.

에디터에서는 필요없겠지만 기기에서 테스트할 때 편리하다.

 

using System.Collections;
using UnityEngine;

public class DebugToScreen : MonoBehaviour {
 	string myLog;
 	Queue myLogQueue = new Queue ();

 	void OnEnable () {
 		Application.logMessageReceived += HandleLog;
 	}

 	void OnDisable () {
 		Application.logMessageReceived -= HandleLog;
 	}

 	void HandleLog (string logString, string stackTrace, LogType type) {
 		myLog = logString;
 		string newString = "\n [" + type + "] : " + myLog;
 		myLogQueue.Enqueue (newString);
 		if (type == LogType.Exception) {
 			newString = "\n" + stackTrace;
 			myLogQueue.Enqueue (newString);
 		}
 		myLog = string.Empty;
 		foreach (string mylog in myLogQueue) {
 			myLog += mylog;
 		}
 	}

 	void OnGUI () {
 		GUILayout.Label (myLog);
	}
}

 

반응형
반응형

유니티의 UI컴포넌트를 많이 사용하는데, ScrollRect도 당연히 많이 사용하게 된다.

ScrollRect로 리스트 구현할 때 간혹 리스트 안에 Button을 붙이는 경우가 생기는데 Button과 ScrollRect간에 이벤트가 공유되지 않아 원치 않은 상황이 생기게 된다. 예를 들면 Button위에서 Swipe을 하게 될 경우 이런경우 스크립으로 버튼오브젝트에 발생되는 터치 이벤트 정보를 스크롤렉트로 동일하게 잘 넘겨주면 되지만 ... 아무튼 귀찮다.

이번꺼는 버튼만 정리한 내용이다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class ButtonTouchHandler : MonoBehaviour, IDragHandler, IPointerDownHandler, IPointerClickHandler {
	bool isEnable;
	Button Btn_Target;

	void Start () {
		Btn_Target = this.gameObject.GetComponent<Button> ();
		Btn_Target.interactable = false;
	}
	public void OnPointerDown (PointerEventData e) {
		isEnable = true;
		Btn_Target.interactable = false;
	}
	public void OnDrag (PointerEventData e) {
		if (Mathf.Abs (e.delta.x) > 2 || Mathf.Abs (e.delta.y) > 2) {
			Btn_Target.interactable = false;
			isEnable = false;
		}
	}
	public void OnPointerClick (PointerEventData e) {
		if (isEnable) {
			Btn_Target.interactable = true;
			Btn_Target.OnPointerClick (e);
		}
	}
}

 

추가로 상위 ScrollRect로 이벤트를 공유하는 스크립은 이렇게...

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class MyEvent : UnityEvent<Vector2> { }

public class Synchronizer : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {
	public ScrollRect ParentSR;
    
	public void OnBeginDrag (PointerEventData e) {
		ParentSR.OnBeginDrag (e);
	}
	public void OnDrag (PointerEventData e) {
		ParentSR.OnDrag (e);
		if (Mathf.Abs (e.delta.x) > 2 || Mathf.Abs (e.delta.y) > 2) {
			isDrag = true;
		}
	}
	public void OnEndDrag (PointerEventData e) {
		ParentSR.OnEndDrag (e);
	}
}
반응형
반응형
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using DG.Tweening;
using UnityEngine.SceneManagement;

public delegate void ProgressDelegate(float progress);

public class LoadSceneAsyncProgress : MonoBehaviour {
	public Image ProgressBar;
	public CanvasGroup CG_Loading;

	void Start() {
		CG_Loading.DOFade (0.5f, 0.5f).SetEase (Ease.Linear).SetLoops (-1, LoopType.Yoyo);
		StartCoroutine(LoadSceneAsyncByName("FamilyHomeVI_SR", OnLoadLevelProgressUpdate));

	}
	
	public static IEnumerator LoadSceneAsyncByName(string nextLevel, ProgressDelegate progressDelegate) {
		AsyncOperation async = SceneManager.LoadSceneAsync(nextLevel);
	
		while (!async.isDone) {
			progressDelegate (async.progress);
			async.allowSceneActivation = async.progress > 0.8;
			yield return null;
		}
	}

	private void OnLoadLevelProgressUpdate(float progress) {
		ProgressBar.fillAmount = progress;
		Debug.Log ("async.progress: " + progress);
	}
}

참조 : https://gist.github.com/crowjdh/26272392e425063cbd69586cd542a46d

 

Getting progress while loading scene in Unity using SceneManager.LoadSceneAsync.

Getting progress while loading scene in Unity using SceneManager.LoadSceneAsync. - UnityLoadSceneAsyncProgress.cs

gist.github.com

참조 : https://docs.unity3d.com/ScriptReference/AsyncOperation-progress.html

 

Unity - Scripting API: AsyncOperation.progress

Return an operation's progress. (Read Only) This returns how close the operation is to finishing. The operation is finished when the progress float reaches 1.0 and isDone is called. If you set allowSceneActivation to false, progress is halted at 0.9 until

docs.unity3d.com

 

반응형
반응형

delegate 로 원하는 타입을 설정하고 생성해서 사용하면 끝
여기서 타입은 void, int, float, double 등을 얘기함.
어떤 함수를 호출할때 원하는 함수를 호출한다.
응용방법이 참 많을것 같아서 꼭 숙지해두는게 좋을 듯 하다.

 

반응형
반응형

GPS좌표간 거리계산
특정 매장근처에 가면 노티가 뜨는 시나리오를 구현하였다.
구글맵을 이용하면 경위도 좌표를 쉽게 구할 수 있고
Unity 안드로이드의 현재 위치값을 가져오는 Input.Location을 사용하였다.

출처 : http://fruitdev.tistory.com/189

반응형
반응형

 

1. 하이어라키에 빈게임오프젝트를 만들고 적당히 이름을 변경해준다.

 

2. 빈게임오브젝트에 SpriteRenderer를 추가해준다. (참고로 UI Image, RawImage도 된다)

 

3. 생성한 게임오브젝트를 선택하고 Animation창을 열어 Create 버튼을 눌러 애니메이션을 생성한다.

 

4. 준비해 둔 시퀀스파일을 모두 선택 후 생성한 Animation에 드래그해서 집어 넣는다.

 

 

 

 

5. 애니메이션의 프레임을 움직여보면 시퀀스가 적용된 것을 볼 수 있다.

반복재생, 속도 조절 등등....은 Animator사용법을 숙지하고 사용하면 끝.

 

 

 

 

 

반응형
반응형

어떻게 보면 간단한 구현 일 수도 있겠지만
난 어려웠다. ㅠㅠ 그래서 다시 정리하는 차원에서 포스팅 해본다.

먼저 간략하게 요약해보자면…
Unity의 기본제공되는 GUI를 사용,
데이터 형태는 Json형태로 만들어서 사용하기 편리하도록 parsing을 거친 뒤 구현하였다. 동작 원리는 스크롤 시 화면에 보여지는 부분의 GameObject(Item)만 생성하여 Draw Call을 줄이는 방식으로, 업 스크롤 시 위로 올라가는 Item을 아래로 이동시켜 아랫쪽 데이터를 붙이고, 다운 스크롤 시 아래로 내려가는 Item을 위로 이동시켜  위쪽 데이터를 붙이는 방식이다. 아이템을 잡고 있는 GameObject의 길이는 최초에 계산되어 전체 Item 갯수만큼의 길이로 생성되어진다.
자전거의 톱니와 체인을 생각하면 쉽게 이해될듯하다.

Hierarchy 구성

스크린샷 2016-01-19 오후 12.27.42

스크립트 구성

스크린샷 2016-01-19 오후 4.25.59

테스트용 데이터 세팅하기
먼저 JsonData를 만들자
Assets > Resources 폴더를 만들고 그 안에 data.txt 파일을 하나 만든 후 아래와 같이 코딩한다. 참고로 data.txt는 그냥 아무 파일 하나 만들어서 확장명만 바꿔주면 된다.
데이터 형태는 나중에 어떻게든 바꿔서 사용할 수 있다.

data.text

Hierarchy의 Manager에 ManagerHandler, ModelHandler, ListModel 라는 이름으로 C# Script 3개를 생성하고 아래와 같이 코딩한다.

ManagerHandler.cs

 

ListModel.cs

 

ModelHandler.cs

LitJson.dll은 여기에서 받을 수 있으며 Assets > Plugins(생성) 폴더에 넣어준다.

구현하기
먼저 Hierarchy의 ScrollRect(GameObject)에 ScrollRect 콤포넌트를 붙인다.
Infinity Content(GameObject)에 InfiniteScroll라는 C# Script을 생성한 후 아래와 같이 코딩한다.

 

Item(GameObject)에 Item 이라는 이름으로 C# Script를 생성해서 다름과 같이 코딩한다. 아이템 부분은 적당히 수정해서 사용할 수 있을 것이다.

 

Infinity Content의 Inspector가 보이도록 한 후 아래 그림에서 보이는 것 처럼 드래그해서 각 해당 되는곳으로 넣어 준 후 ItemWidth, ItemHeight, Gap 에 원하는 사이즈를 입력한다.

스크린샷 2016-01-19 오후 5.05.25

 

마찬가지로 Item또한 아래 그림처럼 드래드앤 드롭해준다.

스크린샷 2016-01-19 오후 5.13.05

 

Manager도 아래와 같이 Infinity Content를 드래그 앤 드롭 해준다.

스크린샷 2016-01-19 오후 5.16.12

반응형
반응형

unity에서 지원되는 Application.LoadLevel을 사용하면 Scene과 Scene간의 이동이 가능하지만 이동할 때 아무런 효과없이 이동이 된다. 프로젝트마다 성향이 달라서 모두 적용되기는 힘들 수도 있겠지만 찾아보다 가장 무난하다 싶은걸 찾아서 작동이 잘 되도록 수정하였다. unity의 GL class를 사용하여 Scene이동시 Quad를 그려 자연스럽게 이동되게 한다.
AutoFade.cs 파일을 적당한 폴더에 넣어서 사용하면 편리할 듯 하다.

참고 : http://www.devkorea.co.kr/reference/Documentation/ScriptReference/GL.QUADS.html,
How to Fade Between Scenes in Unity,
Unity3D load level with fade effect

호출 할 때


상단 메뉴에서 File/Build Setting 에 다음과같이 사용하고자 하는 Scene을 넣어줘야한다.


반응형
반응형

Unity 게임 Tutorial을 따라하다 아주 간단하게 두 타겟 또는 그 이상의 타겟의 중점을 구하고 카메라 줌인/아웃 시키는 공식이 있길래 포스팅 한다. 너무도 간단?하다…

사실 Vector3 + Vector3하면 각 x,y,z가 각각 합해 진다는 생각조차 하지 못했다.
메인 카메라의 이동에 사용되었다.

반응형
반응형

 

Application.CaptureScreenshot(myScreenshotLocation);
요 함수로 간단하게 될 줄 알았던 스크린샷이 문제가 생겼다.
파일까지 저장이 잘 되지만 갤러리나 사진첩에서 해당 이미지가 업데이트 되지 않는 문제가 생긴다. 강제로 업데이트를 해줘야하는데 위 코드 하단에 보이는 것 처럼 해주면 된다.

참고 : http://answers.unity3d.com/questions/200173/android-how-to-refresh-the-gallery-.html

반응형

+ Recent posts