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

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

아이템을 획득하면 획득한 순서대로 슬롯에 들어간다.
딱 여기까지 만들었다.
시연 영상 링크
👉 https://youtu.be/wBQlVNtfMLM?si=hQyUexOMH3cr9ojv
오늘부터 또 팀 프로젝트 시작!
선택할 수 있는 주제는 3D 러닝 액션 게임, 퍼즐 플랫폼 게임, 서바이벌 게임이 있었다.
우리 조가 선택한 주제는 퍼즐!
그리고 이어서 나온 로스트아크의 군단장 레이드 중 아브렐슈드 5관문!
로아 유저로서 구미가 당기는 주제였고, 퍼즐 게임을 만들기에 적합하기도 했다.
Figma로 구조를 잡아보았다.
(참고 자료로 쓰인 이미지 출처를 잃어버려서 캡처본은 생략)
처음 주제가 오고 갈 때부터 걱정이었는데, 우리가 만들 수 있을까? 🤣ㅋㅋㅋㅋ
브레이크를 잡을 수 있는 건 오늘뿐이라며 농담 반 진담 반 얘기를 하기도 했지만
결국 진행하기로 했다!!
내가 맡은 역할은 Player
드디어 팀 프로젝트에서 Player를 맡게 됐다... 🫨
Player에 여러 기능들이 있지만 오늘은 첫날이라 움직임에 관련된 기능을 주로 하게 되었다.
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 움직임을 조작해 보았다.
오... 이거 완전 코드가 간단해지는 마법을 부린다.
👀 실행 결과
실행도 잘 된다.
다음으로 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);
}