https://www.youtube.com/watch?v=51sFAT2xZ40&list=PL412Ym60h6uvqYiCVKk5NiEFpDEwOMQFX&index=4

 

 

 


프로그래밍 디자인패턴

대상의 액션에 반응하는 로직을 만드는 Observer 패턴

 

 

옵저버 패턴 대표 예시 : 
버튼 누르면 이벤트 실행
사운드 재생
파티클 재생
애니매이션 재생

 

 

 

+

 

 

 

 


🧠 언제 씀?

체력 HP가 바뀌면 UI 자동 업데이트 

인벤토리 바뀌면 아이콘 자동 새로고침 

퀘스트 상태 변경 → 여러 시스템 자동 반응 

이벤트 중심 구조 만들 때 




✨ 확장 쉬움


→ “HP 바뀌면 이펙트도 나오게 해!”
→ Observer 하나 더 붙이면 끝


    void OnEnable()
    {
        Player.HpChanged += UpdateHpUI;
    }

    void OnDisable()
    {
        Player.HpChanged -= UpdateHpUI;
    }

이런식으로 
OnEnable() , OnDisable() 를 쓴다 함


+

 

 

용어 설명

 

Subject : 버튼이 될 대상

 

Observer : 버튼을 누르면 뒤따라서 플레이 되는 것

 

 

+

 

 

Subject 방송국

Observer 청취자

 

청취자 사이는 모름

방송국은 청취자 모름

 

청취자 가 방송국 을 일방적으로 앎

 

청취자는 계속해서 늘릴 수 있음

 

 

 

Subject  공격 명령 

ㄴ> 모션 실행

ㄴ> 플레이어 대기

ㄴ> 이펙트 실행

ㄴ> 데미지 전달

ㄴ> 적 넉백

 

 

+

 


델리게이트에 함수 덧붙이기
이거도 옵저버 패턴임

 

+

 

 

event Action 도 델리데이트다

 

다른 클래스에서 사용 못한다고 함

 

 

+

 

 

어웨이크 에선 사과 함수 실행 
ㄴ> 사과 함수 에서는 코루틴 실행
ㄴ> 코루틴 에서는 사운드 재생 

 

이렇게 꼬리를 물어 옵저버를 늘릴 수 있다



+

 

짜투리 정보

if (abc != null)
abc 가 있을 경우 라는 뜻


머시기 . code
머시기를 int 넘버로 쓰겠다는 뜻

+

 

 

인스펙터 창의 이벤트 도 델리게이트 비슷한 건데

인스펙터 창에서 사용 가능하다는 게 장점임

 

+

 

단, 옵저버 패턴도 단점도 있다

 

 

점점 꼬리가 추가되니까 복잡해짐

순서를 모름

메모리 누수

무한 뺑뺑이 주의

디버깅 추적 어려움

 

 

옵저버 패턴은 하나의 찰흙처럼 서로 붙어버림

꼬리를 너무 많이 만들다보면

모듈화 캡슐화가 힘들어짐

 

 

 

반응형
Posted by 이름이 익명
:

https://www.youtube.com/watch?v=qhtL9EYtB3Q

 

 

 


팩토리 패턴

객체 : 
분리된 오브젝트 명사 물체
또는
분리된 수식 구조 함수 를 뜻함


팩토리 패턴은 객체 생성을 위한 구조임



item manager 싱글톤 아래에
총의 사거리, 공격력, 탄환 등 속성을
다 때려 넣으면 
편하긴 한데
나중에 유지보수가 힘들어짐

그래서 item Factory 라고 따로 분리를 해서
더 좋은 환경을 만들음

구체적인 건 매니저가 하는게 아니라
팩토리에게 넘기는 것


 

구체적인 팩토리↘  

                             큰팩토리 i 인터페이스

구체적인 팩토리 ↗

 

구체적인 대상 ↘  

                              대상 i Product

구체적인 대상  ↗

 

 

 

