캡슐화

캡슐에 넣는다는 뜻으로 코드의 각 부분이 알아야할 기본 수준의 접근 권한을 갖게 된다. -> 모든 것이 다른 모든 것에 접근하지 못하도록 해야한다.

* 그러나 지금 경우는 Enemy 클래스가 ScoreBoard 클래스에 영향을 주게 만들어야 함

 

Public vs Private

private로 작성한 메서드를 다른 메서드에서 접근하려고 하면 불가능하다.

public은 가능하다.

 

함수 사용 형식

접근제한자 반환형 함수이름 매개변수

public void GoRight(float speed) { 코드; }

 

실 사용 코드

public IncreaseScore 함수로 score에 점수를 더한다. (Enemy마다 다른 점수가 추가될 거니까 매개변수를 받았음)

IncreaseScore

FindObjectOfType<>();를 이용하는데 프로젝트를 둘러보고 발견하는 첫 타입을 불러온다.

FindObjectOfType

scoreBoard로 접근하여 public 함수인 IncreaseScore를 호출한다.

public 함수 호출

 

런타임 파티클 생성

오브젝트를 SetActive(false)하면서 파티클도 생성하고 싶을 때 코드로 런타임에 파티클을 불러오면 된다.

적 스크립트에 충돌시 Particle을 Instantiate()를 한다.

Instanciate()

그리고 파티클이 생성 시 Play 되는 걸 원하기 때문에 Play On Awake를 킨다.

Play On Awake

적 파티클 생성을 관리하기 위해 부모를 따로 지정하여 생성하고

부모 설정

각각 적들에게 인스펙터에서 드래그 앤 드롭으로 파티클과 부모 트랜스폼을 넣어준다.

드래그 앤 드롭
자가파괴

이후 파티클 프리펩에 자가파괴 코드를 넣어서 3초 뒤 파괴시킨다.(파티클 생성 후 3초뒤 파괴)

프리펩 자가파괴

* 적들은 파괴되면서 파티클을 생성하고(에너미 스크립트도 꺼짐) 일정 시간 뒤에 파티클도 꺼줘야하기 때문에 파티클 프리펩에 Self Destruct를 넣어줬다.

 

'유데미 강의 > C#과 Unity로 3D 게임 개발하기 : 아르곤 침공' 카테고리의 다른 글

TextMeshPro, Score UI 연동  (0) 2022.08.30
Public Method  (0) 2022.08.30
폭발 파티클 효과 만들기  (0) 2022.08.30
파티클 충돌 감지  (0) 2022.08.30
충돌과 트리거  (0) 2022.08.30

폭발 Material

기존 Material을 복사해서 쉐이더를 Standard Unlit으로 바꾼다.

폭발 Material 생성

이후 생성한 Material을 씬 창의 파티클 시스템의 Renderer의 Material에 넣어준다.

Particle System Renderer

 

폭발 파티클 Shader

Rendering Mode의 Opaque는 빛 반사가 없는 모드이고

Color Mode의 Overlay는 회색을 기준(0.5)으로 높으면 더 번지게 낮으면 선명하지만 대비되게 만들어준다.

* 여기선 색을 블렌딩하기 위해 Color로 해줬다.

Particle Shader

StartColor를 Gradient로 설정하면 위치에따라 색이 바뀐다. 

Gradient

Random Between Two Colors는 각 파티클마다 색이 하나지만 두 색 사이 색 값으로 정해진다.

Random Between Two Colors
사잇 값이 나온다.

 

폭발 설정

Particle System

- Duration 1

- Start Lifetime 0.2~1 랜덤 => Random Between Two Constants로하면 0.2부터 1까지 랜덤으로 수명이 정해진다.

Shape

- Sphere

- Radius 3.5

Emission

- Rate over time 1000

 

Trails 설정

trails 설정을 통해 더 역동적으로 보이게 되었다.

Trails

 

Noise 설정

Noise 설정을 통해 파티클에 패턴을 줄 수 있다.

Noise
구불구불

'유데미 강의 > C#과 Unity로 3D 게임 개발하기 : 아르곤 침공' 카테고리의 다른 글

Public Method  (0) 2022.08.30
런타임 파티클 생성  (0) 2022.08.30
파티클 충돌 감지  (0) 2022.08.30
충돌과 트리거  (0) 2022.08.30
헤더와 툴팁 속성  (0) 2022.08.29

