- XR 챌린지 결선 진출작
- 활의 모델링, 리깅, 활쏘기 까지 직접구현
- 활쏘기를 체험하는 씬과 활 관련 내용을 학습하는 씬을 따로 만들어 교육적인 내용 추가
- 손의 자연스러운 애니메이션 구현
- steamVR의 playerPrefab을 사용하지 않고 직접 잡기, 놓기 등의 인터렉션 구현
- 잊혀져가는 전통문화 ‘국궁’을 가장 현대적인 기술인 VR을 통해서 더 이상 잊혀가는 전통이 아닌 재미있는 놀이로 다시 우리의 곁으로 돌아오길 바라는 마음으로 기획
//ArrowBlend, BowBlend script 중..
protected float blendToPoseTime = 0.1f;
protected float releasePoseBlendTime = 0.2f;
SteamVR_Skeleton_Poser skeletonPoser;
void Start()
{
skeletonPoser = GetComponent<SteamVR_Skeleton_Poser>();
}
public void OnGripPose(SteamVR_Behaviour_Skeleton skeleton)
{
if (skeletonPoser != null && skeleton != null)
{
Debug.Log("On Pose");
skeleton.BlendToPoser(skeletonPoser, blendToPoseTime);
}
}
public void OffGripPose(SteamVR_Behaviour_Skeleton skeleton)
{
if (skeletonPoser != null)
{
if (skeleton != null)
{
Debug.Log("Off Pose");
skeleton.BlendToSkeleton(releasePoseBlendTime);
}
}
}
기능
- 활, 화살 등의 오브젝트를 잡을 때 미리 설정해 뒀던 포즈를 호출하는 스크립트
특징
- Steam VR에서 Skeleton poser의 일부를 수정하여 사용
- 특정 오브젝트를 잡았을 때 미리 저장해놓은 pose를 호출
//Bow script 중...
public void CreateArrow(string whatHand)
{
//create child
GameObject arrowObject = Instantiate(m_ArrowPrefab, m_Socket);
//orient
arrowObject.transform.localScale /= 6;
arrowObject.transform.localPosition = new Vector3(0, 0, 0);
arrowObject.transform.localEulerAngles = Vector3.zero;
if (whatHand == "Left")
arrowObject.transform.LookAt(rightArrowSetPos);
else if (whatHand == "Right")
arrowObject.transform.LookAt(leftArrowSetPos);
whatIsHand = whatHand;
//set
m_CurrentArrow = arrowObject.GetComponent<Arrow>();
ObjStatus objStatus = arrowObject.GetComponent<ObjStatus>();
objStatus.isGrip = true;
}
- 활을 쏘는 과정 중 첫번째 단계
- 활시위의 Collider를 인식해 화살을 거는 기능
- 지정된 위치에 화살이 생겨나는 방식으로 사용자가 활을 거는 과정을 묘사
//Bow script 중...
private float CalculaterPull(Transform pullHand)
{
Vector3 direction = m_End.position - m_Start.position;
float magnitude = direction.magnitude;
direction.Normalize();
Vector3 diffrence = pullHand.position - m_Start.position;
return Vector3.Dot(diffrence, direction) / magnitude;
}
public void Pull(Transform hand)
{
Debug.Log("Pull");
float distance = Vector3.Distance(hand.position, m_Start.position);
if (distance >= m_GrabThreshold)
return;
PullBackSound.Post(gameObject);
m_PullingHand = hand;
}
- 활 시위를 당기는 함수.
- 활을 들고 있는 손과 화살을 들고 있는 손의 거리값을 계산.
- 당겨진 값의 거리를 return하여 실수 값으로 저장하는 함수.
- 시위를 당기는 생생한 사운드까지 함께 실행
//Bow script 중...
public void Release()
{
Debug.Log("Release");
if (m_PulValue > 0.25f)
{
if(m_CurrentArrow != null)
FireArrow();
RealeseSound.Post(gameObject);
}
m_PullingHand = null;
m_PulValue = 0.0f;
m_Animator.SetFloat("Blend", 0);
//pose
steamVR_Skeleton_Poser.SetBlendingBehaviourValue("ShotPose", m_PulValue);
}
private void FireArrow()
{
InAirSound.Post(gameObject);
m_CurrentArrow.Fire(m_PulValue);
m_CurrentArrow = null;
}
- 활시위를 놓았을 때, 화살이 잘 걸려 있다면 활이 쏘아지는 함수.
- 특정 거리 이상으로 활 시위를 당기지 않는 경우 화살이 날아가지 않는다.
기능
- VR컨트롤러로 게임상 활잡기, 화살잡기, 여러 물체 잡기 등등 기능을 전체적으로 담당하는 스크립트
특징
- Approach와 Grip확인 변수를 따로둬서 Approach된 상태의 오브젝트만 잡을수 있도록 함
- 자세한 내용 설명 URL : https://kunkunwoo.tistory.com/167
개발 기간 : 약 3주 ~ 4주
맡은 역할 : Player 구현, 활쏘기, ox퀴즈, 잡기, 놓기 등의 VR관련 기능 구현