콘크리트 팩토리가 자식, 그냥 팩토리가 부모.

콘크리트 팩토리가 상속 받는다

 

 

i 인터페이스 = 속이 빈 껍데기

product = 생성할 대상

콘크리트 = 구체적인 거

 

+

 

오브젝트 풀링 하고 팩토리 패턴 을 병행 하기도 한다

 

오브젝트 풀링 : 여러 프리팹 오브젝트를 복붙해서 생성. 비활성화 활성화 하며 재사용

 

팩토리 패턴 : 미완성 i인터페이스를 이용해 생산제작만 담당 하는 클래스를 나눔

 

+

 

 


static 
= 객체를 만들지 않아도 바로 쓸 수 있는 공용 기능
즉, 인스턴스 없이 호출 가능한 정적 메서드를 만드는 키워드
new 없이 사용 가능

이것들 묶어서 실행해줘! 라는 뜻
여러 개가 세트로 작동한다는 뜻

반응형
Posted by 이름이 익명
:

 
https://www.youtube.com/watch?v=51sFAT2xZ40&list=PL412Ym60h6uvqYiCVKk5NiEFpDEwOMQFX&index=4
 
 
명령 객체(Command)를 
저장·되돌리기·실행
커맨드 패턴(Command Pattern)*

“행동 + 필요한 모든 데이터” 를 하나의 객체로 싸서 택배 보내는 걸 의미함



누가 실행? 👉 Invoker
무엇을 실행? 👉 Command
실제 실행은 ? 👉 Receiver
 
 
Command (명령 자체) — 📄 지침서
Invoker (명령 예약 실행자) — 🕹️ 트리거
Receiver (실제 행동 담당자) — ⚙️ 실행
Client (세팅 담당) — 🧑‍💻 준비자


플레이어 이동, 애니 재생은 리시버 이다



왜 유니티에서 Command 패턴이 유용함?

✔ 여러 정보를 한 번에 넘기기 좋음

함수 파라미터 줄줄 쓰는 대신 Command 객체 하나.

✔ 입력 처리랑 실제 행동을 분리

Input → Command → 실행
(키보드/패드/UI 버튼 바뀌어도 행동 코드 수정 없음)

✔ Undo / Replay 쉽게 구현

Command를 리스트에 저장 →
되돌리기(Undo), 재생(Replay) 가능.

✔ AI / 스킬 시스템에 특히 강함

스킬 하나를 Command 로 만들면
데미지/ 효과/ 범위/ 시전자 등 모든 정보 패킹 가능.
 
+
 
undo 뒤로 가기
 
redo 뒤로 가기 취소
 
 
+
 
커맨드 객체는 아래 컨텐츠에 쓰일 수 있다
undo, redo, 시간여행 , 리플레이  , 따라쟁이 미믹몹
 
 
+
 

일반적으로 게임만들 땐
이렇게 인풋과 플레이어 이동만 연결함
 

 
커맨드 객체는 
거기서 더 나아가 인보커, 인터페이스, 커맨드 를 만듦
더 확장함
 
+
 
undo 매커니즘은 각각 다른데
이동 의 undo 가 가장 심플하다 함
 
공격 의 undo 는 데미지 되돌려주고 뭐하고 하는 구조라 함
 
+
 

 
언두 stack
리두 stack 각각 별개로 씀
 
스택은 후입후출
 
+
 
 

 
언두 리두 는 stack 이 아닌 queue 방식으로도 구현할 수 있다
선입선출 개념임
 
 
 
+
 

 
격투게임의 커맨드도 구현가능하다
→ → 공격키
이렇게 세 개의 커맨드 키를 순서대로 입력하면 기술이 나가게 할 수 있음
 
관련 용어는
command pattern combo , queue
 
 
+
 

 
스킬 하나마다 클래스를 따로 분리시켜야 좋음
 
스킬 추가가 쉬워서 확장성 있고
테스트 하기도 좋음
 
 
+



커맨드 패턴 요약

소분한다