파티클을 총알로 사용하기

해야할 것

1. 파티클 콜리전과 메시지 전송이 켜져 있는지 확인

파티클 콜리전

- Send Collision Messages가 체크 되어야 함

메시지 전송

Type

- Plane은 사용자가 정의한 평면 값으로 반사

- World는 월드에 대해 반사

Collision Type을 World로 했을 시

Min Kill Speed

- 총알이 튀기는 게 싫을 시 Min Kill Speed를 조정해주면 된다. (1이면 속도가 1보다 낮을 때 죽이지 마라)

Min Kill Speed

 

2. 타겟 Collider의 Trigger 끄기

- 타겟의 Collider가 Trigger면 통과해버림

Trigger 끄기

 

3. 타겟에 OnParticleCollision()을 사용하기

* 만약 충돌 체크가 여러 번 되어야 하는데 한 두 번만 된다면 파티클 시스템 컴포넌트의 StartSpeed를 낮추는 방법으로 해결될 수 있다.

OnParticleCollision()

'유데미 강의 > C#과 Unity로 3D 게임 개발하기 : 아르곤 침공' 카테고리의 다른 글

런타임 파티클 생성  (0) 2022.08.30
폭발 파티클 효과 만들기  (0) 2022.08.30
충돌과 트리거  (0) 2022.08.30
헤더와 툴팁 속성  (0) 2022.08.29
배열과 foreach문  (0) 2022.08.29

충돌

- Collider끼리 부딪치면 물리시스템이 충돌하면서 힘이 가해진다.

- 서로 밀어내려는 힘이 작용한다.

- 충돌하는 둘 중 하나는 Rigidbody가 붙어있어야 한다. -> Rigidbody가 물리 시스템에게 물리를 적용하라고 하기 때문

Terrain Collider

Terrain Collider에서 Enable Tree Collider를 키면 나무에도 Collider가 켜진다.

나무 Collider를 켰을 때 적이 죽지않는 문제가 발생할 수 있는데 이 경우는 나무 Collider를 꺼야할 수도 있다.

Terrain Collider

 

트리거

- 콜라이더가 겹치거나 만나는 순간 발동된다.

- Collider 컴포넌트의 Is Trigger을 활성화할 시 어디에 부딪혔을 때 튕겨나가지 않고 통과한다.

- 트리거 메시지를 전송해서 이에 따라서 트리거 메시지를 받으면 무엇인가를 할 수 있다.

- 충돌하는 둘 중 하나는 Rigidbody가 붙어있어야 한다. -> Rigidbody가 물리 시스템에게 물리를 적용하라고 하기 때문

 

Collision/Trigger Matrix

Collision/Trigger Matrix

Collision action matrix

  • 빈 공간은 이벤트가 없다는 뜻임
  • Static collider : 개체에 Collider가 있지만 Rigidbody가 없는 경우
  • Rigidbody Collider : Rigidbody와 Collider가 있는경우
  • Kinematic Rigidbody Collider : Rigidbody 옵션에 Kinematic이 활성화 되어있고 Collider가 있는 경우
  • Static Trigger Collider : Rigidbody가 없지만 Trigger가 켜져있는 경우
  • Kinematic Rigidbody Trigger Collider : 트리거도 켜져있고 Rigidbody의 Kinematic도 켜져있는 경우

'유데미 강의 > C#과 Unity로 3D 게임 개발하기 : 아르곤 침공' 카테고리의 다른 글

폭발 파티클 효과 만들기  (0) 2022.08.30
파티클 충돌 감지  (0) 2022.08.30
헤더와 툴팁 속성  (0) 2022.08.29
배열과 foreach문  (0) 2022.08.29
발사 Input System  (0) 2022.08.26

헤더

헤더는 보이는 것 처럼 머릿글같이 변수들이 대략 뭘 뜻하는지 개념적으로 묶어놓는 것이다.

헤더
헤더 인스펙터

* 기본적으로 변수 이전에 속성이 먼저 적용되므로 변수 이전에 속성을 적는다.

 

툴팁

툴팁은 인스펙터 창의 변수에 커서를 가져다 댔을 때 보이는 창이다. (설명 등 사용자가 기록)

툴팁
툴팁 2

