카테고리 없음

25.02.26(수) - TIL 28일차 Unity 입문

rxo2 2025. 2. 26. 21:20

    private void OnCollisionEnter2D(Collision2D collision) // 충돌에 대한 이벤트 발생시 실행
    {
        if (isDead) return; // 이미 죽었으면 충돌 무시

        if (collision.gameObject.CompareTag("Ground"))  // 땅과 충돌하면 죽지 않도록 예외 처리
        {
            ground = true;   // 바닥 감지
            jumpCount = 0;   // 점프 횟수 초기화
            return;          // 죽지 않도록 예외 처리
        }
        isDead = true;
        deathCooldown = 1f;
        animator.SetInteger("IsDie", 1); // 애니메이터에 "IsDie"라는 파라미터의 값을 1로 설정(블럭연결)
    } 

팀 프로젝트(쿠키런)중 점프와 점프 애니매이터를 작업중위와 같이 코드를 작성하였을때

점프 애니매이션에 오류가 존재하였고 바닥( Ground ) 의 충돌 감지 인식또한 좋지 못했다.

 

private void OnCollisionEnter2D(Collision2D collision) // 충돌 발생시 실행
{
    if (collision.gameObject.CompareTag("Ground"))
    {
        ground = true;
        animator.SetBool("IsJump", false); // 점프 애니매이션 해제
        jumpCount = 0; // 점프 횟수 초기화
    }
}

private void OnCollisionExit2D(Collision2D collision) // 충돌이 끝났을때 실행
{
    if (collision.gameObject.CompareTag("Ground"))
    {
        ground = false;
    }
}

2번째 코드처럼 OnCollisionEnter2D 와 OnCollisionExit2D 를 사용하여 더 확실하고 세밀하게 구분하여 사용.

충돌 시작점과 끝나는점을 따로 구분하여 사용하는것이 좋음.

 

다른 해결책으로는 

 

bool CheckGround()
{
    float rayLength = 2f; 
    LayerMask groundLayer = LayerMask.GetMask("Ground"); // 바닥 그라운드 레이어
    RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, rayLength, groundLayer);
    Debug.DrawRay(transform.position, Vector2.down * rayLength, Color.red);
    if (transform.position.y < lastPosition_Y)
    {
        if(hit!=null)
        {
            animator.SetBool("IsJump", false);
            lastPosition_Y = transform.position.y;
        }
    }
    return hit.collider != null; 
}

이 코드에서 

LayerMask groundLayer = LayerMask.GetMask("Ground");  의 해석을 잘못 해석중이였다

태그를 Ground 로 지정하였던게 원인이였고 해결방법은 인스펙터 옆에있는

Layer 를 Ground 로 추가해주면 해결해주고 아래와 같은 코드로 고쳤다

 

bool CheckGround()
{
    float rayLength = 2.5f; 
    LayerMask groundLayer = LayerMask.GetMask("Ground"); // 바닥 그라운드 레이어
    RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, rayLength, groundLayer);
    Debug.DrawRay(transform.position, Vector2.down * rayLength, Color.red);
    lastPosition_Y = transform.position.y;
    if (hit.collider != null && transform.position.y <= lastPosition_Y) //땅에 닿고있고+내려가는중
    {
        animator.SetBool("IsJump", false);
        return false; // 바닥이 감지되면 점프 초기화
    }
    else
    {
        animator.SetBool("IsJump", true); // 공중에 있다면 트루
        return true;
    }
}

 

============================= 

 

애니매이션 코드와 애니매이터를 연결시 각 동작마다 실행과 종료를 꼼꼼히 넣어줘야 한다

그리고 a 의 행동을 하다가 b 의 행동 입력시, a의 애니매이션을 유지한채 b의 물리값이 작동한다면

확실히 종료시켜주는 코드를 작성해주어야한다.

 

 

색상을 조절해주는 코드와 vs 애니매이션에 색을 추가할수 있는 유니티 

두 방법으로 색상을 동시에 조작할 시 충돌발생, 애니매이터에 오류가 생김

하나의 방법으로 색을 추가하는 것이 좋고 우선순위는 유니티가 1순위로 적용이된다

같은 내용을 덮어씌울 상황이 생긴다면 유니티가 코드스크립트보다 위에 서있다.