대상과 명령을 같이 두지 않고 따로 둠
단일 책임 원칙
single responsibility principle

기존 코드 수정 필요없게 만듦
개방/폐쇄 원칙
open/closed principle


여러 요청들을 저장하고 로그로 기록 가능

결합하지 않아서 유연해짐


분리를 했기 때문에 재사용성을 높임
한 Command 클래스를 데이터만 바꿔서 계속 재사용




명령,호출,수신 
이렇게 나눠서 복잡해 보이긴 함

오버헤드 만드는 게 단점,
관리자 위에 관리자 이런 게 많아져서 복잡해지는 게 단점



+

오버헤드 뜻
overhead

추가 비용이 든다 
더 느려질 수 있다

호출이 너무 많아질 수 있다


 

반응형
Posted by 이름이 익명
:

https://www.youtube.com/watch?v=fYhS5RYsN0M&list=PL412Ym60h6uvqYiCVKk5NiEFpDEwOMQFX&index=3

 

 

쉐이더 그래프로

모자이크 효과를 나타냄

 

 

Resolution 의 Default 를 낮게 조작하여 픽셀화 시킨 것임

 

 

 

 

이미지의 가장자리는 마스크 기능을 이용하여

둥글게 처리 함

 

 

유리가 빛나듯 반짝이는 효과도

쉐이더 그래프로 구현한다

 

 

+

 

 

쉐이더 그래프의 시작

 

 

하이어라키 창 - 어셋 리스트 중 shader graph
- urp - canvas shader graph

를 만들어 시작한다

 


셰이더 만들어 진 것에
universal - material - canvas 로 변경해서 만들기도 한다

 

 

 

+

 

 

ui 용 쉐이더는

버텍스, 광원은 지원 불가능하다 함

 

 

+

 

 

ui 용 쉐이더는 Animation 창과 연동 안된다고 함

 

그래서 스크립트 로 대응해야 한다 함

 

 

 

그러나

 

 

https://assetstore.unity.com/packages/2d/gui/animate-ui-materials-253197?srsltid=AfmBOopyfm33bkGZyLIQKF1mmesb3e6aPJQ_ISXUPSkrRwJkxQB_E_Gq

외부 어셋
animate ui materials 를 이용하면

ui 용 쉐이더는 Animation 창과 연동 된다고 함

 

 

 

+

 

 

 

 

반응형
Posted by 이름이 익명
:

https://www.youtube.com/watch?v=RkJyyi6lmQ8&list=PL412Ym60h6uvqYiCVKk5NiEFpDEwOMQFX

 

 

 


물리 선을 생성해서 여기에 닿는 오브젝트가
뭔지 알아내는 용도



레이는 다른 오브젝트 감지를 위해 많이 쓰는 기능이다

 

 


원리는 콜라이더 가진 오브젝트를
레이저 형식으로 쏴서 검색하는 것


레이저 당할 오브젝트는 꼭 collider 컴포넌트를 가지고 있어야 한다



+



if (Physics.Raycast(transform.position, transform.forward))
{
    // 광선이 어떤 콜라이더에든 닿았을 때 실행되는 코드
    Debug.Log("Hit something!"); 
}

닿았는지(bool 값)만 확인하는 형태

 

 


+

 

 

Ray 의 방향이 올바른지

Ray 의 길이가 적당한지

 

 

 

해당 오브젝트의 Layer 가 제대로 설정되었나 확인하라

 



LayerMask 쓴다면,
Raycast 에서 maxDistance도 같이 써라

벽, 장식은 무시한 특정 대상으로 제한함
지정된 거리 이내만 검사험

+

 


Queries Hit Trigger 

Project Settings → Physics → Queries Hit Triggers

Trigger도 감지해야 하는 경우

Raycast나 Overlap이 너무 많은 Trigger에 걸려서 원치 않는 감지가 너무 많을 때



+



raycast 는 scene 창에서 보이지 않는다