이런 식으로 작성해놓으면 나중에 봤을 때도 이해하기 쉽다.

헤더와 툴팁

 

'유데미 강의 > C#과 Unity로 3D 게임 개발하기 : 아르곤 침공' 카테고리의 다른 글

파티클 충돌 감지  (0) 2022.08.30
충돌과 트리거  (0) 2022.08.30
배열과 foreach문  (0) 2022.08.29
발사 Input System  (0) 2022.08.26
중첩 프리펩  (0) 2022.08.26

배열

변수가 상자라고 할 때 상자를 보관하기 위한 상자를 배열이라고 생각하면 된다.

- 배열은 같은 타입의 여러 개체를 하나의 변수에 저장할 수 있게 해준다.

- 타입[] 변수명 = { }; 으로 사용하거나 (넣을 요소가 있을 때)

- 대괄호 안에는 인덱스가 들어가는데 0번부터 시작된다. 

string[] names = { "Rick", "Ben", "Gary" };
// names[0] == "Rick" --> true
// names[1] == "Ben" --> true
// names[2] == "Gary" --> true

배열 선언

 

 

Foreach문

컬렉션을 가로지르기 위한 흐름 제어문이다. => 컬렉션에 있는 모든 것에 가서 무엇인가 해라

foreach (오브젝트타입 item in 변수명) { 실행구문; } --> item은 컬렉션의 개별 요소(사용자 변수명), in 뒤의 변수명은 컬렉션 변수명을 의미

fire버튼이 눌렸을 시 foreach문을 돌아 배열 안의 파티클 오브젝트들을 키고 뗐을 시 끄는 기능이다.

Active Deactive
foreach

 

리팩토링

true false만 다름

위와 같이 함수가 두 개고 true와 false 값만 다를 때

리팩토링

하나의 함수에 매개변수를 전달하는 식으로 코드를 줄일 수 있다.

* 파티클 시스템의 모듈들은 프로퍼티 타입이라 가져올 수 없는데 컴포넌트이기도 해서 변수에 넣어놓고 사용하면 된다.

'유데미 강의 > C#과 Unity로 3D 게임 개발하기 : 아르곤 침공' 카테고리의 다른 글

충돌과 트리거  (0) 2022.08.30
헤더와 툴팁 속성  (0) 2022.08.29
발사 Input System  (0) 2022.08.26
중첩 프리펩  (0) 2022.08.26
레이저 총알 파티클  (0) 2022.08.26

Button 입력 받는 방법

inputAction 변수를 선언하고

InputAction

OnEnable()과 OnDisable()에서 활성화와 비활성화를 해주고

활성화 비활성화

Button Type으로 정하고 원하는 키에 바인딩한 뒤 (여긴 Space)

Space
Button

Update문에서 IsPressed()로 눌러졌을 때 사용하면 된다.

IsPressed()

* 추가로 GetButtonDown처럼 효과를 주고싶으면 wasPressedThisFrame을 사용하고

GetButtonUp처럼 효과를 주고싶으면 wasReleasedThisFrame을 사용하면 된다.

wasPressedThisFrame
wasReleasedThisFrame

 

결과

* 이후에 바인딩 하는 버튼을 Left Button (Mouse)로 바꿨다

실행 결과

'유데미 강의 > C#과 Unity로 3D 게임 개발하기 : 아르곤 침공' 카테고리의 다른 글

헤더와 툴팁 속성  (0) 2022.08.29
배열과 foreach문  (0) 2022.08.29
중첩 프리펩  (0) 2022.08.26
레이저 총알 파티클  (0) 2022.08.26
게임 플레이 조율하기  (0) 2022.08.26

중첩 프리펩

Cyclic nesting detected 에러

프리펩은 자기 자신의 자식이 되지 못한다. 

- 인스턴스에서는 가능하지만 프리펩에서 하면 연결점들이 다 고장나서 불가능하게 되어있음 (자기 자신 아래에 자기 자신이 있어야하고 그 아래에 자기자신이 있어야하고.....)

에러

 

부모 프리펩의 스케일이 1이 아닐 때

프리펩의 부모 오브젝트에서 가능하다면 스케일을 모두 1로 고정하는 게 좋다. 왜냐

부모 프리펩 스케일이 1이 아닐 때

