본문 바로가기
디지털노마드

[5분개발] ChatGPT를 활용하여 2D 게임에서 캐릭터 플리핑 구현(2)

by 인텔리노마드라이프 2024. 4. 24.
728x90

안녕하세요. 인텔리원스튜디오(IntelliOneStudio)입니다.

 

오늘은 캐픽터 플리핑 구현하는 방법 중 지난 시간에 살펴본 Scale 값을 이용하는 방법 외  

Sprite Renderer 를 이용하는 방법을 살펴볼까해요

 

 ChatGPT 답변 내용 중 제가 별도로 표시한 파란색 내용을 기준으로 읽으시면 좀 더 이해가 쉽게 될거예요.

 

[질문] 안녕 ChatGPT, Unity 에서 Character Flipping을 구현하는 방법들을 정리해줄래?

[답변]

Unity에서 캐릭터의 방향을 바꾸는, 즉 캐릭터 플리핑(flip)을 구현하는 방법은 여러 가지가 있습니다. 게임 개발 시 캐릭터가 왼쪽이나 오른쪽을 바라보도록 만들기 위해 자주 사용되는 기술입니다. 주로 사용하는 방법을 몇 가지 설명드리겠습니다:

1. Scale을 이용한 방법

캐릭터의 Transform 컴포넌트의 Scale 값을 변경하여 캐릭터를 좌우로 뒤집는 가장 간단한 방법입니다. 예를 들어, 캐릭터의 Scale.x 값을 음수로 설정하면 캐릭터가 반대 방향으로 뒤집힙니다.

void FlipCharacter()
{
    transform.localScale = new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z);
}

 

2. Sprite Renderer를 이용한 방법

Sprite Renderer의 flipX 속성을 사용하여 캐릭터의 스프라이트를 수평 방향으로 뒤집을 수 있습니다. 이 방법은 캐릭터의 모양만 변경하고, 충돌체나 기타 컴포넌트에 영향을 주지 않아 특정 상황에서 유용합니다.

void FlipCharacter()
{
    SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>();
    spriteRenderer.flipX = !spriteRenderer.flipX;
}

 

3. Quaternion을 이용한 방법

캐릭터의 회전을 직접 조절하여 뒤집는 방법입니다. 이 방법은 Quaternion을 사용하여 Y축 기준으로 180도 회전시켜 적용할 수 있습니다.

void FlipCharacter()
{
    transform.rotation = Quaternion.Euler(0, transform.rotation.y + 180, 0);
}

 

4. 애니메이션 시스템을 사용하는 방법

Unity의 애니메이션 시스템을 이용해 플리핑을 구현할 수 있습니다. 각 방향에 맞는 애니메이션 클립을 만들고, 캐릭터의 방향에 따라 적절한 애니메이션 클립을 재생하도록 설정할 수 있습니다. 이 방법은 더 자연스러운 동작 전환을 제공할 수 있습니다.

 

Animator animator;
void FlipCharacter(bool facingRight)
{
    animator.SetBool("FacingRight", facingRight);
}

 

방법 선택 시 고려사항

  • 성능: Scale을 조정하는 것은 매우 간단하고 성능 부담이 낮지만, 모든 자식 객체들이 영향을 받을 수 있습니다.
  • 복잡성: 애니메이션 시스템을 사용하는 방법은 좀 더 복잡하지만, 더 세밀하고 다양한 제어가 가능합니다.
  • 유연성: Sprite Renderer의 flipX는 스프라이트만 뒤집기 때문에 간단히 적용할 수 있지만, 3D 객체나 복잡한 구조에는 적합하지 않을 수 있습니다.

적절한 방법을 선택할 때는 게임의 요구 사항과 캐릭터의 구조를 고려하는 것이 중요합니다. 각기 다른 방법의 장단점을 고려하여 가장 효과적인 방법을 선택하세요.

 

 

2D 게임에 적합한 방법들만 따로 정리를 해달라고 했어요.

 

