Unity Engine2012.08.22 14:40

물체 사이의 거리를 구하는 간단한 방법을 설명하겠습니다.


우선, 힘겹게 "그림판"으로 완성 된 아래 이미지 부터 보시죠.

(허접하다는게 반전)



① 두 물체 사이의 거리


  구하는  방법은 아주 간단합니다. Unity 에서 Scene 내에 존재하는 모든 GameObject 들은 각각 transform 을 기본적으로 가지고 있기 때문에 두 transform 사이의 거리를 계산하면 됩니다.

  Transform 에는 world space 상에서의 transform 의 위치를 나타내는 Vector3형의 position 값이 존재합니다. 위 이미지 상에서 (0,0,0) , (4,5,0) 이 바로 이 값이죠. 

  그럼, 두 position 을 이용 해 어떻게 거리를 구할까요?

  피타고라스의 정리를 통해 (4*4 + 5*5) 의 제곱근을 구하는 코드를 구현할까요? 아, 물론 그렇게 하면 두 물체 사이의 거리가 나옵니다. 하지만, Vector3 에서 제공하는 함수 중에 Distance 라는 함수가 있어, 좀 더 편하게 코드를 구현하실 수 있습니다.



return Vector3.Distance(PlaneObj.transform.position, SphereObj.transform.position);


  이렇게 하면 두 물체 사이의 거리를 구할 수 있습니다.



② 평면과 물체 사이의 거리


  그렇다면, 평면과 물체 사이의 거리는 어떻게 구할까요?


  Unity 에서 제공하는 Plane (struct) 을 이용하면 간단히 해결 하실 수 있습니다. -① 번 보단 덜 간단하지만-

  방법은, Plane 객체를 생성해서 Plane 에서 제공하는 GetDistanceToPoint 함수를 통해 Sphere 객체와의 거리를 구하면 됩니다.

  Plane 객체를 생성시 3D 평면의 정의와 똑같이 생성자를 요구합니다. (법선 벡터 N이 가리키는 방향과 수직이며 점P를 지나는 점 Q들의 집합.. 뭐 대충 이런;;). 위 경우에는 법선 벡터 N을 Plane 객체와 수직인 PlaneObj.transform.up 으로 지정, 점 P는 PlaneObj.transform.position 가 되겠죠.



Plane plane = new Plane(PlaneObj.transform.up, PlaneObj.transform.position);

return plane.GetDistanceToPoint(SphereObj.transform.position);


  이렇게 하면 평면과 한 물체 사이의 거리를 구하실 수 있습니다.


  (아! 위 이미지에서 평면과 물체 사이는 5 - 0 값인 5가 맞습니다. 쉽게 설명 드리기 위해서 position 을 설정했기 때문에 위와 같은 코드가 의미가 없어 보일 수도 있습니다만, position 도 다양할 수 있고 평면의 rotate 또한 x,y,z 어떤 축으로든 다양하게 설정 될 수 있겠죠. 그럴 때에는 위와 같은 코드가 상당히 의미 있게 사용 될 수 있습니다 ^^) 



Posted by Min-gu, Kim
Unity Engine2012.07.26 18:44

이번 포스팅은 정말 간단한 내용이 되겠네요.


Missing Prefab 복구!!


Unity3D 로 프로젝트를 진행하면서, Prefab 을 많이 만들어서 사용하게 됩니다. (저만 그런 건 아니겠죠?)


제 경우에는 재사용성을 고려해서.. 혹은, 다른 Scene으로 복사하려는 목적으로.. 혹은 Package Import, Export 순으로 다른 프로젝트로 옮길때.. 등등 Prefab 을 만들었다가 다시 Project 뷰에서 Prefab 을 제거하는 경우가 생기더라고요.


헌데 이렇게 연결 된 Prefab 을 삭제하고 나면 Hierarchy 뷰에 있는 GameObject(Prefab 과 연결 되 있던) 가 Prefab 을 Missing 했다면서 빨간색으로 변하게 됩니다. ㅠ.ㅠ 



신경 안쓰고 넘길 수도 있지만, 저는 이게 너무나도 싫어서~(보기 흉해) 방법을 좀 찾아봤습니다. 당연히, Inspector 뷰에서 처리할 수 있는 줄 알았는데 도저히 못찾겠더라고요.


Google 검색 키워드도 제대로 타이핑 할 수 없어 해메다가.. 정말 찾기 쉬운 곳에 해결 방법이 있었습니다. (ㅠㅠ)

바로 GameObject 메뉴에 있더군요.




해결방법!


Missing GameObject 를 Hierarchy 에서 선택 하신 뒤, GameObject > Break Prefab Instance 를 클릭 하면 짜잔~ 정상(White color)으