Gizmos.DrawLine ( ) 함수를 쓰면 씬 창에서도 보인다


 

 

 

또는!

Analysis - Physics Debugger 를 활용하면 

실시간 모든 레이 캐스팅을 쉽게 확인 가능함

 

 

 

 

+

 

 

 

마우스 클릭 과 레이 캐스트 를 활용해서

월드 오브젝트를 클릭하는 상호작용 만들기

 

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
 // 마우스 위치에서 레이 생성

이걸 이용함


자세한 강좌 링크

https://cafe.naver.com/unityhub/146263?utm_source=youtube-dc&utm_medium=social&utm_campaign=kr_letyouknowanything_raycasting

반응형
Posted by 이름이 익명
:

https://www.youtube.com/watch?v=RkJyyi6lmQ8&list=PL412Ym60h6uvqYiCVKk5NiEFpDEwOMQFX

 

 



 FixedUpdate() 생명주기에 카메라 이동 코드를 넣을 것

예시

void FixedUpdate()
{
transform.position 
= Vector3.Lerp 
(transform.position, target.position + offset , 0.1f);
}



Vector3.Lerp (a, b, t)
                    시작, 도착, 보간값

lateupdate, update 생명주기에 카메라 추적하면 떨림이 생김


 FixedUpdate() 는

프레임 속도(FPS)에 독립적이며 
일정한 시간 간격(Time.fixedDeltaTime, 기본값 0.02초)으로 호출되어
물리 연산에 적합함


+


그럼 시네마신 사용시엔?

메인카메라 - cinemachine brain 컴포넌트를 
두 개의 update method 값을 FixedUpdate 로 변경하면 해결됨



 

반응형
Posted by 이름이 익명
:

https://assetstore.unity.com/packages/templates/systems/turn-based-strategy-framework-50282#description

 

Turn Based Strategy Framework | 시스템 | Unity Asset Store

Use Turn Based Strategy Framework from Crooked Head to elevate your next project. Find this & more 시스템 and templates on the Unity Asset Store.

assetstore.unity.com

 

유니티 버전 6.0  지원

 

링크에

문서,

데모 있음

 

 

+

 

 

Tactics Toolkit | 패키지 | Unity Asset Store

Use Tactics Toolkit from Lawless Games to elevate your next project. Find this & more 패키지 and templates on the Unity Asset Store.

assetstore.unity.com

https://assetstore.unity.com/packages/templates/packs/tactics-toolkit-238215

 

lawless 가 만든 거도 있는데

이건 구버전인 2021 버전만 지원

 

 

 

반응형
Posted by 이름이 익명
:

https://www.youtube.com/watch?v=aKSsXg3vHPg&list=PLO-mt5Iu5TeajtA5UQT7_2UjB7_dkGagU&index=8

 

 

지금껏 만든 게임 매니저 인스펙터창은 지저분하다

이걸 정리할 필요가 있다

 

 

 


헤더 어트리뷰트

[Header ( "원하는 이름" ) ]
이렇게 하면 컴포넌트에 주석처럼 이름 붙여짐

 


헤더를 이용해 구분지어 정리 함

 

 

 

인스펙터 창 퍼블릭 변수 순서는

직접 ctrl x 눌러서 잘라붙이기해서 순서 변경함

 

 

+

 


ui 사용하려면 스크립트 맨위 
네임스페이스 불러오기 해야함
using UnityEngine.UI;
강의에선 게임매니저 스크립트 속에 넣음

 

+

 

 


하이어라키 창 canvas - canvas scaler 컴포 -
ui scale mode  에선 세 가지 옵션이 있다

Constant Pixel Size 
픽셀 크기 고정
구버전 PC 창모드 게임 전용

Scale With Screen Size
기준 해상도(reference resolution)를 잡고
화면 크기에 따라 UI 크기를 비율로 조절
가장 많이 쓰는 모드
모바일, 태블릿, PC 모두 대응 가능

Reference Resolution 를 예: 1920×1080 이 값을 기준으로 UI를 그 크기로 맞춤

