Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

동구의_C# & Unity_개발일지

2024.01.25 내일배움캠프 24일차 TIL_Unity (입문, 알고리즘) 본문

Unity

2024.01.25 내일배움캠프 24일차 TIL_Unity (입문, 알고리즘)

mongle_0l 2024. 1. 25. 13:03

우리팀은 회의 끝에 개인공부을 조금 더 하고 다음 부터 팀 과제을 진행하기로 하였다.

 


알고리즘 코드카타 11일차

약수의 합

문제 설명
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
public class Solution
{
    public int solution(int n)
    {
        int answer = 0;
        for (int i = 1; i <= n/2; i++)
        {
            if (n % i == 0)
            {
                answer += i;
            }
        }
        return answer + n;
    }
}


2D 게임 심화 개발 / 2D 게임 로직 및 상태 관리

오브젝트 풀 구현
애니메니션 컨트롤
적 구현

 

 

 

01. 핵심 내용

1-1) 오브젝트 풀링

게임 개발에 널리 사용되는 테크닉으로, 게임의 성능을 개선하기 위해 사용됩니다.

  • 오브젝트 풀링은 객체를 미리 생성해 두고 필요할 때 가져다 사용하고, 사용이 끝나면 다시 풀에 반납하는 방식을 말합니다.
  • 오브젝트 풀링은 생성(Instantiate)과 소멸(Destroy)이라는 비용이 큰 작업을 최소화함으로써 성능을 향상시키는 데 중요한 역할을 합니다.
  • 이는 특히 빈번하게 생성하고 파괴되는 객체(예: 총알, 입자 등)에 대해 중요하며, 이런 객체들을 풀에 저장해 놓고 재사용함으로써 메모리 할당과 가비지 컬렉션에 따른 성능 저하를 방지할 수 있습니다.
  • 오브젝트 풀링은 적절히 사용하면 큰 성능 개선을 가져올 수 있지만, 불필요한 메모리 사용을 증가시킬 수 있으므로 사용 시에는 신중해야 합니다. 오브젝트 풀의 크기를 적절히 조절하는 것이 중요합니다.

 

02. 핵심 내용

2-1) Animation & Animator

Animation:

  • Animation 컴포넌트는 게임 오브젝트에 애니메이션을 추가하는 데 사용됩니다.
  • 이 컴포넌트는 애니메이션 클립을 재생할 수 있습니다.
  • Animation 컴포넌트는 간단한 애니메이션에 적합하며, 스크립트를 통해 직접 제어할 수 있습니다.
  • 애니메이션 클립은 Unity의 Animation window를 통해 생성하거나 편집할 수 있습니다.
  • 예를 들어, 이 컴포넌트를 사용하여 오브젝트의 크기를 변경하거나 색상을 변환하는 등의 간단한 애니메이션을 생성할 수 있습니다.

Animator:

  • Animator 컴포넌트는 애니메이션의 상태를 제어하고 전환을 관리하는 데 사용됩니다.
  • Animator 컴포넌트는 Animation Controller를 사용하여 애니메이션의 복잡한 상태 기계를 구현할 수 있습니다.
  • Animator 컴포넌트는 여러 애니메이션 클립을 조절하고, 애니메이션 간의 전환을 제어하고, 복잡한 애니메이션 시퀀스를 구현하는 데 적합합니다.
  • 예를 들어, 캐릭터의 걷기, 뛰기, 점프 등의 애니메이션을 관리하는 데 사용될 수 있습니다.
  • Animator 컴포넌트는 Mecanim 애니메이션 시스템의 일부로서, 애니메이션 블렌딩, 트리, 상태 머신 등의 기능을 제공합니다.

이 두 컴포넌트는 서로 다른 목적과 사용 케이스에 따라 애니메이션을 제어하는 데 사용됩니다. Animation은 더 간단한 애니메이션에 사용되며, Animator는 더 복잡한 애니메이션 시퀀스와 상태 관리에 사용됩니다.

 

2-2) StringToHash

유니티 애니메이션 시스템에서 자주 사용되는 기능입니다. 문자열을 해시 값으로 변환하며, 이로써 성능을 개선하고 코드의 가독성을 유지합니다.

 

  • 문자열 비교는 상대적으로 연산 비용이 큰 작업입니다. "StringToHash"는 문자열을 고유한 정수 값인 해시 값으로 변환하여 이 연산 비용을 크게 줄일 수 있습니다.
  • 해시 값은 고유하기 때문에 다른 문자열이 동일한 해시 값을 갖는 확률이 매우 낮습니다. 이를 활용해 문자열을 해시로 변환하면 효율적으로 문자열을 비교할 수 있습니다.
  • 애니메이션 파라미터를 지정할 때 문자열 대신 해시 값을 사용하면 CPU 시간을 절약하고 애니메이션 성능을 향상시킬 수 있습니다.
  • 그러나 주의할 점은 동일한 문자열은 항상 동일한 해시 값을 반환하지만, 반대로 동일한 해시 값이 항상 동일한 문자열을 반환하지는 않습니다. 이 점으로 인해 해시 충돌이 발생할 수 있습니다.
  • 또한 "StringToHash" 함수는 문자열을 해시 값으로 변환할 때 일방향으로 작동하기 때문에, 해시 값을 다시 원래의 문자열로 변환하는 것은 불가능합니다.

03. 핵심 내용