로 돌아옵니다. 더이상 Missing GameObject 가 아니게 됩니다. 



Posted by Min-gu, Kim
Unity Engine2012.06.27 19:43

Fruit Ninja 를 플레이 해 보시면, 손가락을 사용해 터치 디바이스에 드래그를 하면 칼날을 휘두른 것 같은 효과가 납니다. 물론, Fruit Ninja 뿐만 아니라 많은 스마트폰 디바이스용 어플에서 볼 수 있는 효과입니다. 이것을 어떻게 구현할까 싶어 알아보니, Trail Renderer 를 사용하면 쉽게 구현이 가능하더군요. (Sword 효과라고 명명 된 것은 아니고, 정확히 어떤 명칭을 붙여야 하는지 모르겠어서 그냥 Sword 효과라고 이름을 붙였습니다.)

 

TrailRenderer 는 Unity3D Document 에서 이렇게 설명합니다.

 

"The Trail Renderer is used to make trails behind objects in the scene as they move about."

 

Scene 내에서 GameObject 가 이동 시, 이동한 흔적(Trail)을 남기고자 할 때 사용되는 것이죠.

 

그럼, Sword 효과를 내기 위해 Trail Renderer 를 어떻게 사용하면 될까요?

방법은 아주 간단합니다.

 

1. GameObject 를 두고, Trail Renderer 컴포넌트를 추가

  - Hierarchy 에 Empty GameObject 를 추가. (TrailObject 라고 이름을 변경 했습니다.)

  - 추가 된 GameObject 를 선택하고 Trail Renderer 컴포넌트 추가 (Component - Effects - Trail Renderer) 

 

  - Trail Renderer 컴포넌트의 속성 설정. 

저는 간단히 Material 을 Unity에서 제공하는 Fire Smoke 로 설정하고, Start Width, End Width 만 살짝 바꿔봤습니다. (입맛에 맞게 설정하시면 됩니다.)

 

 

2. Input 클래스를 사용하여 Move 발생 시 마다 GameObject 의 Transform 을 변경

  - Scene 에서 발생하는 이벤트를 처리하기 위한 Script 를 추가. (mainSceneScript.cs)

    + Trail Renderer 컴포넌트가 추가 된 GameObject 를 할당 할 변수 추가

public GameObject TrailObject;

 

    + Inspector 에서 변수 할당 

(MainCamera 도 변수 선언을 해서 할당 했습니다.)

 

 

  - Script 에 터치 이벤트 처리하여 Move 발생 시에 GameObject 의 Transform 변경.

TrailObject.transform.position =
    MainCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 1));

 

 

결과 화면 

 

 

 

요약.

1. GameObject 를 두고, Trail Renderer 컴포넌트를 추가.

2. Input 클래스를 사용하여 Move 발생 시 마다 GameObject 의 Transform 을 변경.

Posted by Min-gu, Kim
Unity Engine/Android2012.06.05 12:40

Eclipse 안드로이드 프로젝트로 만든 Activity 를 Unity3D 에서 Main 으로 사용하기 위해서는 다음과 같은 작업을 필요로 합니다.

 

 

1. 새 프로젝트 생성 후 Activity 파일명 변경

  - Eclipse 에서 File > New  > Android Project 생성 

 

  - 생성 된 Activity.java 파일을 선택 후 Refactor > Rename (F2, Alt+Shite+R) CustomUnityPlayerActivity 로 변경 

 

 

 

2. Unity3D 에서 제공하는 classes.jar 프로젝트에 추가

  - 프로젝트 Properties 에서 Java Build Path 탭 선택 후 Add External JARs... 클릭, classes.jar 파일(Path : 유니티설치폴더\Editor\Data\PlaybackEngines\androidplayer\bin)을 선택. 

 

 

 

3. CustomUnityPlayerActivity.java 파일 설정.

 - UnityPlayerActivity.java 소스 파일(Path : 유니티설치폴더\Editor\Data\PlaybackEngines\androidplayer\src\com\unity3d\player) 의 내용을 CustomUnityPlayerActivity.java 에 그대로 복사 (onKeyDown, onKeyUp 등 Activity 메서드가 실행 될 때 UnityPlayer 객체에도 전달 되도록 코드 되 있다.)

 - package명, Activity명 설정, import com.unity3d.player.UnityPlayer 추가. 

 

 

 

4. CustomUnityPlayerActivity.java 파일 선택 후 JAR File 로 Export. 

 

 

 

/** 이제 Unity tool 에서 작업 */

 

5. Unity에서 새 프로젝트 생성 후 Eclipse 에서 Export 된 JAR 파일 복사 (Path : Assets/Plugins/Android)

  - New Unity Project 생성 후 Build Setting 에서 Android platform 으로 switch 후 패키지명 설정 (eclipse 와 동일하게) 

 

  - 4. 에서 Export 된 AndroidPlugin.jar 파일을 Assets/Plugins/Android 에 복사  

 

