왜.... 오셨나요?

부끄러워요

유니티개발 TIL

4주차 4일 TIL_유니티 입문(유사 2D메타버스 만들기_캐릭터 상호작용과 대쉬)

와피했는데 2025. 7. 24. 22:11

들어가기 앞서

오늘은 캐릭터가 앞으로 다른 오브젝트 또는 NPC 와 상호작용을 하기위한 키세팅 및 기능 구현과 구상중인 미니게임에 필요한 요소인 대쉬기능을 구현하도록 한다

벽렴일섬!


프로젝트 구현 단계


<상호작용키>

● 캐릭터 입장에서 다른 오브젝트를 인식하는 기능을 구현

이후 다른 상호작용이 가능한 오브젝트는 LayerMask을 추가함

 

>로직< (참고:https://youtu.be/bZVa6C6vRBQ?si=0dda2GBYoujUj2Pg)

 //=======================[Interaction RayCast]=======================
 private void FixedUpdate()
 {
     DrawRay();
 }
 void OnInteract()
 {
     Debug.Log($"이것은 {scanOdj.name}");
     if (scanOdj = null)
     {
         Debug.Log($"이것은 없습니다");
     }
 }

 void DrawRay()
 {
     Debug.DrawRay(rayPoint.position, dirVec * rayLangth, new Color(0, 1, 0));
     RaycastHit2D rayHit = Physics2D.Raycast(rayPoint.position, dirVec, rayLangth, LayerMask.GetMask("Object"));

     if(rayHit.collider!=null)
     {
         scanOdj = rayHit.collider.gameObject;
     }
     else
         scanOdj = null;
 }

 

Raycast를 통해 케릭터쪽에서 다른오브젝트를 감지해서 상호작용 가능한 'Object' Layer만 특정하여 상호작용 하게 구현

 

    void BodyDir()
    {
        // 오른쪽
        if(moveDir.x > 0)
        {
            dirVec = Vector3.right;
            spriteRenderer.sprite = sRender;

방향값은 이전 Move때 다루었던 BodyDir 함수에 추가함


<캐릭터 대쉬>

짧은 거리를 빠르게 이동(like 축지법)

(참고:https://youtu.be/VWaiU7W5HdE?si=Y5AmiAbEntc-IF_q)

>변수<

 [Header("플레이어 대시 세팅")]
 [SerializeField] float dashSpeed;  //10f
 [SerializeField] float dashDuration; // 1f
 [SerializeField] float dashCoolDown; //1f

 //====[Dash]====
 bool isDashing = false;
 bool canDash = true;
 float activeSpeed;

 

    //=======================[Dash]=======================

    private void Start()
    {
        activeSpeed = speed;
        canDash = true;
    }

    private void FixedUpdate()
    {
        Move();
    }

    void OnSprint()
    {
        Dash();
    }

   void Dash()
   {
       if (!canDash) { return; }
       isDashing = true;
       StartCoroutine(DashCorutine());
   }

   IEnumerator DashCorutine()
   {
       canDash = false;
       speed = dashSpeed;
       yield return new WaitForSeconds(dashDuration);
       speed = activeSpeed;
       isDashing = false;
       yield return new WaitForSeconds(dashCoolDown);
       canDash = true;
   }

코루틴을 통해 대쉬중에 중복입력 불가하게 설정 및 쿨타임도 구현


버그수정


대쉬기능의 작동이 안됨
위에 코드 이전에 대쉬연산을 FixedUpdate에 넣고 입력시 bool값의 변경만으로 실행시키려고 했지만 안되고 그 이전에 대쉬의 로직이 달라서 대쉬파워와 대쉬지속값이 Time.daltaTime으로 -=시켜서 0보다 <=을때 다시 bool값 변수값 초기화 등등등 여러 방법을 써도 대쉬가 작동을 안했던 적이 있었다 
해답은 간단했다.... 로직자체를 실행시킬때 update나 FixedUpdate문안에 말고 Oninput 이벤트 함수안에 그냥 넣으면 된다
input 이벤트 함수의 경우 update문에서 실행된다는걸 오늘 알게 되었다 이벤트로만 처리하는줄 알았더니 update문에 실행이 된다는 사실을 모른채 시간을 허비하였다 

말이 길어지는거 보니 내다버린 시간이 정말 아까웠나 보다(내 5시간 내나)


마치며.


 

미니게임을 위해 플레이어 조작법 두개로 스크립트화 하였는데 이후에 미니게임을 제작하는것을 통해 다시 하나로 편입할지 말지는 그때 가서 정해야 할듯하다 초반 기반 기획이 없이 개발로 먼저 하려니 구조설계 기획, 개발 3가지를 동시에 하다보니 머리에 과부화가 와서 진행이 늦고 있다 템플릿대로 할수있지만 그렇게 하다보면 내가 만든 구조랑 템플릿이랑 안맞아서 그거 유지보수가 더욱 힘들고 나중에 코드가 이쁜 아기가 아닌 누더기 골렘이 되어서 '아빠 응애' 하는거 보면 정말 참을수없게 된다 그래서 최대한 템플릿, 참고 등 볼때 내코드에 맞추려는 생각을 꾸준히 하고있다