V05. 가상 버튼(Virtual Button)
장치 데이터베이스에 등록된 이미지 대상을 이용하여 가상 버튼을 만들고 가상 버튼에 손을 가져다 놓으면 오브젝트의 애니메션이 동작하도록 합니다.
1. 장치 데이터베이스 작업하기
1.1 새 장치 데이터베이스 생성
1.2 장치 데이터베이스 및 해당 대상의 세부 정보 보기
1.3 장치 데이터베이스에 대상 추가
1.4 장치 데이터베이스에서 대상을 다운로드하기
1.5 데이터베이스를 Unity로 Import하기
2. 프로젝트에 장치 데이터베이스 작업 연동하기
2.1 이미지 대상 만들기
2.2 오브젝트 만들기
=> V02. 장치 데이터베이스(Device Databases) 참고
3. 가상버튼 만들기
① Hierachy 창에서 ImageTarget 선택한 후 Inspector 창에서 Image Target Behaviour 속성에서 Add Target Representation 버튼을 클릭하면 Hierachy 창에 ImageTarget 이름(여기서는 Astronaut Target Representation)의 오브젝트가 자동 추가되고, 이름을 VirtualButtonWave로 변경합니다.
② Hierachy 창에서 VirtualButtonWave 선택한 후 크기와 위치를 이미지 글자 위치와 크기에 맞게 조정합니다.
Position(-0.0018, 0.001, -0.05006402)
Scale(0.06289732, 1, 0.0124259)
③ Hierachy 창에서 VirtualButtonWave 선택한 후 인스펙터 창에서 Add Component 버튼을 클릭하여 Virtual Button Behaviour 컴포넌트를 추가하고, Name은 wave를 입력, Sensitivity Setting은 HIGH을 설정합니다.
④ Hierachy 창에서 VirtualButtonWave 선택한 후 인스펙터 창에서 Mesh Filter를 삭제하면 VB-Plane으로 변경됩니다.
⑤ Assets폴더에 VirtualButtons 폴더하위에 Materials폴더를 만들고 VirtualButtonOpaqueMatrial와 VirtualButtonTransparentMatrial를 생성합니다.
⑥ Hierachy 창에서 VirtualButtonWave의 머리티얼을 VirtualButtonOpaqueMatrial로 설정합니다.
4. 가상버튼 동작하기
① Hierachy 창에서 Astronaut 를 선택하고 Astronaut.cs 스크립트를 설정합니다.
Astronaut.cs
using System;
using UnityEngine;
using System.Collections;
public class Astronaut : MonoBehaviour
{
const string ANIMATION_IS_WAVING = "IsWaving";
protected Animator mAnimator;
public Action OnEnterEvent = delegate { };
public Action OnExitEvent = delegate { };
public virtual void Start()
{
mAnimator = GetComponent<Animator>();
StartCoroutine(WaitForThen(1.0f, OnEnter));
}
bool IsWaving
{
get => mAnimator.GetBool(ANIMATION_IS_WAVING);
set => mAnimator.SetBool(ANIMATION_IS_WAVING, value);
}
public void OnEnter()
{
OnEnterEvent.Invoke();
}
public void OnExit()
{
IsWaving = false;
}
public void HandleVirtualButtonPressed()
{
IsWaving = true;
}
public void HandleVirtualButtonReleased()
{
IsWaving = false;
}
IEnumerator WaitForThen(float waitSeconds, Action action)
{
yield return new WaitForSeconds(waitSeconds);
action();
}
}
② Hierachy 창에서 ImageTarget 를 선택하고 VirtualButtonEventHandler.cs 스크립트를 설정합니다.
using System.Collections;
using UnityEngine;
using UnityEngine.Events;
using Vuforia;
public class VirtualButtonEventHandler : MonoBehaviour
{
public Material VirtualButtonDefault;
public Material VirtualButtonPressed;
public float ButtonReleaseTimeDelay;
public UnityEvent OnVirtualButtonPressed = new UnityEvent();
public UnityEvent OnVirtualButtonReleased = new UnityEvent();
VirtualButtonBehaviour[] mVirtualButtonBehaviours;
void Awake()
{
mVirtualButtonBehaviours = GetComponentsInChildren<VirtualButtonBehaviour>();
for (var i = 0; i < mVirtualButtonBehaviours.Length; ++i)
{
mVirtualButtonBehaviours[i].RegisterOnButtonPressed(OnButtonPressed);
mVirtualButtonBehaviours[i].RegisterOnButtonReleased(OnButtonReleased);
}
}
void Destroy()
{
mVirtualButtonBehaviours = GetComponentsInChildren<VirtualButtonBehaviour>();
for (var i = 0; i < mVirtualButtonBehaviours.Length; ++i)
{
mVirtualButtonBehaviours[i].UnregisterOnButtonPressed(OnButtonPressed);
mVirtualButtonBehaviours[i].UnregisterOnButtonReleased(OnButtonReleased);
}
}
public void OnButtonPressed(VirtualButtonBehaviour vb)
{
Debug.Log("OnButtonPressed: " + vb.VirtualButtonName);
SetVirtualButtonMaterial(VirtualButtonPressed);
StopAllCoroutines();
OnVirtualButtonPressed?.Invoke();
}
public void OnButtonReleased(VirtualButtonBehaviour vb)
{
Debug.Log("OnButtonReleased: " + vb.VirtualButtonName);
SetVirtualButtonMaterial(VirtualButtonDefault);
StartCoroutine(DelayOnButtonReleasedEvent(ButtonReleaseTimeDelay));
}
void SetVirtualButtonMaterial(Material material)
{
for (var i = 0; i < mVirtualButtonBehaviours.Length; ++i)
{
if (material != null)
mVirtualButtonBehaviours[i].GetComponent<MeshRenderer>().sharedMaterial = material;
}
}
IEnumerator DelayOnButtonReleasedEvent(float waitTime)
{
yield return new WaitForSeconds(waitTime);
OnVirtualButtonReleased?.Invoke();
}
}
③ Hierachy 창에서 ImageTarget 를 선택한 후 인스펙터 창에서 VirtualButtonDefault 속성에 VirtualButtonOpaqueMatrial 머티리얼을 설정하고 VirtualButtonPressed 속성에 VirtualButtonTransparentMatrial을 설정합니다.
④ OnVirtualButtonPressed() 에 Astronaut 오브젝트를 설정한 후 Astronaut=> HandleVirtualButtonPressed() 메서드를 설정합니다.
⑤ OnVirtualButtonReleased() 에 Astronaut 오브젝트를 설정한 후 Astronaut=> HandleVirtualButtonReleased() 메서드를 설정합니다.
실행하기