3-1) FindGameObjectWithTag

  • "FindGameObjectWithTag"는 지정된 태그와 일치하는 첫 번째 활성 GameObject를 반환합니다. 이 메서드는 특정 태그를 가진 오브젝트를 빠르게 찾을 수 있도록 돕습니다.
  • 태그를 사용하면 씬 내에서 특정 유형의 오브젝트를 쉽게 찾을 수 있으며, 코드에서 게임 오브젝트를 참조할 때 유용합니다.
  • 그러나 "FindGameObjectWithTag"는 매우 비싼 연산입니다. 즉, 이 메서드를 사용하면 CPU를 많이 사용하게 됩니다. 따라서 이 메서드를 매 프레임마다 호출하면 게임 성능에 심각한 영향을 미칠 수 있습니다.
  • 따라서 일반적으로는 이 메서드를 Start나 Awake와 같은 초기화 메서드에서 한 번만 호출하는 것이 권장됩니다. 오브젝트를 찾은 후에는 참조를 저장하고 나중에 재사용합니다.
  • 게임 오브젝트가 많은 큰 씬에서는 태그 대신 레이어나 다른 메서드를 사용하는 것이 더 효율적일 수 있습니다.

3-2) Physics.Raycast 또는 Physics2D.Raycast

  • Raycasting은 일련의 콜라이더와 교차하는지를 감지하는 데 사용되는 기술입니다. 이는 레이저 포인터나 총알을 쏘는 효과를 만들거나, 플레이어의 시야를 계산하는 등 다양한 방식으로 사용됩니다.
  • Unity에서는 Physics.Raycast 또는 Physics2D.Raycast를 사용하여 Raycast를 수행할 수 있습니다. 이들 메서드는 시작점, 방향, 최대 거리, 그리고 선택적으로 레이어 마스크를 매개변수로 받습니다.
  • Raycast는 hit 정보를 반환합니다. 이 정보에는 충돌한 객체, 충돌 지점, 충돌 지점의 정규화된 벡터 등이 포함됩니다.
  • Raycast는 충돌 검사에 비해 계산 비용이 많이 듭니다. 따라서 불필요한 Raycast를 줄이고, 가능한 경우 레이어 마스크를 사용하여 검사 범위를 제한하는 것이 성능에 좋습니다.
  • Raycast는 비주얼 디버깅을 위해 Debug.DrawRay와 함께 사용할 수 있습니다. 이를 통해 Scene 뷰에서 Raycast의 경로를 시각적으로 확인할 수 있습니다.
중요한 기능들을 정리해서 알아보자!
public class TopDownAnimationController : TopDownAnimations
{
    private static readonly int IsWalking = Animator.StringToHash("IsWalking");
    private static readonly int Attack = Animator.StringToHash("Attack");
    private static readonly int IsHit = Animator.StringToHash("IsHit");
StringToHah: 특정 문자열을 일정한 공식에 의해서 숫자 값(해쉬 값)으로 변환
이렇게 하는 이유 - 애니메이터안에서 키값을 string으로 제공을 했을 때 string을 비교하는 연산이 일어나는데 문자열 연산들이 비용이 높다. 그래서 문자열을 비교하지 말고 숫자 값(해쉬 값)을 바로 비교해라!

 

private void Rotate(Vector2 direction)
{
    float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
    characterRenderer.flipX = Mathf.Abs(rotZ) > 90f;
}
'direction'이라는 'Vector2' 매개 변수를 사용하는 'Rotate'라는 메서드이다.

(feat.CtatGPT)
1. 'Mathf.Atan2(direction.y, direction.x)': 양의 x축과 'direction'으로 표현되는 벡터 사이의 각도를 라디안 단위로 계산합니다. 그런 다음 'Mathf.Rad2Deg'를 곱하여 각도를 각도로 변환합니다.
2. 'float rotZ': 도 단위로 계산된 각도는 'rotZ' 변수에 저장됩니다.
3. 'characterRenderer.flipX = Mathf.Abs(rotZ) > 90f' : 이 줄은 'characterRenderer'의 'flipX' 속성을 설정합니다. 회전 각도의 절대값('Mathf.Abs(rotZ)')이 90도보다 크면 캐릭터가 왼쪽이나 오른쪽을 향하고 있고 'flipX' 속성이 'true'(문자를 가로로 뒤집음)로 설정되어 있음을 의미합니다.

이 코드는 캐릭터가 움직이는 방향을 향해야 하고 반대 방향으로 이동할 때 스프라이트를 뒤집어야 하는 2D 게임에서 일반적으로 사용됩니다. 정확한 동작은 프로젝트에서 나머지 코드와 게임 오브젝트가 어떻게 설정되는지에 따라 달라질 수 있습니다.

 


오늘의 오류

화살을 쏠려는데 오류가 나온다

mainSprite AnimationEvent에 함수 이름이 지정되지 않았습니다??

음...

코드 오류도 아니고 뭐지 하다 구글링

 

유니티 - animation event has no function name specified (tistory.com)

 

유니티 - animation event has no function name specified

이벤트 오류시 하기이미지 애니메이션 타임라인의 마커(Animation Event)를 삭제한다. * 즉, 등록된 이벤트에 연결된 함수가 없기에 발생하는 문제임.

soo0100.tistory.com

해당 애니메이션 클립의 이벤트가 정상적이지  않는 경우 발생한다고 한다.

나도 흰색 부분있었다!

삭제해주닌깐

정상적으로 작동!