저번 시간에 클로스로 디스크 골대의 움직임을 구현해보려다가 실패했었다. 그래서 이번엔 사슬의 리지드바디를 이용해서 체인의 움직임을 구현해볼 생각이다. 원래 쓰던 골대 프리펩은 사슬부분이 하나의 오브젝트로 되어 있기 때문에 어떻게 해결할지 고민하다가 그냥 블렌더로 체인을 만들어서 쓰기로 했다.
체인을 만든다음 fbx로 export해서 유니티에 추가해주고,
고리를 복사해서 사슬처럼 만들어주었다.
사슬의 리지드바디를 만드는데는 다음 영상을 참고하였다.
https://youtu.be/BrgyMa6Gelk?si=6B2ZCS8jMlUutnmQ
사슬에 리지드바디 힌지조인트 메시콜라이더를 추가해주었다.
힌지조인트는 처음보는 컴포넌트인데 힌지는 한국말로 경첩을 뜻하는 단어로
유니티 메뉴얼을 살펴보니 두 개의 리지드바디를 묶어서 사슬같은 움직임을 구현하는 컴포넌트라고 한다.
사슬 하나를 복사해서 위쪽 체인은 메시콜라이더를 아래쪽엔 메시콜라이더와 힌지 조인트를 추가해주었다 힌지 조인트의 리지드바디 부분엔 바로 위에 있는 체인을 넣어주었다.
힌지조인트에 리지드바디를 넣을때 앵커위치를 자동으로 설정해주는데 내 경우는 앵커 위치가 좀 이상하게 설정되어서 y축으로 0.0125였던 앵커위치를 x축 0.0125로 바꿔 주었다.
그리고 실행시켜보았는데 체인이 위에있는 체인을 무시하고 360도 회전하는 현상이 나타났다 그래서 힌지 조인트에서 limit를 걸어서 체인이 회전하지 않도록 만들었다. 그리고나서 3d 오브젝트로 공을 하나 만들어서 체인과 부딪혔을때 제대로 옆으로 움직이는지 확인해보았다.
그리고 사슬을 좀 더 늘려서 실행해보았는데 문제가 발생했다.
아무래도 사슬의 질량이 너무 커지면서 사슬을 당기는 힘과 원래대로 돌아가려는 힘이 충돌하면서 저런 현상이 발생하는것 같다. 그래서 UseGravity를 비활성화하고 다시 한번 실행해보았다.
이제 디스크골대에 있던 사슬을 지우고 새로 만든 사슬을 붙여 줘야 했는데 새로 만든 사슬은 일직선으로 펴져 있어서 플레이상태에서 사슬의 끝부분을 당겨서 곡선 모양으로 만들어 주었다.
그리고 사슬의 방향과 위치를 조절해서 망을 만들고 사슬의 끝부분을 키네마틱으로 해서 고정시켜주었다.
그리고 원반이 바스킷으로 들어왔을때 아래로 떨어지지 않도록 아래쪽 바스키부분에 콜라이더를 달아주었는데 문제가 발생했다. 바스켓과 체인의 콜라이더가 충돌해서 위에서 본것처럼 체인이 흩어지는 현상이 발생했다. 이 문제를 해결하기 위해서 물체간 충돌무시를 찾아보았는데 Physics.IgnoreLayerCollision을 사용해서 체인과 바스킷사이의 충돌을 무시하기로 했다.
먼저 Basket과 Chain레이어를 만들어서 각각 레이어설정을 해주었다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Chain : MonoBehaviour
{
public string ignoredLayer = "Basket";
[SerializeField]
private GameObject[] links;
private void Start()
{
Physics.IgnoreLayerCollision(gameObject.layer, LayerMask.NameToLayer(ignoredLayer), true);
}
}
그리고 체인에 체인스크립트를 달아서 레이어무시를 통해 바스킷과 체인이 충돌하지 않도록 만들었다.
'VR 콘텐츠 제작' 카테고리의 다른 글
디스크 골프 [#8] - 터레인으로 맵 만들기 (0) | 2023.11.27 |
---|---|
디스크 골프 [#7] - 디스크 골대 힌지 조인트 적용하기 (1) | 2023.11.23 |
디스크 골프 [#5] - 디스크 골대 애니메이션 (0) | 2023.11.20 |
디스크 골프 [#4] - 프리스비 운동 R&D (0) | 2023.11.15 |
디스크 골프 [#3] - 프리스비 운동 R&D (0) | 2023.11.13 |