자식 프리펩을 회전하면 깨지기 때문이다. 부모 스케일을 1로 어떻게 만들까?

자식을 회전

월드에 Empty Object를 생성하여(스케일 1,1,1) 그 자식으로 Cube와 Capsule을 놓으면 된다.

부모 스케일이 1이니 깨지지 않고 회전할 수 있다.

* 프리펩 월드로 갔을 때 Context : Normal을 선택하면 기본 씬에 있는 것처럼 보이게 된다.

Context : Normal

 

모든 프리펩의 속성을 수정하고 싶을 때

부모에 있는 자식 캡슐에 그냥 색을 입히고 Override 하더라도 독립적인 원본 프리펩에는 그 정보가 적용되지 않는다.

프리펩의 전체를 수정할 때는 해당 오브젝트의 프리펩 모드로 들어가 수정하는 게 좋다.

프리펩 전체 수정하기
수정 후

 

기존 프리펩으로 새 프리펩 만들기

캡슐을 변형하고 프로젝트 창으로 드래그 앤 드롭을 하여 Original Prefab을 만들었을 때 이전에 있던 원본 프리펩을 삭제해도 원본 인스턴스는 씬에 남아있다.

Capsule 1 생성 후 Capsule 삭제
프리펩이 아닌 인스턴스로 남아있음

이 게임 오브젝트를 프로젝트 창에 드래그 앤 드롭하면 다시 프리펩으로 만들 수 있음

다시 프리펩화하기

씬에 있는 프리펩을 Unpack을 하면 이 해당 오브젝트는 인스턴스가 되고 프로젝트 창에 프리펩은 남아있음 

해당 오브젝트만 인스턴스화 하는 것임

Unpack
인스턴스화

 

복습

프리펩 인스턴스에서 많은 걸 바꾸고 부모에서 Override 하더라도 프로젝트 창 기존 프리펩에는 연동이 안 될 경우 인스턴스를 Original Prefab으로 만들고 이것을 기준으로 다른 프리펩도 설정해준 뒤 (왼쪽 프리펩이라면 오른쪽 프리펩도 Original Prefab으로 만든 걸로 복사해줘야함) 기존에 있던 프로젝트 창의 프리펩은 제거해준다. => 옛것을 버리고 최근거를 원본 프리펩으로 만드는 것 

구버전 프리펩 교체

프리펩에서 컬러 변경시 같이 바뀜

교체 완료

 

'유데미 강의 > C#과 Unity로 3D 게임 개발하기 : 아르곤 침공' 카테고리의 다른 글

배열과 foreach문  (0) 2022.08.29
발사 Input System  (0) 2022.08.26
레이저 총알 파티클  (0) 2022.08.26
게임 플레이 조율하기  (0) 2022.08.26
플레이어 회전  (0) 2022.08.26

총알 파티클

Particle System

- Duration : 쏘는 시간(몇 초 동안 쏠 지)

- Looping : 반복할 지 말지

- Start Lifetime : 생성되고 난 후 수명(얼마동안 존재할 지)

- Start Speed : 속도

-Simulateion Space : Local이면 상대위치, World면 절대위치

Emission

- Rate over Time : 초당 얼마나 생성 될 지

ex) lifeTime 1초동안 Speed 20이니까 20만큼 움직인다.

Particle System

발사된 레이저 파티클이 함선을 따라다니는데 레이저 파티클은 따로 있게 하려면 Simulation Space를 Local에서 World로 바꿔주면 된다.

파티클이 부모 위치를 따라감
파티클이 월드 기준으로 움직임

Trails 모듈은 파티클이 지나간 자리에 자국이 남음

Trails

핑크색은 보통 null 값을 사용할 때 뜸

핑크색 레이저

Trail Material을 수정하면 해결된다.

Trail Material

레이저처럼 보이기위해 Size Affects Width를 끄고

Size Affects Width

Start Size를 0으로 만들어줬다.

Start Size

'유데미 강의 > C#과 Unity로 3D 게임 개발하기 : 아르곤 침공' 카테고리의 다른 글

발사 Input System  (0) 2022.08.26
중첩 프리펩  (0) 2022.08.26
게임 플레이 조율하기  (0) 2022.08.26
플레이어 회전  (0) 2022.08.26
플레이어 이동하기  (0) 2022.08.25

+ Recent posts