XR플밍 - 12. UnityEngine3D 네트워크 프로그래밍 - 네트워크 프로젝트 Round5 3일차 (7/24)

이형원·2025년 7월 24일
0

XR플밍

목록 보기
144/215

1. 금일 한 업무 정리

어제 저녁 이후로 한 작업을 빼고 오늘 대부분은 맵 제작 작업에 착수했다.

  • 맵 2, 3, 4 - 총 3종 추가

  • 로프 관련 R&D 다시 진행

맵 2

맵3

맵4

2. 문제의 발생과 해결 과정

아무래도 그냥 맵을 만드는 거에 하루종일을 쏟았다 보니 문제라기 보단, 그냥 노가다였다.

다만 세 번째 맵에서의 공과 관련된 기믹을 구현하는 과정에서 문제가 발생했다.

2.1 로프 관련 R&D 다시 진행

로프 시스템을 이미 테스트 완료하기는 했지만, 이와 같이 오브젝트 기믹을 만들어 달라는 요청을 받았다.

하지만 기존에 테스트한 로프 시스템으로는 해당 기믹을 만들어내는 것이 불가능하다는 것을 알게 되었다.
이유는 다음과 같다.

  1. 로프의 자연스러움을 위해 각도 제한을 두었는데, 이것 때문에 사선으로 된 줄을 만들려고 하면 의도한 대로 줄이 끊어지면 흘러내리지 않음
  2. 로프의 각도를 돌리면, 물리 또한 그와 같은 방향으로 변환됨.

이와 같은 문제로, 다시 다른 방식으로 로프를 구현해야 함을 알았다.

그리고 다시 다른 방법을 참고하기 위해 찾아본 결과, 아주 좋은 예시로 참고할 만한 방법을 찾았다.

https://www.youtube.com/watch?v=VaRna1C8tmQ&t=13s

로프 끊기 게임에 대한 튜토리얼을 찾았다. 딱 물체를 고정하는 조인트도 있고, 줄을 끊었을 때 물체가 이동하는 것까지 구현되어 있었다. 심지어 해당 소스파일을 zip로 공유해주고 있어서 아주 유용하게 참고할 수 있었다.

해당 방식에서 진행하는 방법은 다음과 같다.

스크립트는 세 개만 사용한다. 심지어 나같은 경우는 저기에서 Rope Cutter를 쓰지 않는다!

이미 로프 관련해서 상당히 R&D를 진행했다 보니 스크립트도 보자마자 한번에 이해할 수 있었다.
해당 스크립트를 참고하여 작성한 것은 다음과 같다.

  • RopeCreator
using UnityEngine;

public class RopeCreator : MonoBehaviour
{
    [SerializeField] Rigidbody2D hook;
    [SerializeField] GameObject linkPrefab;
    [SerializeField] RopeTiedObject objectWeight;
    [SerializeField] int links = 7;

    private GameObject link;

    private void Awake()
    {
        GenerateRope();
    }

    private void GenerateRope()
    {
        Rigidbody2D previousRB = hook;

        for(int i = 0; i < links; i++)
        {
            link = Instantiate(linkPrefab, transform);
            HingeJoint2D joint = link.GetComponent<HingeJoint2D>();
            joint.connectedBody = previousRB;
            previousRB = link.GetComponent<Rigidbody2D>();
        }
        objectWeight.ConnectRopeEnd(link.GetComponent<Rigidbody2D>());
    }
}

로프를 생성하는 기능을 담은 스크립트이다. 마지막에 오브젝트에 로프를 연결하는 과정까지 진행한다.

  • RopeTiedObject
using UnityEngine;

public class RopeTiedObject : MonoBehaviour
{
    public float distanceFromChaninedEnd = 0.6f;

    public void ConnectRopeEnd(Rigidbody2D endRB)
    {
        HingeJoint2D joint = gameObject.AddComponent<HingeJoint2D>();
        joint.autoConfigureConnectedAnchor = false;
        joint.connectedBody = endRB;
        joint.anchor = Vector2.zero;
        joint.connectedAnchor = new Vector2(0f, -distanceFromChaninedEnd);
    }
}

로프에 의해 연결되는 오브젝트가 담은 기능이다. RopeCreator에 연결되는 기능을 담은 함수 하나만 넣어주면 된다.

