겜프_기말 정리

CJB_ny·2022년 6월 14일
1

시험 범위 : 중간고사 이후 부터 ~ 배운데까지 / PPT (구글 슬라이드 내용)

  1. 주인공 캐릭터 제작.PPT
  2. 카메라 이동.PPT
  3. 주인공 캐릭터 애니메이션.PPT
  4. 그림자.PPT
  5. 발사체 제작 및 이펙트.PPT
  6. 적 캐릭터 제작.PPT
  7. 유니티 UI

시험 내용

1. 유니티 스크립트에서 사용하는 주요 오버로딩 함수 정리

  • 메소드 오버로딩

    메소드 오버로딩은 함수이름이 같을 경우

    void Add();
    void Add(int a, int b);

    이런게 메소드 오버로딩이다.

  • 메소드 오버라이딩

    메소드 오버라이딩은
    부모 클래스에서 proteced void Add(); 선언 할 경우
    이 부모 클래스를 상속받는 자식 클래스에서
    protected override Add(); 가
    메소드 오버라이딩이다.

    부모에서 정의된 멤버 메서드를 자식에서 재 정의하는 것을 의미합니다.

따라서

유니티에서 자주 사용하는 메소드 오버로딩은

Awake()

  1. 스크립트가 실행될 때, 한번만 실행이 되는 함수.

  2. cs파일이 비활성화 되어 있어도 호출됨.

  3. 코루틴으로 실행 불가능 함.

Start()

  1. Update가 호출되기 전에 한번만 호출

  2. 스크립트(cs파일)이 활성화 되어 있어야 실행 됨.

  3. 다른 스크립트의 모든 Awake가 실행된 후에 실행이된다.

  4. 코루틴으로 실행이 가능하다.

Update()

  1. 프레임마다 호출 되는 함수.

  2. 스크립트가 활성화 되어 있어야함.

LateUpdate()

  1. 모든 Update가 호출되고 나서 마지막에 한번씩 호출

  2. 순차적으로 실행해야하는 로직에 사용한다.(카메라 같은 경우)

  3. 카메라 이동 로직에 주로 사용 하는 함수이다.

  4. 마찬가지로 스크립트가 활성화 되어 있어야함.

FixedUpdate()

  1. 주로 물리엔진을 사용하는 경우 일정 시간 간격으로 힘을 가할 때 사용하는 함수

  2. 발생하는 주기 일정

OnEnable()

  1. GameObject or script 활성화 할 경우 사용

  2. 이벤트 연결시 사용

  3. 코루틴 사용 불가능.

OnDisable()

  1. 오브젝트 비활성화 할 경우 사용

  2. 이벤트 연결 종료 할 경우

  3. 코루틴 사용 불가능

OnGUI()

  1. 레거시 GUI 관련 함수를 사용할 경우 사용

2. 카메라 따라가기 구현 방법 3가지 내용 정리

방법 1. 카메라의 위치를 플레이어의 일정거리 만큼 위치 시키기

여기다가 LateUpdate를 통해 흔들리지 않도록 해줌
Update가 호출 되고나서 호출 되니까

방법 2. 선형 보간 (Lerp), 구면 선형 보간 (Slerp) 사용

Lerp/Slerp : 시작점과 끝점 사이의 특정 위치 값을 추출 해 낼 때 사용.
이러한 보간 함수는 "현재값"을 목표값으로 변경할 경우 갑자기 변경하지 않고 부드럽게 변경하고 싶을 경우 사용한다.

Lerp : 균일한 속도로 이동(회전)시킬 때 사용

Vector3.Lerp(시작값, 종료값, t)
Mathf.Lerp(시작값, 종료값, t)
Quaternion.Lerp(시작값, 종료값, t)

Slerp : 시작점과 종료점은 느리게 증가하고 중간 지점은 동일한 시간대에 이동할 거리가 커지므로 빠르게 이동(회전). 주로 회전 로직에 사용

Vector3.Slerp(시작값, 종료값, t)
Quaternion.Slerp(시작각도, 종료각도, t)

방법 3. SmoothDamp 사용

Vector3.SmoothDamp()
current : 시작위치
target : 목표 위치
currentVelocity : 현재 속도
smoothTime : 목표위치까지의 도달 시간
maxSpeed : 최대 속력 제한 값(기본값 : 무한대 Mathf.Infinity), 생락가능
deltaTime : 프레임 보장을 위한 델타 타임(기본값 : Time.deltaTime), 생략 가능


