공부/Game Bootcamp

[TIL] #10. 대시 이펙트 : 멋쟁이사자처럼부트캠프 Unity 게임 개발 3기

2025. 5. 7. 18:19
목차
  1. 개요
  2. 느낀 점

개요

캐릭터가 대시할 때 시각적으로 속도감과 몰입감을 주기 위한 연출로, 잔상 느낌의 이펙트를 구현하였다.
특히 이펙트가 이동 경로를 따라 자연스럽게 생성되도록 개선하는 과정이 핵심이었다.

 

내용

1. EffectManager 구조 설계

    싱글톤 방식으로 관리
    PlayEffect(Vector3 position, EffectType type)을 통해 타입별 이펙트 실행

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class EffectManager : Singleton<EffectManager>
{
    [SerializeField] private GameObject hitEffectPrefab;
    [SerializeField] private GameObject dashEffectPrefab;
    [SerializeField] private GameObject attackEffectPrefab;
    [SerializeField] private GameObject walkEffectPrefab;

    public enum EffectType { Attack, Dash, Hit, Walk }

    public void PlayEffect(Vector3 position, EffectType type)
    {
        GameObject prefab = null;

        switch (type)
        {
            case EffectType.Attack: prefab = attackEffectPrefab; break;
            case EffectType.Dash: prefab = dashEffectPrefab; break;
            case EffectType.Hit: prefab = hitEffectPrefab; break;
            case EffectType.Walk: prefab = walkEffectPrefab; break;
        }

        if (prefab != null)
            Instantiate(prefab, position, Quaternion.identity);
    }

    protected override void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        // TODO: 필요하면 씬 전환 시 이펙트 초기화 처리
    }
}



2. 이펙트 위치 문제 해결
    처음엔 player.transform.position을 기준으로 생성 → 이펙트가 캐릭터 옆에 뜨는 현상 발생
    해결 방법:

  • 캐릭터에 DashEffectAnchor라는 빈 오브젝트 추가
  • 이 앵커를 기준으로 이펙트를 생성해 정확한 위치 보정


3. 이동 거리 기준 생성 조건 추가
    이펙트가 짧은 시간 동안 너무 많이 생성되는 것 방지
    Vector3.Distance()로 이전 위치와 현재 위치 비교 → 일정 거리 이상일 때만 생성

private void DoDash()
    {
        timer += Time.deltaTime;
        if (timer < duration)
        {
            var moveVector = direction * dashSpeed * Time.deltaTime;
            player.CharacterController.Move(moveVector);

            // 일정 거리 이상 이동 시 이펙트 생성
            Vector3 currentEffectAnchorPos = player.DashEffectAnchor.position;
            float dist = Vector3.Distance(currentEffectAnchorPos, lastEffectPos);
            if (dist >= effectSpacing)
            {
                Debug.DrawLine(currentEffectAnchorPos, currentEffectAnchorPos + Vector3.up * 1f, Color.green, 1f);
                EffectManager.Instance.PlayEffect(currentEffectAnchorPos, EffectManager.EffectType.Dash);
                lastEffectPos = currentEffectAnchorPos;
            }
        }
        else
        {
            EndAction();
        }
    }



4. 이펙트 프리팹 세팅
    Looping 체크 해제, Stop Action을 Destroy로 설정 → 한번만 실행되게 설정
    Shape 모듈에서 X축 위치 조절로 중심 정렬



5. 디버깅 과정
    Debug.DrawLine()으로 앵커 위치 확인

Debug.DrawLine(currentEffectAnchorPos, currentEffectAnchorPos + Vector3.up * 1f, Color.green, 1f);


    회전, 쉐이프 위치 등을 직접 수정하면서 방향 문제 해결

    추후 이슈 방지를 위한 EffectManager null 체크 추가

 

이펙트가 추가되면 변경된 PlayerActionDash.cs의 전체 코드는 아래와 같다.

using UnityEngine;

public class PlayerActionDash : IPlayerAction
{
    private PlayerController player;
    private float duration = 0.25f;
    private float timer;
    private Vector3 direction;

    private float dashSpeedMultiplier = 3f;
    private float dashSpeed;

    private Vector3 lastEffectPos;
    private float effectSpacing = 0.8f;

    public bool IsActive { get; private set; }

    public void StartAction(PlayerController player)
    {
        this.player = player;
        IsActive = true;
        timer = 0f;

        // 조이스틱 입력값 있으면 그 방향, 없으면 캐릭터가 바라보는 방향
        direction = player.GetMoveDirectionOrForward().normalized;
        // 대시 속도 = 이동 속도 x 배수
        dashSpeed = player.moveSpeed * dashSpeedMultiplier;

        lastEffectPos = player.DashEffectAnchor.position;

        if (EffectManager.Instance == null)
            Debug.LogError("이펙트 매니저 인스턴스가 null입니다!");
    }