이와 같은 방식을 보면, Hinge Joint를 쓴다는 것에서 여타 로프를 만드는 과정과 다르지 않다.
이제 이와 같은 방식으로 로프를 생성하는데, 해당 스크립트를 사용하기 위해서는 약간의 준비가 필요하다.

  • 프리팹 준비

체인 부품으로 쓰일 Link와 로프를 생성하는 Rope 생성기를 프리팹으로 만들었다.
로프를 고정하는 오브젝트의 경우, 상황에 따라 바꿔야 하기 때문에 굳이 프리팹으로 만들지 않았다.

세팅이 꽤 큰 영향을 미쳐서, 잘 보고 똑같이 만들어야 한다.

생셩 결과는 다음과 같다.

2.2 로프 기믹 시스템 구현

이제 이걸 바탕으로 로프 기믹을 만들어야 하는데, 위와 같이 Rope를 두 개 생성해버리면 게임 화면과 같이 하나는 일직선이고, 하나는 팽팽이 당겨진 줄을 만들 수가 없었다.

그래서, 어차피 시각적으로 보이는 효과가 중요한 것에 주목하여, 이 부분에 대해서는 다음과 같이 처리했다.

프리팹은 이와 같이 만들었다. 여기서, 일직선으로 된 줄을 만들고, Fixed Rope를 키네마틱으로 설정했다.

해당 오브젝트는 이전에 만들었던 RopeController와 DestroyablePlatformController를 이용하여, 아래의 큐브를 부쉈을 때 비활성화되게 만들었다.

구체에는 이와 같이 Fixed Joint를 달고 Fixed Rope와 연결시킨다. 그러면 연결되어 있는 동안에는 키네마틱인 줄에 연결되어 있을 것이니 일직선으로 매달려 있는 듯한 연출이 가능하다.

또한 여기서, 해당 오브젝트가 건물들을 부숴야 하니 이와 같은 방식을 추가한다.

  • BoxController / MutipleBoxController에 부서지는 조건 추가.
    구체에는 Hammer라는 테그를 달아야 한다.
private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("Bullet") || collision.gameObject.CompareTag("Hammer"))
    {
        rigid.bodyType = RigidbodyType2D.Dynamic;
        rigid.mass = 0.1f;
        rigid.gravityScale = 0.3f;
    }
}

해당 오브젝트의 테스트 결과는 다음과 같다.

3. 개선점 및 과제

3.1 맵 5 생성

생성할 맵 5의 경우 아직 디자인이 정해지지 않았다. 회의를 통해서 오리지널 맵을 구성할 예정이다.

3.2 맵 생성 방식에 대한 구현

팀 회의를 통해서 맵 및 씬 전환 방식은 다음과 같이 이루어진다.

  • 씬 전환 및 게임 진행은 다음과 같이 이루어진다.

라운드는 3회, 각 라운드마다 3판 2선승제로 이루어진다.

여기서 해당 맵을 로딩하는 방법에 대해서는 비동기 로딩하는 방식을 활용한다.

3판 2선승제로 진행하는 게임의 경우, 맵 3개를 만들어 놓은 후 카메라 워킹으로 처리하고, 승리 조건이 완료되었을 때 씬2로 전환하여 카드 선택을 하도록 한다. 이 다음 다시 씬 1로 돌아서 다시 로딩된 맵으로 게임을 진행하고 게임이 종료되면 씬2에서 카드를 선택하는 방식으로 진행된다.

이 과정을 3회 반복하는 것으로 게임이 진행된다.

여기서 맵은 랜덤한 3개가 로딩되어야 하며, 여기서 비동기 로딩의 경우를 다른 팀원이 담당하기로 했고, 나는 씬1에서의 맵 생성후 카메라워킹에 대한 부분을 담당하기로 했다.

3.3 맵에 쉐이더 넣기

지금의 맵은 심심한 느낌이 없잖아 있다. 쉐이더에 대한 R&D를 진행하고 맵에 효과를 주는 방법에 대해 고민해보려고 한다.

3.4 (도전) 맵에 그림자 넣기

맵을 보면 그림자가 있는 것을 확인할 수 있다. 이 부분은 사실 무지 어려울 것이기에 만약 시간이 남아 구현이 가능하다고 하면 구현해 볼 생각이다.

profile
게임 만들러 코딩 공부중

0개의 댓글