본문 바로가기
게임 개발(유니티)/멋쟁이 사자처럼 3기_회고록

[멋쟁이사자처럼 유니티 TIL] 2024_11_27(수) 강의 요약 및 정리

by goraku97 2024. 11. 28.

리지드바디 (Rigidbody) 

물리 계산을 하는 Component. Collider는 영역 / Rigidbody는 계산

 

Drag 

물체의 공기 저항 또는 유체 저항을 나타내는 값(0~ 이론적으로 무제한) 

값이 크면 물체가 빠르게 속도를 잃고, 값이 작으면 물체가 더 오래 이동을 유지

 

0 : 저항이 없음을 의미. 물체는 초기 힘에 의해 영구히 움직일 수 있음

0.1 ~ 0.5 (일반적인 범위) : 현실적인 움직임을 시뮬레이션할 때 자주 사용되는 값

1 이상 : 저항력이 커지고, 물체가 빠르게 감속하며 짧은 거리만 움직임.

무한대 : Drag 값을 극도로 높게 설정하면 물체가 움직이지 않거나 거의 즉시 멈춤.

 

 

Physic Material

충돌하는 물체의 마찰(정지와 움직임)과 튕김(충돌 후 반발력)을 설정

 

- Dynamic Friction (다이나믹 마찰력)

  물체가 움직일 때 적용되는 마찰 계수(0~1사이로 설정가능)

  값이 클수록 표면의 저항이 커져서 쉽게 미끄러지지 않음

 

- Static Friction (정지 마찰력)

  물체가 정지 상태에서 움직이기 시작할 때의 마찰 계수 (0~ 이론적으로 무제한)

  일반적으로 Dynamic Friction 보다 값이 높음.

 

 - Bounciness (튕김 탄성)

   충돌 후 물체가 얼마나 튕길지를 나타냄(0 ~ 1사이로 설정가능)

   0: 전혀 튕기지 않음 (비탄성 충돌), 1: 최대한 많이 튕김 (탄성 충돌)

 


[예제] 문(door) 애니메이션 만들기

* 애니메이션 구현시, 꼭 녹화버튼 누르고 끄기.

 

- 녹화하고자 하는 트랜스폼에, 오른쪽 마우스 Add Key 로 현재상태 저장

 

문이 열리는 효과를 구현하기 위해 Door를 선택해야함.
문은 한번만 열려야 하기 떄문에, Animation Clip의 Loop Time 에 체크 헤제

 

해당 스크립트를 Door_9_Milk 의 컴포넌트로 삼음

 

- public Animator animi

  // Animator 컴포넌트에 접근하기 위한 변수

  // public 이기 때문에, Inspector 창에서Animator 타입의 변수 설정 가능

 

- public void OnTriggerEnter(Collider other)

  // OnTriggerEnter(Collider other):

     다른 Collider가 이 객체의 Trigger Collider 안으로 들어올 때 실행

     (매개변수 other: Trigger에 들어온 물체의 Collider를 나타냄)

 

- if (other.CompareTag("Player"))

  // Trigger에 들어온 물체가 "Player" 태그를 가지고 있는지 확인

  // "Player" 태그를 가지고 있다면, 내부 코드 실행

   

    - animi.SetTrigger("Open")

      // Animator에서 Trigger 피라미터 "Open" 실행

 

- public void OnTriggerExit(Collider other)

  // OnTriggerExit(Collider other) :

     다른 Collider가 이 객체의 Trigger Collider 밖으로 나갈 때 실행

     (매개변수 other: Trigger에 들어온 물체의 Collider를 나타냄)

 

- if (other.CompareTag("Player"))

  // Trigger에 들어온 물체가 "Player" 태그를 가지고 있는지 확인

  // "Player" 태그를 가지고 있다면, 내부 코드 실행

      

    - animi.SetTrigger("Close")

      // Animator에서 Trigger 피라미터 "Close" 실행

 

[예제] 캐릭터 점프 구현

 