    public void UpdateAction()
    {
        if (!IsActive) return;
        DoDash();
    }

    private void DoDash()
    {
        timer += Time.deltaTime;
        if (timer < duration)
        {
            var moveVector = direction * dashSpeed * Time.deltaTime;
            player.CharacterController.Move(moveVector);

            // 일정 거리 이상 이동 시 이펙트 생성
            Vector3 currentEffectAnchorPos = player.DashEffectAnchor.position;
            float dist = Vector3.Distance(currentEffectAnchorPos, lastEffectPos);
            if (dist >= effectSpacing)
            {
                Debug.DrawLine(currentEffectAnchorPos, currentEffectAnchorPos + Vector3.up * 1f, Color.green, 1f);
                EffectManager.Instance.PlayEffect(currentEffectAnchorPos, EffectManager.EffectType.Dash);
                lastEffectPos = currentEffectAnchorPos;
            }
        }
        else
        {
            EndAction();
        }
    }

    public void EndAction()
    {
        IsActive = false;
        player.OnActionEnded(this);
        player = null;
    }
}

 

결과물은 아래와 같다.

 

 

 

느낀 점

이번에 파티클 시스템을 어떤식으로 수정할지 테스트하면서 수정하는 게 이렇게 해도 되나 살짝 아리송하면서도 재밌었다. 확실히 이펙트가 생기니까 움직임이 달라보여서 좋았다. 내일 남은 이펙트 작업 이어가야겠다.

'공부 > Game Bootcamp' 카테고리의 다른 글

[TIL] #12. 통합 후 카메라 흔들림 버그 수정 : 멋쟁이사자처럼부트캠프 Unity 게임 개발 3기  (0) 2025.05.09
[TIL] #11. 공격, 피격 이펙트 : 멋쟁이사자처럼부트캠프 Unity 게임 개발 3기  (1) 2025.05.08
[TIL] #9. 플레이어 공격, 피격까지(대시는 덤) : 멋쟁이사자처럼부트캠프 Unity 게임 개발 3기  (1) 2025.05.02
[TIL] #7. 플레이어 피격 : 멋쟁이사자처럼부트캠프 Unity 게임 개발 3기  (1) 2025.04.29
[TIL] #6. Animation event 작동 안함(뭔가 만들었다면 꼭 초기화를 하자) : 멋쟁이사자처럼부트캠프 Unity 게임 개발 3기  (1) 2025.04.25
  1. 개요
  2. 느낀 점
'공부/Game Bootcamp' 카테고리의 다른 글
  • [TIL] #12. 통합 후 카메라 흔들림 버그 수정 : 멋쟁이사자처럼부트캠프 Unity 게임 개발 3기
  • [TIL] #11. 공격, 피격 이펙트 : 멋쟁이사자처럼부트캠프 Unity 게임 개발 3기
  • [TIL] #9. 플레이어 공격, 피격까지(대시는 덤) : 멋쟁이사자처럼부트캠프 Unity 게임 개발 3기
  • [TIL] #7. 플레이어 피격 : 멋쟁이사자처럼부트캠프 Unity 게임 개발 3기
Ail_
Ail_
logAil_ 님의 블로그입니다.
Ail_
log
Ail_
  • 분류 전체보기 (186)
    • 사설 (11)
      • 강연 (5)
      • * (3)
      • 회고 (3)
    • 공부 (139)
      • Just do it (3)
      • TIL (66)
      • Game Bootcamp (31)
      • Digital Twin Bootcamp (39)
    • 노션 (3)
    • 프로젝트 (26)
      • Game Bootcamp (1)
      • Digital Twin Bootcamp (21)
      • 경기청년 갭이어 (4)
    • 토이 프로젝트 (1)
      • 아쿠아오브 (1)

인기 글

최근 글

태그

  • 개발일지
  • 부트캠프
  • 템플릿
  • 경기청년갭이어
  • 한입 크기로 잘라 먹는 타입스크립트
  • C#
  • 갭이어
  • 회고
  • 유니티 게임 개발
  • 경기갭이어
  • SQL첫걸음
  • 피격
  • Do it! 자료구조와 함께 배우는 알고리즘 입문 : 파이썬 편
  • 오블완
  • Chat
  • mysql 설치
  • 2025
  • 대시
  • 멋쟁이사자처럼
  • TypeScript
  • unity
  • 티스토리챌린지
  • 이펙트
  • node.js
  • 유니티
  • 노션
  • SQL 첫걸음
  • 인터랙티브 웹 UX·UI
  • 공격
  • 개발회고

최근 댓글

전체
오늘
어제
hELLO · Designed By 정상우.
Ail_
[TIL] #10. 대시 이펙트 : 멋쟁이사자처럼부트캠프 Unity 게임 개발 3기
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.