이런식으로 사용한다.

3. 카메라 따라가기를 구현해야 하는 함수 및 이유 설명

Update를 통해 카메라를 설정을 한다면
매 프레임 호출되는 기본적인 Update 함수로, 프레임마다 전체 시스템에서 수행되는 작업의 양이 매번 다르므로 Update가 호출되는 주기가 일정하지 않다.
즉 성능이 좋은 컴퓨터는 깜빡히는 횟수(프레임)이 많고, 성능이 안좋은 컴퓨터는 화면 깜빡이는 횟수(프레임 수)가 적다.

그래서 Update에서 직전 프레임이 완료되는 데까지 걸린 시간 즉, 현재 프레임과 이번 프레임 사이 시간을 반환하는 Time.deltaTime을
Update 함수가 호출 되고 나서 호출이 되는 LateUpdate에다가
Time.deltaTime 60 or Time.deltaTime 30
60프레임이나 30프레임 (== 결과값을 곱해 준다) 그러면 한번 실행할 때 얼마만큼 실행을 할지 정해진다.

4. 그림자 구현 방법 3가지

실시간 그림자 => 많은 부화

그렇기 때문에 그림자 효과가 필요 없는 3D 모델은 실시간 그림자를 처리 하지 않도록 하는 옵션을 반드시 검토해야 함.

3D 모델은 아래 두 개의 컴포넌트를 반드시 포함하고 있다.

  • Mesh Renderer
  • Skinned Mesh Renderer

위의 두 개의 컴포넌트에는 실시간 그림자와 관련된 속성이 있음.

  • Cast Shadow : 물체의 그림자를 그릴 것인가에 대한 여부
    off : 그림자를 만들지 않음
    on : 그림자를 만듬

  • Two Sided : 백페이스 컬링을 무시하고 그림자를 양면으로 만듬
    Quad 같은 단면만 렌더링 하는 모델의 경우 Cast Shadow 속성을 On 으로 해도 그림자가 만들어 지지 않음. 그렇기 때문에 Two Sided로 설정하면 그림자를 생성할 수 있다.

  • Shadow Only : 그림자를 만들지만 자신은 렌더링 하지 않음. 즉, 화면에 보이지 않는 특성이 있어 그림자 처리만을 위한 3D 모델에 활용할 수 있음
    Receive Shadows : 이 물체의 표면에 다른 물체의 그림자를 그릴것인가에 대한 여부

방법 1. Mesh를 이용한 그림자.

방법 2. Project를 이용한 그림자.

바업 3. Projector를 이용한 그림자.

5. Z-Fighting 현상이란?

== 그림자 폴리커 현상

매쉬A와 매쉬B의 깊이(뎁스)가 동일하거나 유사하여 무엇이 우선으로 렌더링 되어야할지 모르는 상황이 발생하게 되면 매쉬A와 매쉬B가 겹쳐보이는 현상

출처: https://chipmunk-plump-plump.tistory.com/350 [다람쥐와 포동포동이:티스토리]

< 해결법 >
1. 렌더링의 우선순위를 값을 조정한다. (확 차이가 나게)
2. 매쉬A와 매쉬B의 거리를 벌린다.
3. 유니티에서는 카메라의 Near를 올리고 Far를 낮춰 정확도를 올려준다.
4. 마찬가지로 유니티에서 Near / Far = 정밀도인데, 모바일에서는 소수점을 잘라버리기 때문에
애초에 소수점이 나오지 않도록 Near와 Far를 조정해준다

출처: https://chipmunk-plump-plump.tistory.com/350 [다람쥐와 포동포동이:티스토리]

6. 총알 발사 방식 2가지

방법 1. Projectile 방식

총알이 물리적으로 발사되는 방식으로 총알이 직접 날아가 적에게 타격을 입힌다. 따라서 당연히 총알이 시각적으로 표현되지만, 짧은 시간동안 여러개의 총알을 생성하게 되면 게임의 속도가 저하되는 단점이 있음. 따라서 총알은 일반적으로 로우폴리모델이나 Panel Mesh 모델에 텍스쳐를 입혀 사용한다. 총알 역시 동적으로 생성하기 보다는 오브젝트 풀(Object Pool)개념을 도입해 총알을 미리 생성해두고 번갈아 가며 발사되도록 구현하는 편이 속도 향상에 유리하다.