기존 Input Study 스크립트에 하기의 코드를 추가

 

  - public float jumpPower = 4f; 

    // jumpPower 의 초기값을 실수값 4f로 설정

    // public 이기 때문에, Inspector 창에서Animator 타입의 변수 설정 가능

 

  - public bool isGround = false;

    // 캐릭터가 바닥에 있는지 여부를 확인하기 위해 해당 변수를 선언

    // 이 변수는 캐릭터가 점프 가능한 상태인지(바닥에 닿아 있는지)

       또는 공중에 있는지를 구분하는 데 사용

 

   - private void Update() 에 Jump(); 함수 추가

    //  Update() 메서드에 Jump 함수를 추가시켜서 하기의 Jump() 메서드도

        매 프레임이 시작할 떄 적용될수 있도록 함

 

    - private void Jump()

    // Jump() 함수 안에 있는 코드를 실행

 

    - if(Input.GetKeyDown(KeyCode.Space) && isGround == true)

    // 스페이스 바를 누름과 동시에(Input.GetKeyDown(KeyCode.Space)) 

       땅에 있었다면(isGround == true), 하기의 코드를 실행.

       (&& 양 옆의 조건이 모두 true 여야 하기의 코드가 실행됨)

        

       - this.GetComponent<Rigidbody>()

          .AddForce(Vector3.up * jumpPower, ForceMode.Impulse);

     // Rigidbody 컴포넌트에 접근해서(GetComponent<Rigidbody>() ),

       위쪽방향(Vector3.up_ 0, 1, 0) jumpPower 를 곱함.

       그리고 물체의 속도를 즉각적으로 변화 시키는(ForceMode.Impulse)

       힘을 가함.(.AddForce)

       

       ** ForceMode.Impulse :

            물체의 속도를 즉각적으로 변화시키는 효과를 주고, 질량을 고려하지 않고 힘을 적용.

            물체에 큰 속도 변화가 필요할 때 유용하게 사용됨.

 

점프시 2단 점프를 방지하는 방법   

해당 스크립트를 Ground 오브젝트의 컴포넌트로 설정

 

- public void OnCollisionEnter(Collision collision)

  // 오브젝트와 충돌이 발생했을 때 실행되는 메서드

    ( collision은 Collision 타입의 매개변수 변수 이름으로, 충돌 발생 시 전달되는 객체)

     ( Unity의 물리 엔진에서 충돌 이벤트를 처리하기 위해 전달되는 파라미터)

 

- if (collision.collider.CompareTag("Player"))

  // Collision에 들어온 물체가 "Player" 태그를 가지고 있는지 확인

  // "Player" 태그를 가지고 있다면, 내부 코드 실행

 

- GameObject characterObj = collision.gameObject;

  // 충돌이 끝난 오브젝트를 GameObject 타입으로 가져옴.

  // collision.gameObject characterObj 로 사용할 수 있음

 

- characterObj.GetComponent<InputStudy>().isGround = true

  // characterObj 오브젝트의 InputStudy 컴포넌트에 접속해서(.GetComponent<InputStudy>())

      isGround  를 true 로 변경.

 

- public void OnCollisionExit(Collision collision)

  // 오브젝트와 충돌이 종료되었을 때 실행되는 메서드

    ( collision은 Collision 타입의 매개변수 변수 이름으로, 충돌 발생 시 전달되는 객체)

    ( Unity의 물리 엔진에서 충돌 이벤트를 처리하기 위해 전달되는 파라미터)

 

- if (collision.collider.CompareTag("Player"))

  // Collision에 들어온 물체가 "Player" 태그를 가지고 있는지 확인

  // "Player" 태그를 가지고 있다면, 내부 코드 실행

 

- GameObject characterObj = collision.gameObject;

  // 충돌이 끝난 오브젝트를 GameObject 타입으로 가져옴.

  // collision.gameObject  characterObj 로 사용할 수 있음

 

- characterObj.GetComponent<InputStudy>().isGround = false

  // characterObj 오브젝트의 InputStudy 컴포넌트에 접속해서(.GetComponent<InputStudy>())

     isGround  를 false 로 변경.

 

이렇게 코드를 설정하면, 땅에서 떨어졌을때는 점프를 더이상 못하고, 땅에 닿아아있을때만 점프가 가능

즉, 점프한 상태에서 계속해서 점프하는 상태를 막을 수 있음.


**** 게임 플레이시, 플레이어의 객체 Position Y축이 살짝 뜬 상태로 진행될때의 해결방법.

      - 플레이어 객체의 콜라이더 Center Y값에다가, 게임을 시작했을때 나오는 플레이어의

         Y축을 뺴거나(음수값이 나올때), 더하면(양수값이 나오면) 완전하게는 아니지만(Y 0값),

         바닥에 딱 달라붙게 할 수 있음.