여기에 숫자를 크게 입력할수록 인게임 텍스트 글자수는 반비례 해서 작아보여짐

Constant Physical Size
UI를 실제 물리적 크기(cm, inch)로 맞춤
게임에서는 안씀


 

+

 

 

렉트 트랜스폼 기준점 변경시 쉬프트 알트 키 누르기

 

 

+

 

 

text legacy 에서

width height 신경안쓰고 0 0 으로 설정했는데

텍스트는 출력하고 싶으면

 

아래 H/V Overflow 를 Overflow 로 설정

지정 크기 밖으로 벗어나 글자를 출력한다는 뜻

 

+

 

    void LateUpdate()
    {
    }

생명주기 함수

Update 생명주기에서 만든 로직을 활용하고 싶을 때 씀

 

지금 강의에선 스코어 점수를 ui 에 연결하려 할 때 씀

 

+

 

        scoreText.text = score.ToString() ; 

int 변수를 스트링으로 바꾸려면 ToString 을 씀

 

 

+

 

 

분명 오위 정렬했는데 텍스트가 안 보인다

Alignment 를 바꿔줘야 함

그러면 삐져나갔던 폰트가 화면 안으로 잘 보이게 됨

 

 

+

 

PlayerPrefs

 =

소규모 저장소

 게임 설정을 적어두는 작은 메모지
딱 간단한 정보만 적어놓는 용도

 

PlayerPrefs 은 씬을 로드하거나 게임을 꺼도 데이터가 남아있음

언제 쓰면 좋음?

BGM 볼륨
마지막 스테이지 번호
최고 점수
닉네임
해상도 설정
옵션 ON/OFF

주의점
큰 데이터, 리스트, 세이브 파일용으로는 부적합
이건 JSON, BinaryFormatter, ScriptableObject 따로 써야 함

+

 

max score , 최고 점수는 
Awake 생명주기 에다가 만들자

 

+


HasKey()
저장된 데이터가 있는지 확인 하겠다


        if ( ! PlayerPrefs.HasKey("MaxScore") )
뜻은 MaxScore 라는 저장된 값이 없으면.. 라는 뜻

 

 

        if (!PlayerPrefs.HasKey("MaxScore"))
        {
            PlayerPrefs.SetInt("MaxScore", 0);
        }

MaxScore 라는 저장된 값이 없으면

0 으로 만들고 시작하겠다 라는 뜻

 

 

+

 

int maxScore = Mathf.Max(score, PlayerPrefs.GetInt("MaxScore"));
PlayerPrefs.SetInt("MaxScore", maxScore);


현재 점수(score) 와 저장된 최고 점수(MaxScore) 중에서
더 큰 값을 

maxScore 에 저장한다는 뜻

강의 내에선 이 로직을 게임 오버 하는 곳에 넣음

 

+

 

 

 subScoreText.text = "점수 :" + scoreText.text; 
점수 : 123
이런식으로 표시되게 함

 

 

+

 

 

using UnityEngine.SceneManagement;
재시작은 지금 씬을 다시 로드 하는 거임
씬을 불러오기 기능을 넣으려면 위의 네임스페이스를 써야 함

        SceneManager.LoadScene(0);  

씬 첫번째 걸 불러온다

 

+

 

씬 이름 알고 싶으면

프로젝트 파일 뒤지면 됨

Scenes 폴더 안에 있음

 

 

 

 

 


file - build settings - Scene List

  에서 씬이 인 게임에 포함되어있나 확인 가능

 

 

 

+

 

 

다시 하기 버튼 아래엔

on click 에 리셋 함수 연결

 

space 바 로 클릭 단축기 되는걸 없애려면

navigation none 으로 설정

 

+

 

게임 오버시

        bgmPlayer.Stop();

해서 브금을 끌 수 있다

 

 

+

 

다 완성 되면 아래 gif 같아짐

 

 

 

 

반응형
Posted by 이름이 익명
: