반응형

Unity의 UI쪽 컴포넌트를 주로 많이 사용하고 있는데
예를 들면 ScrollRect라던가 Button, Text 등등 많이 많이 사용하는 중이다.
근데 너무 잘 만들어진 이 컴포넌트들도 사용하다 보면 약간의 변형을 해서 사용해야 할 경우가 있는데 문제는 상속받아와서 직접 커스터마이징 한 파일을 게임오브젝트에 적용을 하면 내가 추가한 변수들이나 요소들이 Inspector에 보여지지 않고 기존의 상속했던 클래스의 인스펙터 내용만 보여지게 된다.

해결책은 파일 하나만 만들어주면 된다.
Assets폴더 안에 Editor폴더를 하나 만들고 원하는 이름으로 파일을 하나 만든다. 이 때 파일 이름은 “커스터마이징 한 클래스의 이름+Editor.cs” 로 만드는게 헷갈리지 않을 것이다.

아래 예제로 작성한 파일의 LevelHandler라는 클래스는 ScrollRect를 상속받아와서 커스터마이징한 파일이다. Inspector의 내용이 기존 ScrollRect의 내용으로 바뀌지 않는데 아래와 같이 해주면 추가한 부분들이 기존 내용 아랫쪽으로 보여지게 된다.

파일 내용은 다음과 같이 작성하면 된다.

중요한건 3번째 줄 부분이다.
[CustomEditor(typeof(커스터마이징 한 클래스))]

(추가하기 전 Inspector 모습)

%ec%8a%a4%ed%81%ac%eb%a6%b0%ec%83%b7-2016-10-24-%ec%98%a4%ed%9b%84-4-32-52

(추가 후 Inspector 모습)

%ec%8a%a4%ed%81%ac%eb%a6%b0%ec%83%b7-2016-10-24-%ec%98%a4%ed%9b%84-4-33-19

기존 내용의 아랫쪽으로 내가 추가 한 내용들이 보여지는 것을 확인 할 수 있다.

반응형
반응형

프로젝트 진행하면 꼭 사용하는 Singleton 형태의 파일을 만드는 경우가 생기는데
이 Singleton을 간단하게 만들어주는 방법이다.

 

Singleton을 만들때는 이렇게만 해주면 된다.

참조 : http://sillyknight.tistory.com/30

반응형
반응형

 
 
 
 
 
 
C#
 
 

 

 
1
2
3
4
void AutoFocusOn()
{
     CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
}

 

매니페스트 수정

<uses-permission android:name=”android.permission.CAMERA” />
: 카메라를 사용할 것이다

<uses-feature android:name=”android.hardware.camera” />
:카메라의 특수기능을 사용할 것이다

<uses-feature android:name=”android.hardware.camera.autofocus” />
:카메라 오토포커싱을 사용할 것이다

 

뷰포리아가 Init된 이후의 타이밍에 호출되어야 함.

 

출처 : http://qits.tistory.com/entry/뷰포리아-오토포커싱-활성화하기

반응형
반응형

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

먼저 간략하게 요약해보자면…
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

반응형
반응형

에셋스토어에 Bitmap Drawing 이라고 검색하면 무료로 올라와있다.
텍스쳐에 실시간으로 원하는 그림을(?) 그릴 수 있게 도와주는 API이다.
사용법은 에셋을 Import시키고 Example파일을 참고하면된다.

 

반응형
반응형

[요약]

1. Eclipse 에서 안드로이드 프로젝트 세팅

2. Java 코드작성 및 jar파일로 Exporting

3. AndroidManifest.xml 수정

4. Unity 프로젝트 생성 및 코드작성

 

 

 
 
 
1. Eclipse 에서 안드로이드 프로젝트 세팅하기
 
– file>new>Project 를 눌러 들어간 후
 
Android Application Project를 선택 후 Next 버튼을 누름.
 
Application Name은 원하는 이름으로 넣고,
마지막 Theme는 사용하지 않으므로 None으로 선택한다.
 
Create custom launcher icon 및 Create activity 둘다 체크 해제한다.
 
src폴더에서 마우스 우클릭 후
 
 
package 이름을 맞춰서 작성해준다.
 
 
작성한 페키지 네임에서 마우스 우클릭후 클래스를 만든다.
 
 
 
Unity3D와 연결을 위해서는 유니티에서 제공하는 Classes.jar파일을 라이브러리에 넣어줘야함.
Unity.app 우클릭 후 패키지보기 클릭.
위치는 아래와 같다.(5.1.X 기준)
 
classes.jar 파일을 복사해서 만들어놓은 아래에 넣어줌.
 
프로젝트에서 우클릭 Properties로 들어가 Java Build Path > Libraries 탭으로 이동한다.
 
우측에 보이는 Add JARs…을 눌러 아까 복사한 파일을 뷸드패스에 추가한다.
 
 
 
 
2. Java 코드작성 및 jar파일로 Export.
 
기본적으로 유니티와 연결하기 위해 UnityPlayerActivity를 Extends해주고,
원하는 펑션을 만든다.
아래는 토스트팝업을 띄우는 코드를 작성함.

 

코드작성이 끝났다면 src폴더 위에서 우클릭 후 Export를 눌러준다.
 
Java > JAR file를 선택해 준다
위사진처럼 세팅후 적당한 곳에 파일을 저장한다.
 
 
 
3. AndroidManifest.xml 수정

 

일단 저장해 두었던 jar파일과 함께 같은곳에 저장함.
 
 
 
 
 
4. Unity 프로젝트 생성 및 코드작성
 
 
새프로젝트를 만들어서 그림과같이 폴더를 생성한 후 앞서 만들었던 jar파일과 수정한 AndroidManifest.xml파일을 복사해 넣는다.
 
Build Settings에 들어가서 Platform을 Android로 바꿔준 후
Player Settings로 들어가서 Bundle Identifier를 Java파일 작성 시 Package name과 똑같이 맞춰준다.
 
 
 
AndroidManager.cs 파일을 만들어 다음과같이 작성한다.

 

사용법은 요렇게 사용하면됨.
 
AndroidManager.GetInstance().AndroidCall(“OpenToastMSG”,”Hello World!”);

 

반응형
반응형

using UnityEngine; 
using UnityEngine.EventSystems; 
using DG.Tweening;   

public class WheelHandler : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler { 	 	
    RectTransform ImgRectTransform;   	
    
    void Start () { 		
        ImgRectTransform = GameObject.Find("Canvas/Wheel/ImageR").GetComponent(); 	
    } 	 	
    
    public void OnPointerDown(PointerEventData e){ 		
        rotateImage(e.position); 	
    } 	 	
    
    public void OnPointerUp(PointerEventData e){ 		
        rotateImage(e.position); 	
    } 	 	
    
    public void OnDrag(PointerEventData e){ 		
        rotateImage(e.position); 	
    } 	 	
    
    protected void rotateImage( Vector2 value ){ 		
        float _x = value.x - Screen.width/2; 		
        float _y = value.y - Screen.height/2; 		
        float _R; 		 		
        if(_x > 0){ 			
            _R = (Mathf.Atan(_y/_x) * Mathf.Rad2Deg); 		
        }
        else
        { 			
            _R = (Mathf.Atan(_y/_x) * Mathf.Rad2Deg) + 180; 		
        } 		 		
        
        ImgRectTransform.DORotate(new Vector3(0f,0f,_R),0.1f,RotateMode.Fast); 		 	
    } 
} 

 

반응형

+ Recent posts