[질문] 안녕 ChatGPT, 2D에 적합한 방법들만 다시 정리해줄래?

[답변]

2D 게임에서 캐릭터 플리핑을 구현하는 데 적합한 방법들을 다시 설명드리겠습니다. 2D 캐릭터를 효과적으로 뒤집기 위해 자주 사용되는 두 가지 주요 방법이 있습니다:

1. Sprite Renderer의 flipX 속성 사용

Sprite Renderer 컴포넌트의 flipX 속성을 활용하는 것은 2D 게임에서 캐릭터 방향을 뒤집는 가장 간단하고 직관적인 방법입니다. 이 속성을 변경하면 스프라이트의 수평 방향이 즉시 뒤집히므로, 복잡한 계산이나 추가적인 코드 작성 없이도 방향 전환을 손쉽게 구현할 수 있습니다. 또한, 이 방법은 캐릭터의 시각적 표현만 변경하므로 기타 컴포넌트나 충돌체에는 영향을 주지 않습니다.

void FlipCharacter()
{
    SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>();
    spriteRenderer.flipX = !spriteRenderer.flipX;
}

 

2. Scale 조정

캐릭터의 Transform의 Scale 값을 조정하여 캐릭터를 좌우로 뒤집는 방법도 있습니다. Scale.x의 값을 음수로 설정하면 캐릭터가 수평 방향으로 뒤집힙니다. 이 방법은 구현이 매우 간단하지만, 캐릭터의 모든 자식 객체들도 함께 뒤집히는 것을 유의해야 합니다. 따라서, 자식 객체들에 부정적인 영향을 끼치지 않는 경우에 사용하는 것이 좋습니다.

void FlipCharacter()
{
    transform.localScale = new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z);
}

 

 

이제 Sprite Renderer의 flipX 속성 사용해볼께요

원하는 기능과 함께 수정하고 싶은 코드를 이야기했어요.

[질문] 안녕 ChatGPT, 아래 소스를 Sprite Renderer의 flipX 속성 사용해서 수정해줄래?
using UnityEngine;

public class PlayerAnimationController : MonoBehaviour
{
    private Animator animator;
    private Rigidbody2D rb;
    private float horizontalInput;
    private bool isRunning;

    void Start()
    {
        animator = GetComponent<Animator>();
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // 수평 입력을 가져옵니다.
        horizontalInput = Input.GetAxisRaw("Horizontal");

        // 달리고 있는지 여부를 결정합니다.
        isRunning = Mathf.Abs(horizontalInput) > 0;
        animator.SetBool("IsRunning", isRunning);

        // 캐릭터가 왼쪽 또는 오른쪽으로 달리고 있는지에 따라 방향을 전환합니다.
        if (horizontalInput < 0)
        {
            // 왼쪽으로 달리고 있으면 캐릭터를 뒤집습니다.
            transform.localScale = new Vector3(-1, 1, 1);
        }
        else if (horizontalInput > 0)
        {
            // 오른쪽으로 달리고 있으면 캐릭터의 방향을 원래대로 되돌립니다.
            transform.localScale = new Vector3(1, 1, 1);
        }
    }
}

 

[답변]

아래는 Sprite RendererflipX 속성을 사용하여 캐릭터의 방향을 뒤집는 수정된 코드입니다. 이 방식은 TransformScale을 변경하는 대신에 Sprite Renderer를 직접 사용하여 캐릭터의 방향 전환을 처리합니다. 이는 Scale 변화로 인한 부수적인 영향을 피할 수 있어 2D 게임에서 더 깔끔한 솔루션을 제공합니다.

using UnityEngine;

public class PlayerAnimationController : MonoBehaviour
{
    private Animator animator;
    private Rigidbody2D rb;
    private SpriteRenderer spriteRenderer; // SpriteRenderer를 사용하기 위해 선언
    private float horizontalInput;
    private bool isRunning;

