티스토리 뷰

강의를 열심히 듣는데도 유니티에서 만져야될 창이나 버튼이 많아서 그런지 중간중간 놓치는게 꽤 있었다 그래서 질문을 많이 했다 하하.. 특히 애니메이터에서 많이 헤맸다


💻 Unity

Animator

애니메이션을 제어하는 핵심 컴포넌트다. 캐릭터나 오브젝트의 움직임을 조작할 때 사용하며, 애니메이션 State(상태) 전환, 파라미터 조정, 트리거 설정 등의 기능을 제공한다.

애니메이션간 상태 전환을 설정할 때 Transitions을 사용한다. Animator vs Animation

구분  Animator  Animation
사용 방식 여러 개의 애니메이션을 조합하고 상태를 제어 단일 애니메이션 실행
상태 전환 State Machine을 사용하여 설정 수동으로 코드 작성 필요
코드 제어 Parameters를 사용하여 제어 Play() 메서드를 사용하여 직접 실행
추천 사용 사례 캐릭터 움직임, 복잡한 애니메이션 시스템 간단한 UI 애니메이션, 오브젝트 회전

Layor

오브젝트를 그룹화하여 충돌 감지, 렌더링, 카메라 필터링 등을 제어하는 기능이다. 주로 Physics(물리 충돌), Camera Culling Mask(카메라 필터링), Raycast(광선 검출) 등에 사용된다.

Layer의 역할

충돌 감지 특정 Layer 간의 충돌을 비활성화하여 성능 최적화 가능
카메라 필터링 특정 Layer만 렌더링하도록 카메라 설정 가능
Raycast 제어 Raycast가 특정 Layer만 감지하도록 설정 가능
렌더링 제어 특정 Layer만 보이거나 보이지 않게 설정 가능

Layer vs Tag

구분 layer Tag
역할 충돌 감지, 렌더링 제어 특정 오브젝트 식별
중복 가능 여부 한 오브젝트에 하나만 적용 가능 여러 개의 오브젝트가 같은 Tag를 가질 수 있음
사용 예시 충돌 감지, Raycast 필터링 적군/아군 식별, 특정 오브젝트 찾기

활용 예제

  • Raycast 필터링을 활용하여 성능 최적화
  • Layer Collision Matrix를 조정하여 불필요한 충돌 제거
  • 카메라 Culling Mask를 설정하여 특정 오브젝트만 렌더링

Physic Material

오브젝트의 물리적 반응(마찰력, 탄성 등)을 설정하는 머티리얼이다. 충돌 시 미끄러짐, 튕김 정도 등을 조정할 수 있으며, Rigidbody 및 Collider와 함께 사용된다.

Physic Material의 역할

마찰력(Friction) 표면의 미끄러짐 정도 조절
탄성(Bounciness) 충돌 시 튕기는 정도 설정
충돌 조합 설정 오브젝트끼리 충돌 시 어떻게 반응할지 결정

Physic Material 속성

Dynamic Friction 움직일 때의 마찰력
Static Friction 멈춰 있을 때의 마찰력
Bounciness 충돌 시 튕기는 정도
Friction Combine 두 오브젝트의 마찰력을 어떻게 조합할지 설정
Bounce Combine 두 오브젝트의 탄성을 어떻게 조합할지 설정

Physic Material vs 일반 Material

구분  Physic Material 일반 Material
역할 물리적 반응 조절 오브젝트의 시각적 표현
속성 마찰력, 탄성 등 색상, 텍스처 등
적용 대상 Collider Mesh Renderer
예제 얼음(미끄러짐), 고무공(튕김) 금속 질감, 유리 투명도

🕹️ 게임 만들기

1945

배경 설정

  • Stage_1 이미지 설정
  • Material Shader Mobile/Particles/AlphaBlended로 변경 한 후 이미지 넣어줌
  • Background 오젝트에 넣어서 크기를 늘려준다
public float scrollSpeed = 0.02f;
public Material MyMaterial { get; set; }

void Start()
{
    MyMaterial = GetComponent<Renderer>().material;
}