6. AndroidManifest.xml 생성 후 프로젝트 내 복사

  - 빌드 후 생성 되는 Temp 폴더 내 StagingArea 폴더에서 AndroidManifest.xml 추출하여 (Path : 유니티프로젝트 폴더\Temp\StagingArea) 다음과 같이 수정 

 

  - Assets/Plugins/Android 에 복사 

 

위와 같은 작업을 해 준 뒤에는 Eclipse 에서 Activity 내용이 변경 될 때마다 java 파일을 Export 하여, Unity Project 내에서 jar 파일만 새로 Export 된 파일로 변경 해 주면 됩니다.

 

 

 

* 요약 *

[ Eclipse 내에서 작업 ]

  1. 새 프로젝트 생성 후 Activity 파일명 변경

  2. Unity3D 에서 제공하는 classes.jar 프로젝트에 추가

  3. CustomUnityPlayerActivity.java 파일 설정.

  4. CustomUnityPlayerActivity.java 파일 선택 후 JAR File 로 Export.

[ Unity3D 내에서 작업 ]

  5. Unity에서 새 프로젝트 생성 후 Eclipse 에서 Export 된 JAR 파일 복사 (Path : Assets/Plugins/Android)

  6. AndroidManifest.xml 생성 후 프로젝트 내 복사

Posted by Min-gu, Kim
Unity Engine/TStore2012.05.30 11:28

참고) TStore - ARM V3.2 (2012.05.22)

 

1. Eclipse 새 프로젝트 생성 후 CustomUnityPlayerActivity 사용하도록 작업.

 

2. ARM Library (jar) 파일 및 libARMPlugin.so 파일 설치

- Android SDK r17 이상 ADT를 사용하는 경우

  1) Eclipse 프로젝트에 "libs" 폴더를 생성하여 ARMPlugin.jar 파일 복사

  2) "libs" 폴더 하위에 "armeabi" 폴더를 생성하여 libARMPlugin.so 파일 복사

  3) "libs" 폴더 하위에 "armeabi-v7a" 폴더를 생성하여 libARMPlugin.so 파일 복사

 

- Android SDK r16 이하 ADT를 사용하는 경우 

  1) Eclipse 프로젝트에 "lib" 폴더를 생성하여 ARMPlugin.jar 파일 복사

  2) Eclipse 프로젝트에 "libs" 폴더를 생성

  2) "libs" 폴더 하위에 "armeabi" 폴더를 생성하여 libARMPlugin.so 파일 복사

  3) "libs" 폴더 하위에 "armeabi-v7a" 폴더를 생성하여 libARMPlugin.so 파일 복사

 

3. Java Build Path 설정 후 ARM 연동 코드 작성 

  1) Project 속성의 Java Build Path에서 Add JARs.. 로 ARMPlugin.jar 파일을 추가.

  2) 연동 코드는 TStore - ARM V3.2 (2012.05.22) 참고

    - ArmListener 델리게이트 구현.

    - ArmManager 객체 생성 후. 객체.ARM_Plugin_ExecuteARM(String ApplicationID) 호출

    - onArmResult 메서드 내에서 ARM 결과 처리 (SERVICE_CONNECT, SERVICE_FAIL, SERVICE_NOT_EXIST)

      SERVICE_CONNECT : ARM 인증 성공

      SERVICE_FAIL , SERVICE_NOT_EXIST : ARM 인증 실패 (실패시 finish 메서드 호출을 통해 Application 강제 종료)

 

4. CustomUnityPlayerActivity 내보내기 후 Unity3D 프로젝트에 적용

  - 내보내기(Export) 

    1) 코드가 작성 된 Java 파일 선택 후 우클릭 Export

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    2) export 될 jar 파일명(path포함) 입력 후 finish

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  - Unity3D 프로젝트에서 Asset 설정. Project 에 다음과 같이 파일들을 배치.

    반드시 패스 일치. (폴더명 일치) Plugins/Android, Plugins/Android/libs

 

요약)

1. Eclipse 새 프로젝트 생성 후 CustomUnityPlayerActivity 사용하도록 작업.

2. ARM Library (jar) 파일 및 libARMPlugin.so 파일 설치

3. Java Build Path 설정 후 ARM 연동 코드 작성

4. CustomUnityPlayerActivity 내보내기 후 Unity3D 프로젝트에 적용

 

'Unity Engine > TStore' 카테고리의 다른 글

Application DRM (ARM) 플러그인 만들기  (0) 2012.05.30
Posted by Min-gu, Kim

티스토리 툴바