방법 2. Ray cast 방식

FPS게임에서 저격용 총의 발사 루틴을 구현하는데 자주 활용된다. 실제 총알이 발사되는 방식이 아니라 레이저 빔과 같이 눈에 보이지 않는 선을 발사해 적 또는 물체를 검출하는 방식임. 즉, 총을 쏘면 총구 화염이 표시됨과 동시에 멀리 떨어져 있는 적이 피격되는 효과를 연출할 수 있다.

( 근데 레이 쓰면 쏘자 마자 맞는 현상이 발생함. )

7. 충돌 함수 정리 (6가지)

충돌 감지 조건

1. RigidBody

유니티에서 게임 오브젝트를 이동할 때 보통 Transform의 Position 속성을 이용하거나 Rigidbody컴포넌트를 추가해 물리 시뮬레이션을 이용함
Rigidbody컴포넌트를 게임오브젝트에 추가하면 해당 게임오브젝트는 물리엔진의 영향을 받음

2. Collide

Collider컴포넌트는 충돌을 감지하는 일종의 "센서"

  • Box Collider
    가장 일반적인 충돌 체크 (건물등에 사용)
  • Sphere Collider
    가장 처리속도가 빠름
  • Capsule Collider
    주로 Player나 적 캐릭터의 충돌체로 사용할 때가 많음
  • Mesh Collider
    충돌 감지를 위한 CPU부하가 제일 많은 Collider
  • Wheel Collider
    차량의 바퀴에 사용할 목적으로 제공되는 Collider
  • Terrain Collider
    지형의 충돌을 위한 Collider

충돌함수 6가지

  • IsTrigger : Off

    OnCollisionEnter()
    OnCollisionStay()
    OnColiisionExit()

  • IsTrigger : On

    OnTriggerEnter()
    OnTriggerStay()
    OnTriggerExit()

8. Trail Renderer 컴포넌트란?

트레일 렌더러란?

Scene의 GameObject가 움직일 때 뒤에서 트레일을 만드는데 사용을 한다.
ex) 총알 발사체 제작할 경우

이 컴포넌트는 유니티에서 제공하는 기본 컴포넌트이다.

9. OverlapShpere() / AddExplosionForce() 함수 정리

https://makerejoicegames.tistory.com/152

이거 보고 이해 ㄲ

OverlapSphere()

Physics.OverlapSphere - 중점과 반지름으로 가상의 원을 만들어 추출하려는 반경 이내에 들어와 있는 콜라이더들을 반환하는 함수.

함수의 반환 값은 Collider 컴포넌트의 배열로 넘어옵니다.

또한 OverlapSphere 함수는 특정 레이어만 검출할 수도 있어요.

https://a-game-developer0724.tistory.com/54

AddExplosionForce()

AddExplosionForce=> 폭발력을 전달하는 함수=> rigidbody.AddExplosionForce(폭발력, 원점, 반경, 위로 솟구치는 힘)

ex)

Collider[] cols = Physics.OverlapSphere(tr.position, 10.0f);

foreach(Collider col in cols)
{
	if(col.rigidbody != null)	
    {
    	col.rigidbody.AddExplosionForce(300.0f, tr.position, 10.0f, 300.0f);
    }
}
    

10. 메카님 애니메이션과 레거시 애니메이션 정리

https://you-rang.tistory.com/65

메카님

유니티의 애니메이션 상태머신 시스템, 애니메이션 미들웨어 엔진.
FSM 상태에 따라 적절한 애니메이션 조작을 메카님을 이용하여 구현함.
시각적인 설계방식을 제공함.

Humanoid Type vs Generic Type

  • Humanoid : 팔(2개), 다리(2개), 머리(1개)를 가진 인간형 캐릭터 -> "리타겟팅(ReTargetting)" 시스템을 사용하여 애니메이션을 공유 할 수 있음
    예) 오크/ 엘프/ 사람 … 같은 애니메이션 공유

  • Generic : 인간형을 제외한 4족 보행동물, 슬라임과 같은 기타 메시등을 일컬음

리타겟팅 기능이 제공되지 않고 메카님을 이용하여 애니메이션 처리

메카님 장점 : 리타겟팅 가능

리타겟팅 : 다른 애니메이션 동작을 가지고 와서 적용이 가능

메타님 애니메이션에서 리타게팅을 사용하려면 모델과 애니메이션 클립의 Animation Type 둘다 Humanoid 로 설정이 되어 있어야 함

