8주차 팀 프로젝트 시작, Player 우클릭으로 이동, 클릭 위치에 이펙트 생성

유승아·2024년 6월 3일

내일배움캠프

목록 보기
53/69

1. 개인 과제 시연 영상

지난주 목요일이 개인 과제 제출일이었는데
제출까지 기능을 완성하지 못해서 약간 현타(?) 비스무리한게 찾아와서 TIL 쓸 생각을 못 했다.

인벤토리를 만들 만큼 아이템이 많지 않기도 하고
퀵슬롯도 사용해 보고 싶어서 이번에 만들어보려고 했다.

아이템을 획득하면 획득한 순서대로 슬롯에 들어간다.

딱 여기까지 만들었다.

시연 영상 링크
👉 https://youtu.be/wBQlVNtfMLM?si=hQyUexOMH3cr9ojv


2. 8주차 팀 프로젝트 시작

오늘부터 또 팀 프로젝트 시작!
선택할 수 있는 주제는 3D 러닝 액션 게임, 퍼즐 플랫폼 게임, 서바이벌 게임이 있었다.

우리 조가 선택한 주제는 퍼즐!
그리고 이어서 나온 로스트아크의 군단장 레이드 중 아브렐슈드 5관문!
로아 유저로서 구미가 당기는 주제였고, 퍼즐 게임을 만들기에 적합하기도 했다.

Figma로 구조를 잡아보았다.
(참고 자료로 쓰인 이미지 출처를 잃어버려서 캡처본은 생략)

처음 주제가 오고 갈 때부터 걱정이었는데, 우리가 만들 수 있을까? 🤣ㅋㅋㅋㅋ
브레이크를 잡을 수 있는 건 오늘뿐이라며 농담 반 진담 반 얘기를 하기도 했지만
결국 진행하기로 했다!!


1) 역할 분담

내가 맡은 역할은 Player
드디어 팀 프로젝트에서 Player를 맡게 됐다... 🫨

Player에 여러 기능들이 있지만 오늘은 첫날이라 움직임에 관련된 기능을 주로 하게 되었다.


2) 우클릭으로 이동

PlayerMovementController.cs

using UnityEngine.InputSystem;
using UnityEngine;
using DG.Tweening;

public class PlayerMovementController : MonoBehaviour
{
    [Header("Movement")]
    public float moveSpeed;
    public Ease moveEase = Ease.Linear; // Ease 타입

    private Vector3 targetPosition;
    private Tween moveTween;

    [Header("Effect")]
    public GameObject effectPrefab; // 이펙트 프리팹

    void Update()
    {
        // 마우스 오른쪽 버튼이 눌린 상태 확인
        if (Input.GetMouseButton(1))
        {
            // 카메라에서 레이캐스트 발사
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            int groundLayerMask = LayerMask.GetMask("Ground"); // Ground 레이어 마스크

            if (Physics.Raycast(ray, out hit, Mathf.Infinity, groundLayerMask)) // 레이어 마스크 추가
            {
                // 목표 위치 업데이트
                targetPosition = hit.point;

                // 클릭 위치에 이펙트 생성
                Instantiate(effectPrefab, targetPosition, Quaternion.identity);

                // 현재 이동 중인 트윈이 있으면 취소
                if (moveTween != null && moveTween.IsActive())
                {
                    moveTween.Kill();
                }

                // 목표 위치까지의 거리 계산
                float distance = Vector3.Distance(transform.position, targetPosition);

                // 이동 시간 계산
                float moveDuration = distance / moveSpeed;

                // 새로운 목표 위치로 이동
                moveTween = transform.DOMove(targetPosition, moveDuration)
                                     .SetEase(moveEase)
                                     .OnComplete(() => moveTween = null); // 이동 완료 후 값 비우기
            }
        }
    }
}

이번에는 DOTween을 사용해서 Player 움직임을 조작해 보았다.

오... 이거 완전 코드가 간단해지는 마법을 부린다.

👀 실행 결과

실행도 잘 된다.


3) 클릭 위치에 이펙트 생성

다음으로 Player가 우클릭한 위치에 이펙트를 생성했다.
이펙트 에셋을 못 구해서 간단한 애니메이션을 적용시키고 프리팹으로 만들었다.

AutoDestroyCursorEffectPrefab.cs

using UnityEngine;

public class AutoDestroyCursorEffectPrefab : MonoBehaviour
{
    void Start()
    {
        Animator animator = GetComponent<Animator>();

        if (animator != null)
        {
            float animationLength = animator.GetCurrentAnimatorStateInfo(0).length;
            Destroy(transform.parent.gameObject, animationLength); // 부모 오브젝트 파괴
        }
    }
}

클릭할 때마다 프리팹을 생성하고(PlayerMovementController.cs)
애니메이션이 끝나면 파괴되도록(AutoDestroyCursorEffectPrefab.cs) 했다.

👀 실행 결과

이펙트 적용

클릭을 유지하면서 우클릭 드래그를 하면 긁은 경로 전부 프리팹이 생성된다.

너무 과하게 생성되는 건가 싶어서 우클릭을 뗐을 때 이펙트가 나오게도 설정해봤다.

팀원의 피드백으로 첫 번째가 낫다고 하여 그대로 사용하기로 결정!

클릭을 뗐을 때 이펙트가 나오게 설정하기

// 마우스 오른쪽 버튼이 떼어진 순간 확인
if (Input.GetMouseButtonUp(1))
{
    // 클릭 위치에 이펙트 생성
    Instantiate(effectPrefab, targetPosition, Quaternion.identity);
}

0개의 댓글