void Update()
{
    float newOffsetY = MyMaterial.mainTextureOffset.y + scrollSpeed * Time.deltaTime;
    Vector2 newOffset = new Vector2(0, newOffsetY);
    MyMaterial.mainTextureOffset = newOffset;
}

 

Player

  • 이미지의 Piexel pers unit을 원래 이미지의 크기와 맞추기
  • 이미지를 Slice한 후 두개를 한 번에 하이어라키에 드래그하면 애니메이터가 자동으로 생성됨 Player에 Player_left, Player_right 드래그하기
  • 오브젝트 Order in Layer 1로
  • 애니메이터에 left, right 파라미터 만든 후 Transition 설정해줌
  • left, right Animator Loop Time 체크 해제, up은 체크 활성
public float moveSpeed = 5f;
private Vector2 minBounds;
private Vector2 maxBounds;
public Animator MyAnimator { get; set; }

void Start()
{
    MyAnimator = GetComponent<Animator>();

    // 화면 경계 설정
    Camera cam = Camera.main;
    Vector3 bottomLeft = cam.ViewportToWorldPoint(new Vector3(0, 0, 0));
    Vector3 topRight = cam.ViewportToWorldPoint(new Vector3(1, 1, 0));

    minBounds = new Vector2(bottomLeft.x, bottomLeft.y);
    maxBounds = new Vector2(topRight.x, topRight.y);
}

void FixedUpdate()
{
    float moveX = Input.GetAxis("Horizontal") * moveSpeed * Time.deltaTime;
    float moveY = Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime;

    SetAnimation();

    Vector3 newPosition = transform.position + new Vector3(moveX, moveY, 0);

    // 경계를 벗어나지 않도록 위치 제한
    newPosition.x = Mathf.Clamp(newPosition.x, minBounds.x, maxBounds.x);
    newPosition.y = Mathf.Clamp(newPosition.y, minBounds.y, maxBounds.y);

    transform.position = newPosition;
}

private void SetAnimation()
{
    if (Input.GetAxis("Horizontal") <= -0.25f)
    {
        MyAnimator.SetBool("left", true);
    }
    else
    {
        MyAnimator.SetBool("left", false);
    }

    if (Input.GetAxis("Horizontal") >= 0.25f)
    {
        MyAnimator.SetBool("right", true);
    }
    else
    {
        MyAnimator.SetBool("right", false);
    }

    if (Input.GetAxis("Vertical") >= 0.25f)
    {
        MyAnimator.SetBool("up", true);
    }
    else
    {
        MyAnimator.SetBool("up", false);
    }
}

 

Item

  • Rigidbody의 gravity 0으로, Freeze Rotation Z 체크
  • PhysisMaterial 2D 머테리얼 생성후 Friction 0으로, Bounciness 1로
  • Collider의 Material에 Bounce 머테리얼 추가
  • 프리팹으로 만들어 주기
  • Item Layer 추가해서 설정
  • Project Settings > Physics 2D > Item끼리 충돌 해제
  • Ctrl+D로 여러개 만들어주기
public float ItemVelocity = 120f;
Rigidbody2D rig;

void Start()
{
    rig = GetComponent<Rigidbody2D>();
    rig.AddForce(new Vector3(ItemVelocity, ItemVelocity, 0f));
}

📝 과제

1945 미사일 만들기

public class Launcher : MonoBehaviour
{
    public float shootInterval = 0.4f;
    public GameObject MyBUllet;

    void Start()
    {
        StartCoroutine(ShootCoroutine());
    }

    IEnumerator ShootCoroutine()
    {
        while (true)
        {
            Shoot();
            yield return new WaitForSeconds(shootInterval);
        }
    }

    void Shoot()
    {
        Instantiate(MyBUllet, transform.position, Quaternion.identity);
    }
}
using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float moveSpeed = 2.0f;

    void Start()
    {
        
    }

    void Update()
    {
        transform.Translate(0, moveSpeed * Time.deltaTime, 0);
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        Destroy(gameObject);
    }

    private void OnBecameInvisible()
    {
        Destroy(gameObject);
    }
}

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   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
글 보관함