[ Vuforia Developer 가입하기 ]
사이트 가입
https://developer.vuforia.com/
사이트에 Register하기
라이센스 키 만들기
Develop >> License Manager : GetDevelopment Key
Target Manager 만들기
Develop >> Target Manager : Add Database
Name : 원하는 이름
Type : Device
Add Target : Single Image
Target Image(Database) 다운로드
Develop >> Target Manager >> (Database)선택
Download Database(All)
선택 창에서 Unity 선택
unitypackage 파일을 다운 받게 됨
[ Unity App이 구동될 수 있도록 환경 구성하기 ]
https://sites.google.com/site/unity3dstudy/home/test2/smartphone/-androidgaebalhwangyeong-guseong
[ 안드로이드(Android) SDK 설치 하기 & Unity 연동 ]
[ Vuforia 예제 샘플 Import ]
Vuforia Unity용 Package 다운로드
https://assetstore.unity.com/packages/templates/packs/vuforia-core-samples-99026
Unity(249.65 MB) Sample Package 다운로드 및 압축 풀기
Unity Project에 Package Import
Unity에서 빈 Project 생성
Unity Menu : Assets >> Import Package >> Custom Package
Sample Package의 압축을 푼 곳에서 imagetargets-3-0-10.unitypackage 선택 후 Import 선택
Project View 내의 Assets 폴더내에 새로운 폴더(파일)들이 생겨난 것을 확인 할 수 있음
Project View >> Assets >> Scenes 폴더 내의 Vuforia-ImageTarget 씬을 Open
씬의 내의 다양한 GameObject들을 확인할 수 있음
Android Apk 파일 생성
Unity3D에서 Android SDK를 제대로 import했는지를 확인
Edit >> Preferences
External Tools >> Android SDK Location : SDK 설치된 위치 설정
잘못된 경우 "안드로이드(Android) SDK 설치 하기 & Unity 연동" 부분 다시 확인 해보기
Android Build를 위한 세팅
File >> Build & Settings ... 클릭 후
참고 : Build Settings ...
Add Scene
실행할 Scene들을 모두 불러옴
Platform 처리
Android 플랫폼 선택 후 Switch Platform 클릭
Player Settings ... 클릭
Play Settings .. Android를 위한 간단 세팅
Other Settings
Identification : Bundle Identifer : 알아서 넣을 것.
Minimum API Level : 최소 Android 4.1 이상으로 하자.
XR Settings - Vuforia 사용 체크
Vuforia Augmented Reality 체크 확인
[ 새로운 프로젝트 작업 ]
File >> New Project
Project Name : MyAR01
Create Project 클릭
Project View : Assets 오른쪽 클릭으로 폴더 만들기
Prefabs
Scripts
Animators
[ Unity에서 사용할 Vuforia 기본 세팅 ]
Android Build를 위한 세팅
위에 있는 내용 참고
Menu : GameObject >> Vuforia >> AR Camera
Vuforia에 필요한 몇 가지 애셋을 import할 건지를 물어 보면 ... import
AR Camera : Inspector >> Vuforia Behaviour : Open Vuforia configuration 클릭
라이센스 키 복사
위에서 만든 개발자 라이센스를 App License Key에 삽입
Target Image 불러오기
위에서 다운로드한 Database(Target Image) 를 import : Database 파일이 unitypackage 파일
StreamingAssets폴더 확인 / Vuforia Configuration : Database에 Database 이름 확인
Menu : GameObject >> Vuforia >> Image (ImageTarget 오브젝트가 생성됨)
ImageTarget Inspector >> Image Target Behaviour
Type : Predefined
Database : 우리가 만들어 놓은 Database와 이름이 일치하는지 확인
Image Target : 여러 이미지가 등록되어 있다면, 원하는 이미지를 선택
GameObject 띄우기
GameObject >> 3D Object >> Sphere
이미지의 상대적인 위치 및 크기를 생각하여 크기 및 위치 조정
AR Test
Play Settings ... >> Bulid
Apk 파일 설치
[ Android EScape 키 사용하기 ]
안드로이드에서 제공하는 Escape 버튼을 사용해서 App 종료하기
GameObject >> Create Empty
Name : GameController
Project >> Assets>> Script 폴더 우클릭 >> Create >> C# Script
Name : GameControl
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameControl : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update()
{
if(Application.platform == RuntimePlatform.Android)
{
if(Input.GetKey(KeyCode.Escape))
{
//
Application.Quit();
}
}
}
}
GameControl(Script) =>(드래그) GameController(게임오브젝트)
Prefab으로만들기
Prefabs 폴더로 옮기기
[ 3D Model Data 띄우기 ]
Asset store에서 캐릭터 2개 받아오기
기존에 만들었던 "Sphere" 대신에 Sci Fi Hero HandPainted에서 다운 받은 전사로 대치하기
Project View : SciFiFighter : Prefabs : DefaultMesh_Free 드래그 >> (to) ImageTarget
적당한 크기와 적당한 위치로 옮김
Name 변경 : DefaultMesh_Free >> Robot
ImageTarget을 이용해서 또 다른 이미지 띄우기
Menu : GameObject >> Vuforia >> Image (ImageTarget 오브젝트가 생성됨)
ImageTarget Inspector >> Image Target Behaviour
Type : Predefined
Database : 우리가 만들어 놓은 Database와 이름이 일치하는지 확인
Image Target : 여러 이미지가 등록되어 있다면, 원하는 이미지를 선택
Project View : RainEntertainment : FantasyMonster2 : Elf Archer Pack : Prefabs : VelluaArcher_C_SKEL 드래그 >> (to) ImageTarget
적당한 크기와 적당한 위치로 옮김
Name 변경 : VelluaArcher_C_SKEL >> Archer
두 타깃을 동시에 인식할 수 있도록 하기
ARCamera Inpspector : Open Vuforia Configuration 클릭
Vuforia Configuration : global : Max Simultaneous Track Images >> 2이상으로 변경
AR Test
Play Settings ... >> Bulid
Apk 파일 설치
[ 충돌체크를 위한 Raycast 사용 ]
project View의 Scripts 폴더 : 오른쪽 마우스 클릭 >> Create >> C#
Name : RayCast
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RayCast : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
RaycastHit hit;
//부딛치는 물체의 정보를 담는 변수 hit 선언
Vector3 forward = transform.TransformDirection(Vector3.forward)*1000;
Debug.DrawRay(transform.position, forward, Color.green);
if(Physics.Raycast(transform.position, forward, out hit)) {
Debug.Log ("hit");
}
}
}
참고 : [ Ray / RayCast ]
RayCast(Script) 드래그 >> (to) Robot and (to) Archer
Play Test
녹색선이 캐릭터 앞으로 나오는 것을 볼 수 있음
[ Collider 생성하기 ]
Robot Inspector >> Add Component
Capsule Collider 추가 (Box Collider로 해도 상관없음)
적당하게 크기를 맞추고 이동시킴
Archer Inspector >> Add Component
Capsule Collider 추가 (Box Collider로 해도 상관없음)
적당하게 크기를 맞추고 이동시킴
play Test
Raycast의 방향에 캐릭터가 놓일 경우 Console 창에 "hit"라고 표시되어야 함
[ 캐릭터 애니메이션 조정하기 ]
기존에 들어 있는 Robot / Archer의 애니메이션 상태 확인해 보기
Animator 창을 열고 확인해 봄 ( Window >> Animation >> Animator )
Robot의 애니메이션 설정하기
Project View : Animator 폴더 내에서 오른쪽 마우스 클릭
Create >> Animator Controller
Name : Robot
Robot(Animator Controller) 더블 클릭
Animator Window가 열림
Project View : SciFiFighter : Animations : idle_gunMiddle_ar(anim 클립) 드래그 >> (to) Animator Window
Robot(Animator) 드래그 >> (to) Robot Inspector : Animator : Controller
Archer의 애니메이션 설정하기
Project View : Animator 폴더 내에서 오른쪽 마우스 클릭
Create >> Animator Controller
Name : Archer
Archer(Animator Controller) 더블 클릭
Animator Window가 열림
Project View : RainEntertainment : FantasyMonster2 : Elf Archer Pack : Motion : ElfArcher_Stand(anim 클립) 드래그 >> (to) Animator Window
Archer(Animator) 드래그 >> (to) Archer Inspector : Animator : Controller
Play Test
Idle 시간에 발생하는 애니메이션이 구동되는지 확인
애니메이션 Loop가 실행되지 않는 경우 anim clip을 더블 클릭해서 Loop를 체크할 수 있도록 함
[ 다양한 애니메이션 상태값 표현 ]
Robot의 Attack 애니메이션 상태 넣기
Project View : SciFiFighter : Animations : shoot_single_ar(anim 클립) 드래그 >> (to) Animator Window
상태가 전이될 수 있도록 하기
Animator Menu : idle_gunMiddle_ar(State) >> make Transition >> shoot_single_ar(State)
Animator Menu : shoot_single_ar(State) >> make Transition >> idle_gunMiddle_ar(State)
상태 전이가 발생할 수 있도록 조건 걸기
Animator Menu : Parameters >> Bool
isHit (bool 변수 이름 생성)
Animator Menu : [ idle_gunMiddle_ar--> shoot_single_ar] Click
Conditions : isHit / true 조건 추가
Animator Menu : [ shoot_single_ar--> idle_gunMiddle_ar] Click
Conditions : isHit / fasle 조건 추가
Archer의 Attack 애니메이션 상태 넣기
Project View : RainEntertainment : FantasyMonster2 : Elf Archer Pack : Motion: ElfArcher_Attack1(anim 클립) 드래그 >> (to) Animator Window
상태가 전이될 수 있도록 하기
Animator Menu : ElfArcher_Stand(State) >> make Transition >> ElfArcher_Attack1(State)
Animator Menu : ElfArcher_Attack1(State) >> make Transition >> ElfArcher_Stand(State)
상태 전이가 발생할 수 있도록 조건 걸기
Animator Menu : Parameters >> Bool
isHit (bool 변수 이름 생성)
Animator Menu : [ ElfArcher_Stand--> ElfArcher_Attack1] Click
Conditions : isHit / true 조건 추가
Animator Menu : [ ElfArcher_Attack1--> ElfArcher_Stand] Click
Conditions : isHit / fasle 조건 추가
RayCast (Scritp) 로 상태 변화 전하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RayCast : MonoBehaviour
{
Animator anim;
// Start is called before the first frame update
void Start()
{
anim = transform.GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
RaycastHit hit;
//부딛치는 물체의 정보를 담는 변수 hit 선언
Vector3 forward = transform.TransformDirection(Vector3.forward)*1000;
Debug.DrawRay(transform.position, forward, Color.green);
if(Physics.Raycast(transform.position, forward, out hit)) {
Debug.Log ("hit");
anim.SetBool("isHit", true);
} else {
anim.SetBool("isHit", false);
}
}
}
Play Test
ImageTarget을 방향전환에서 Raycast가 발생할 경우 상태 전이가 이뤄지는지 확인
[ 캐릭터의 Death 애니메이션 상태 추가하기 ]
Robot의 death 애니메이션 상태 넣기
Project View : SciFiFighter : Animations : die_back_rest(anim 클립) 드래그 >> (to) Animator Window
상태가 전이될 수 있도록 하기
Animator Menu : idle_gunMiddle_ar(State) >> make Transition >> die_back_rest(State)
Animator Menu : shoot_single_ar(State) >> make Transition >> die_back_rest(State)
상태 전이가 발생할 수 있도록 조건 걸기
Animator Menu : Parameters >> Bool
isDead (bool 변수 이름 생성)
Animator Menu : [ idle_gunMiddle_ar--> die_back_rest] Click
Conditions : isDead / true 조건 추가
Animator Menu : [ shoot_single_ar--> die_back_rest] Click
Conditions : isDead / true 조건 추가
Archer의 death 애니메이션 상태 넣기
Project View : RainEntertainment : FantasyMonster2 : Elf Archer Pack : Motion: ElfArcher_Death(anim 클립) 드래그 >> (to) Animator Window
상태가 전이될 수 있도록 하기
Animator Menu : ElfArcher_Stand(State) >> make Transition >> ElfArcher_Death(State)
Animator Menu : ElfArcher_Attack1(State) >> make Transition >> ElfArcher_Death(State)
상태 전이가 발생할 수 있도록 조건 걸기
Animator Menu : Parameters >> Bool
isDead (bool 변수 이름 생성)
Animator Menu : [ ElfArcher_Stand--> ElfArcher_Death] Click
Conditions : isDead / true 조건 추가
Animator Menu : [ ElfArcher_Attack1--> ElfArcher_Death] Click
Conditions : isDead / true 조건 추가
RayCast (Scritp) 로 상태 변화 전하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RayCast : MonoBehaviour
{
Animator anim;
public int atkPnt;
public int hltPnt;
float timeElapsed;
// Start is called before the first frame update
void Start()
{
anim = transform.GetComponent<Animator>();
atkPnt = 200;
hltPnt = 5000;
}
// Update is called once per frame
void Update()
{
RaycastHit hit;
//부딛치는 물체의 정보를 담는 변수 hit 선언
Vector3 forward = transform.TransformDirection(Vector3.forward)*1000;
Debug.DrawRay(transform.position, forward, Color.green);
if(Physics.Raycast(transform.position, forward, out hit)) {
Debug.Log ("hit");
anim.SetBool("isHit", true);
timeElapsed = timeElapsed + Time.deltaTime;
if(timeElapsed >=3 ) {
hit.transform.GetComponent<RayCast>().hltPnt = hit.transform.GetComponent<RayCast>().hltPnt - atkPnt;
timeElapsed = 0;
}
} else {
anim.SetBool("isHit", false);
}
if(hltPnt <=0) {
anim.SetBool("isDead", true);
}
}
}
Play Test (폰에 심어서 테스트 해보기)
캐릭터가 서로 싸우고 Dead 애니메이션까지 나오는지 확인