본문 바로가기

유니티 (핀볼 게임/ 애니메이션 이해) _멋쟁이사자처럼 유니티 부트캠프 13회차 추가학습

@salmu2025. 6. 9. 15:30
반응형

[13회차 수업 내용]

1.핀볼게임

2.애니메이션

3.기타

 

1.1 Sprite란

Unity에서 2D 이미지를 게임 오브젝트로 만들기 위해 사용하는 형식
일반적으로 .png, .jpg 등의 이미지 파일을 Sprite 타입으로 임포트해서 사용

 

 

 

1.2 회전

public class PinballManager : MonoBehaviour
{
    public Rigidbody2D leftStickRb;
    public Rigidbody2D rightStickRb;
    
    void Update()
    {
        if (Input.GetKey(KeyCode.LeftArrow))
            leftStickRb.AddTorque(30f);
        else
            leftStickRb.AddTorque(-25f);
        
        if (Input.GetKey(KeyCode.RightArrow))
            rightStickRb.AddTorque(-30f);
        else
            rightStickRb.AddTorque(25f);
    }
}

 

* Rigidbody2D ->양수면 반시계 방향, 음수면 시계 방향 (Z축 기준 회전)

* 3D일 때는?  원하는 축 기준 회전 (Vector3.right, Vector3.up, Vector3.forward 등)

rb.AddTorque(Vector3.up * 50f);

 

 

 

 

 

1.2.1 회전에 대한 추가 학습 

 

AddTorque는 회전하는 힘을 주기 때문에 회전 가속도를 높인다.

 

* 왜 기본 위치 이상으로 넘어가진 않는가?

: 힘이 반대방향으로 아주 강하게 주면 넘어가지만, 적당한 힘이면 원래 위치로 돌아간다.

 

  • Rigidbody2DangularDrag(회전 감속 저항) 이 기본값으로 잡혀 있어서 외부 힘(토크)을 주지 않으면 회전하지 않음 

 

 

1.2.2 HingeJoint2D

: 2D 물체를 고정된 축을 중심으로 회전시키는 조인트로, 플리퍼, 문, 레버 같은 회전 오브젝트에 아주 적합

Use Motor 체크하면 모터 기능 사용 (자동 회전)
Motor Speed 회전 속도 (음수면 반대 방향)
Max Motor Torque 최대 회전 힘 (회전 강도)
Use Limits 회전 각도 제한 사용 여부
Angle Limits (Min/Max) 회전 가능한 최소/최대 각도

 

 = 각도 제한 가능한 관절

 

 

 

1.3. 충돌 & 점수 집계

public class Pinball : MonoBehaviour
{
    public PinballManager pinballManager;
    
    void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.CompareTag("Untagged") == false)
      	  {
            switch (other.gameObject.tag)
            {
                case "POINT10":
		            pinballManager.SetScore(10);
                    break;
                case "POINT50":
                    pinballManager.SetScore(50);
                    break;
                case "POINT100":
                    pinballManager.SetScore(100);
                    break;
                case "DROP":
                    pinballManager.GetScore();
                    break;
            }
        }
    }
}

 

public class PinballManager : MonoBehaviour
{
    public Rigidbody2D leftStickRb;
    public Rigidbody2D rightStickRb;

    private int scorePoint = 0;
    
    void Update()
    {
        if (Input.GetKey(KeyCode.LeftArrow))
            leftStickRb.AddTorque(30f);
        else
            leftStickRb.AddTorque(-25f);
        
        if (Input.GetKey(KeyCode.RightArrow))
            rightStickRb.AddTorque(-30f);
        else
            rightStickRb.AddTorque(25f);
    }

    public void SetScore(int point)
    {
        scorePoint += point;
        Debug.Log($"{point} 포인트 획득!!");
    }

    public void GetScore()
    {
        Debug.Log($"게임 종료 : 획득 포인트 {scorePoint}");
        Time.timeScale = 0f;
    }
}

 

 

1.3.1 Unity에서 충돌 객체 other

  • other 는 보통 Collision2D 또는 Collider2D 타입 변수명으로 사용
  • 예시
other.gameObject 부딪힌 상대 오브젝트
other.collider 충돌한 상대의 Collider
other.contacts 접촉 지점 정보들
other.relativeVelocity 충돌 시 상대 속도
other.rigidbody 충돌한 상대의 Rigidbody2D (있다면)

 

 

 

 

1.3.2. 색깔 바꾸기 코드 예시

using UnityEngine;

public class ChangeColorOnCollision : MonoBehaviour
{
    private SpriteRenderer sr;
    public Color hitColor = Color.red;

    void Start()
    {
        sr = GetComponent<SpriteRenderer>();
    }

    void OnCollisionEnter2D(Collision2D other)
    {
        if (sr != null)
        {
            sr.color = hitColor;
        }
    }
}

 

 

 

2. 애니메이션 

 

2.1 Unity에서 Pivot(축) 바꾸는 법 & Prefab 수정

  • Empty GameObject를 생성해서 원하는 위치에 배치
  • 움직일 오브젝트를 Empty의 자식으로 설정 : 축(pivot) 역할을 Empty가 대신함 → 회전/스케일 기준이 변경됨
  • Prefab을 수정하려면→ 원본 연결 해제 (깨짐) : 오브젝트 우클릭 → Prefab → Unpack Completely
  • 수정 후 다시 드래그해서 Prefab으로 저장 가능

 

 

 

2.2 애니메이션 파일 생성

  • Project 창에서 애니메이션 파일 생성 (Create → Animation)
  • 해당 오브젝트 선택 → Animation 창 열기
  • 자동으로 Animator 컴포넌트가 생성
  • 녹화 버튼 클릭 
  • 시작 프레임/끝 프레임 기준으로 동작 생성 (시작 상태는 생략 가능하지만 있으면 명확) 
  • 애니메이션 파일 선택 후 Inspector 창 → Loop Time 체크 해제

 

 

 

 

 

 

 

2.3 Trigger로 문 열고 닫기 (애니메이터 + 스크립트 연동)

 

 - 애니메이터에 Trigger 파라미터 만들기

  • 문 오브젝트에 Animator 컴포넌트가 있어야 함
  • Animator 창에서 상태(State) 연결

- 문 오브젝트에 콜라이더 설정

  • Box Collider (Is Trigger 체크)

- C# 스크립트 적용 (DoorEvent.cs)

public class DoorEvent : MonoBehaviour
{
    public Animator doorAnim;

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            doorAnim.SetTrigger("Open"); // 트리거 실행 → 애니메이션 전이
        }
    }

    void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            doorAnim.SetTrigger("Close"); // 트리거 실행 → 닫힘 애니메이션
        }
    }
}

 

  • Animator.SetTrigger("Open") → 애니메이터의 Open 트리거를 실행
  • OnTriggerEnter() / OnTriggerExit() 은 Unity가 자동으로 실행하는 콜백 함수

 

 

3.1 2D 환경에서 캐릭터가 돌아간다면 Rigidbody2D의 Z축 회전을 잠가서 고정

3.2 .활성화 상태 유지하면서 보이지 않게 하는 법 — SpriteRenderer 끄기

 

 

반응형
salmu
@salmu :: SMU 각종 기록

목차