레거시

3D 애니매이션 Tool 사용

  1. 모든 애니메이션 클립이 한 파일에 들어있고, 시작프레임과 종료프레임을 가져 개발자가 직접 분리하여 사용함.

  2. 모든 애니메이션 클립이 한 파일에 들어있고, 분리되어 있는 상태

  3. 클립을 동작별로 분리해서 별도의 파일로 생성 (수정이 많다면)

11. 휴머노이드, 제너릭, 리타겟팅 등

    1. 휴머노이드 : 팔(2개), 다리(2개), 머리(1개)를 가진 인간형 캐릭터
    1. 제너릭 (Generic) : 인간형을 제외한 4족 보행동물, 슬라임과 같은 기타 메시등을 일컬음
    1. 리타겟팅 : 다른 애니매이션 동작을 가져와서 사용이 가능

12. 애니메이션 콘트롤러 / 애니메이션 / Has Exit Time / Conditions 변수

    1. Animation Controller : 메카님 애니매이션을 사용하는 경우 붙어있는 컴포넌트이다.
      메카님을 적용한 모델에 애니메이션을 적용하고, 특정 조건에 따라 다른 애니메이션 상태로 전이하는 규칙을 설계할 수 있다.
    1. 애니매이션 : 레거시 애니매이션을 사용하는 경우 Animation Tool을 사용한다.
    1. Has Exit Time : 속성이 체크되면 즉각적인 상태 전이가 일어나지 않고 애니메이션이 다 끝난 다음 다음 상태로 변경 됨, 화살표를 클릭하면 Inspector창에서 확인 가능함
    1. Conditions 변수 : IsTrace 변수에 true로 설정
      IsTrace 변숫값이 true가 되면 바로 전이를 발생시키기 위해 Has Exit Time 속성을 언체크 함

13. FSM 알고리즘 이해 (PPT 31~ 46) -> 소스코드 채워넣기

FSM : 유한 상태 머신

FMS은 자신의 상태 값을갖고 있어야 하며, 현재 어떤 상태인지 갱신하고 해당 상태에 맞는 행동을 취해야한다.

적 캐릭터의 상태를 Idle, Walk, Attack, Die로 정의한다.

내가 하던거

14. SendMessage() / SendMessageOptrions.DontRequireReceiver

몬스터 공격 중지 할 경우

  • PlayerDie() 함수 업데이트

  • SendMessage : 첫번째 인자로 전달한 함수명과 동일한 함수가 해당 게임오브젝트의 스크립트에 있다면 실행하라.

  • SendMessageOptions.DontRequireReceiver : 호출한 함수가 없더라도 함수가 없다는 메세지를 반환하지 않겠다. -> 빠른 실행을 위해서 반드시 필요함

15. 델리게이트와 이벤트(PPT 38) -> 소스 코드 채워넣기

16. Canvas / EventSystem /

  • canvas

    Canvas 객체는 Canvas 컴포넌트를 자체 포함하고 있는 게임 오브젝트임.
    모든 UI 항목(UI Element)은 반드시 Canvas객체의 하위에 위치해야 함.
    Rect Transform 컴포넌트를 가짐.
    Canvas 객체의 하위로 차일드 함.
    EventSystem 객체도 자동 생성.
    EventSystem 객체는 시스템에서 발생하는 키보드, 조이스틱, 스크린 터치 등의 입력 정보를 Canvas하위에 있는 UI 항목에 전달하는 역할을 담당.

    Canvas 컴포넌트는 Render Mode에 따라 3가지 옵션에 따라 화면 배치 방식을 다음과 같이 정의할 수 있다.

    Screen Space - Overlay : 일반적인 방법
    Screen Space - Camera : 카메라를 하나 더 두어 입체적으로 구현
    World Space : VR에서의 HUD 같은 UI 구현

  • Eventsystem

    이벤트 시스템은 UI에 대한 이벤트를 담당하고 있다.

이 객체의 생성 방법은 이렇다.

GameObject -> UI -> Canvas를 눌러 생성하면 자동으로 생성된다.

EventSystem 객체는

  • EventSystem.

  • Standalone Input Modult.

  • Touch Input Module

컴포넌트를 포함하고 있다.

profile
공부 일기장으로 변해버린 블로그 (https://cjbworld.tistory.com/ <- 이사중)

0개의 댓글