    void Start()
    {
        animator = GetComponent<Animator>();
        rb = GetComponent<Rigidbody2D>();
        spriteRenderer = GetComponent<SpriteRenderer>(); // SpriteRenderer 컴포넌트를 가져옵니다.
    }

    void Update()
    {
        // 수평 입력을 가져옵니다.
        horizontalInput = Input.GetAxisRaw("Horizontal");

        // 달리고 있는지 여부를 결정합니다.
        isRunning = Mathf.Abs(horizontalInput) > 0;
        animator.SetBool("IsRunning", isRunning);

        // 캐릭터가 왼쪽 또는 오른쪽으로 달리고 있는지에 따라 방향을 전환합니다.
        if (horizontalInput < 0)
        {
            // 왼쪽으로 달리고 있으면 캐릭터를 뒤집습니다.
            spriteRenderer.flipX = true;
        }
        else if (horizontalInput > 0)
        {
            // 오른쪽으로 달리고 있으면 캐릭터의 방향을 원래대로 되돌립니다.
            spriteRenderer.flipX = false;
        }
    }
}

 

이 코드에서는 SpriteRenderer 컴포넌트를 추가하여 초기화하고, 게임 루프에서 horizontalInput에 따라 flipX 속성을 설정하여 캐릭터의 방향을 전환합니다. horizontalInput이 음수일 때 flipXtrue로 설정하여 캐릭터를 왼쪽으로 뒤집고, 양수일 때 false로 설정하여 오른쪽을 바라보게 합니다.

 

두 가지 방법을 비교해볼께요

[질문] 안녕 ChatGPT, 두 가지 방식을 비교해볼래?

[답변]

첫 번째 방식: SpriteRenderer.flipX 사용

  • 장점:
    • 단순성: 코드가 간단하고 직관적입니다. flipX 속성만 변경하면 되므로, 구현이 쉽습니다.
    • 퍼포먼스: 이 방법은 스프라이트의 렌더링 속성만 조절하므로, 성능에 미치는 영향이 거의 없습니다.
    • 호환성: 다양한 스프라이트와 애니메이션 시스템과 잘 호환됩니다.
  • 단점:
    • 제한성: 오직 스프라이트 렌더링 레벨에서만 작동하므로, 캐릭터의 실제 "방향"이나 "오리엔테이션"을 변경하지는 않습니다. 즉, 캐릭터의 물리적인 구조나 충돌 경계 등은 변경되지 않습니다.

두 번째 방식: transform.localScale 사용

  • 장점:
    • 범용성: transform.localScale를 사용하는 방법은 캐릭터의 실제 크기나 방향을 변형시킬 때 유용합니다. 이는 캐릭터의 충돌 박스나 기타 물리적 요소도 반영되므로 더 복합적인 상황에 적합할 수 있습니다.
    • 유연성: 이 방식은 단순히 스프라이트를 뒤집는 것 이상의 작업이 가능합니다. 예를 들어, 캐릭터의 크기를 동적으로 조절하거나, 다른 방향 변환을 적용하는 것도 가능합니다.
  • 단점:
    • 복잡성: 코드가 조금 더 복잡하며, transform의 다른 속성들과 상호작용할 때 주의가 필요합니다.
    • 퍼포먼스: transform 속성을 변경하는 것은 그 자체로는 큰 부하를 주지 않지만, 게임의 다른 물리적 계산이나 로직과 결합될 경우 예상치 못한 부작용이 발생할 수 있습니다.

 

두 가지 방식에 대한 장점과 단점을 비교해보면

SpriteRenderer.flipX 를 사용하는게 2D 게임에는 적합할 것 같아요. 

 

오늘은 2D 게임에서 캐릭터 플리핑 구현했어요.

즐거운 하루되세요.

 

지금까지,

언제나 성장하는 인텔리원스튜디오(IntelliOneStudio)입니다.

감사합니다.

 

728x90