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

 

 

참고로

ios, 모바일, 애플, xr, vr, 2021년 이하 버전 은 듣지 말기

 

 

 

+



 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 이름이 익명
:

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

 

 

오브젝트 풀링 뜻

 

손님이 많이 올 것 같아서 닭꼬치를 미리 만들어둠

손님이 올 때마다 새로 만들면
⏱️ 시간 오래 걸리고
🔥 가게가 엉망 됨 (= 성능 저하)

닭꼬치 미리 몇 개 만들어서
따뜻한 곳(= Pool)에 보관함.

 

+

 

 

Destroy() 대신 SetActive(false) 후 Pool로 귀환
GC(쓰레기 수집) 문제 줄어듦

재활용해서 빠르고 가볍게 쓰는 시스템

 

+

 

instantiate , Destroy 를 쓰다보면 파편화 된 메모리 때문에

나중에 문제가 생김

 

 

+

 

 


오브젝트 풀링의 시작 : 

using System.Collections.Generic;
네임스페이스 불러오기

    public List<Dongle> donglePool;
퍼블릭 리스트 변수 선언

 

    public int poolSize;
풀 사이즈 변수 선언

 

    [Range(1, 30)]
빨간줄 에러 뜸
    [UnityEngine.Range(1, 30)]
이렇게 변경하기
이 변수는 1~30 사이 값만 입력하게 해줘 라는 뜻

 

    [UnityEngine.Range(1, 30)]
    public int poolSize;

이렇게 풀 사이즈위에 레인지 넣기

 

+

 

 



 

레인지 넣으면 저렇게 컴포넌트에 슬라이더가 생김 1부터 30까지 조절 가능

 

+

 

 

    public int poolCursor;

풀커서 라는 변수를 선언함

 

 

커서 변수의 역할은 특정 숫자를 지칭하는 용도임

 

 

+

 

 

    void Awake()
    {
        donglePool = new List<Dongle>();
        effectPool = new List<ParticleSystem>();
    }

 

풀 을 이렇게 어웨이크에서 초기 작업

 

+

 

    Dongle GetDongle()
    {
        for (int index=0; index < donglePool.Count; index++ )
        {
            poolCursor = (poolCursor + 1) % donglePool.Count;
            // 풀 크기가 10 이면 0부터 9까지 반복
            if( ! donglePool[poolCursor].gameObject.activeSelf )
            {
                return donglePool[poolCursor];
            // 쉬고 있는 걸 쓰기
            }
        }

        return MakeDongle();
    }

 

 

 

놀고 있다면 그 노는 걸 쓴다는 뜻

 

상자 다 쓰고 있다면

새로운 상자를 만든다는 뜻

 

개수가 많으면

한계 개수를 초과해서 새 인스턴스 를 만든다는 뜻

 

 

+

 

 

 


다시 재활용하려고 하니
없어졌던 위치에 있음
서로 겹치는 의도치 않은 버그 발생


동글 hide 코루틴 부분에서
        gameObject.SetActive(false);
이렇게 액티브 오프 만 할 게 아니라
모든 정보를 초기화 시켜야 해결됨

 

  void OnDisable()

비활성화 될 때 실행되는 함수로직

이걸 쓰면 됨

 

 

    void OnDisable()
    {
        level = 0;
        isDrag = false;
        isMerge = false;
        isAttach = false;
        transform.localPosition = Vector3.zero;
        transform.localRotation = Quaternion.identity;
        transform.localScale = Vector3.zero;
        rigid.simulated = false;
        rigid.linearVelocity = Vector2.zero;
        rigid.angularVelocity = 0;
        circle.enabled = true;
    }

 

그래서 이렇게

레벨, 불값 변수들 , 트랜스폼, 리지드바디, 활성화여부 전부 초기화 시킴

 

 

void OnDisable() 는 따로 호출할 필요가 없다

 

 

+

 

오브젝트 풀링에서 반드시 주의해야 할 것들

👉 풀에서 꺼낸 후 SetActive(true)
👉 다시 쓸 때는 SetActive(false)

[쉬는중] → SetActive(true) → [사용중]
[사용중] → SetActive(false) → [쉬는중]



OnEnable / OnDisable 둘 다 써서 초기화



풀 크기는 적당히
화면에 동시에 등장 가능한 최대값에 +20% 여유 두는 값이 이상적


poolCursor(포인터) 순환 
0~N 사이에서 반복되게 % 쓰기



강의에 안 나왔지만,
될 수 있으면 선입선출의 큐(Queue) 구조 사용하라 함



Hierarchy 수가 2000~3000 넘어가면 유니티 에디터가 느려짐



다른 게임에서의 풀링은 이렇 때 씀
총알 Bullet Pool
적 Enemy Pool
화면효과 Effect Pool

반응형
Posted by 이름이 익명
:


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


audio source 컴포넌트 는 
게임 메니저 오브젝트 에 넣기
이름은 BGM Player

 


오디오 관련 스크립트는
이번 게임에선 Game Manager 및 게임매니저 스크립트 에 할당함

(원래 커지면 오디오 매니저라고 따로 분리하는 게 좋긴 함)

 


bgm 은 원리가 간단함
loop 온 하고
    public AudioSource bgmPlayer;
할당하고
스타트 함수에         
bgmPlayer.Play(); 
넣어서 플레이 시킴

 

 


SFX Player 오디오 소스 하나만 
교체하며 쓰면 음원이 짤리는 문제가 생김

그래서 
동시에 여러 효과음 재생하게 하려면

ctrl d 눌러 여러 오브젝트로 만들어야 함

 

 

 

 

public AudioClip[] sfxClip;
배열 변수 연결 숫자번호 

컴포넌트 창에서 Element 3 
은 스크립트 속 배열 넘버 3 임

 

 

 

Sfx Player 배열 크기는 3임

이 3을 넘기면 오류 뜸

 

        int sfxCursor;
        sfxPlayer[sfxCursor].clip = ...
강의에선 이렇게 코드를 작성했고

sfxPlayer 와 sfxCursor는 연결됨


         sfxCursor ++
하면 아웃 오브 레인지 에러뜸
배열 밖으로 나가기 때문임

 

         sfxCursor ++

가 아니라
        sfxCursor = (sfxCursor + 1) % sfxPlayer.Length;
이렇게 바꿈

 


%는 나머지 연산자
3 % 3 = 0
4 % 3 = 1
5 % 3 = 2

값이 올라갈수록 0 1 2 0 1 2 0 1 2 이렇게 반복하게 됨
즉, 나머지 연산을 이용해 세 가지 값으로 제한한다는 뜻

 

 

 

    void OnCollisionEnter2D(Collision2D collision)
    {
        manager.SfxPlay(GameManager.Sfx.Attach);
    }

충돌 일어날 때 마다

어태치 사운드 파일이 재생됨

 

이렇게만 하면 너무 한꺼번에 사운드가 재생되어 산만해지는 부작용이 있음

그래서 코루틴을 넣어서

시간 간격을 두고 플레이 되게끔 제어할 필요가 있음

 

 

    public bool isAttach;
     void OnCollisionEnter2D(Collision2D collision)
    {
        StartCoroutine("AttachRoutine");
    }
    IEnumerator AttachRoutine()
    {
        if (isAttach == true) { yield break; }
        
        else
       {
        isAttach = true;
        manager.SfxPlay(GameManager.Sfx.Attach);
        yield return new WaitForSeconds(0.2f);
        isAttach = false;
        }
    }

 

이런식으로 바꿈

 

이즈어태치는 불 값이며, 콜리전과 연결함

 

만약 부딪친 상태(이즈 어태치)면 아무 기능 안함

만약 안 부딪친 상태에서 새로 부딪치면 음원을 재생하고 0.2초동안 기다림

 

 

 

 

반응형
Posted by 이름이 익명
:


골드메탈님 퍼즐 5

https://www.youtube.com/watch?v=p-gsoqgn8C8&list=PLO-mt5Iu5TeajtA5UQT7_2UjB7_dkGagU&index=5


Mathf.Pow(2, level);
뜻 거듭제곱
레벨이 0이면 1
레벨이 1이면 2
레벨이 2이면 4
레벨이 3이면 8 
레벨이 4이면 16


manager.score += Mathf.Pow(2, level);
근데 이럴 때 int 와 float 형 차이 오류 뜨면

manager.score += (int)Mathf.Pow(2, level);
이렇게 강제 int 형으로 형 변환


 



이 게임의 게임 오버 는 PlayGround 아래의 Line 에
동글이 넘칠 때 발동하게 할거임
박스 콜라이더 쓸 거임

 

 

 

Line 오브젝트의 Tag Finish 로 설정

 

 

    void OnTriggerStay2D(Collider2D collision)
    {
        if (collision.tag == "Finish")
        { 
        }

    }

콜리전 충돌이 지속할 때 발동,

그리고

태그가 Finish 일 때 발동

 

 

 

private float deadTime;
시간을 다룰 거라서 소수점 변수 하나 생성
deadTime += Time.deltaTime;
게임이 실행되는 시간을 누적시키는 변수가 되겠다
시간제한 , 지속시간 을 체크하는 데 씀



변수 새로 만들기 = 선언 = 초기화 = 추가 = 

Initialization 

Add 

Declaration 

Appending 

Assignment

 

 

 

 

게임매니저 에서 GameOver ( ) 함수를 만든후

동글 스크립트 에서 그 함수를 실행함

 

 

        
private SpriteRenderer spriteRenderer;
//스프라이트 담을 변수 추가

    void Awake()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
    }
    // 스프라이트 변수 컴포넌트 초기화
    
        
        if (deadTime > 2)
         {
                spriteRenderer.color = new Color(188f / 255f, 62f / 255f, 123f / 255f, 1f); 
         }
         // 내가 지정한 빨간색으로 컬러 덧씌우기

 

테스트 해봤는데
동글이 빨간색으로 안 변한다

 


Rigid body 2d 컴포넌트를 보게 되면
Sleeping mode 가 있다
물리 연산을 멈추고 쉬겠다 라는 뜻임
이거 잘못 설정하면 색깔 안 바뀜

 


프리팹 폴더의 동글의 리지드바디 2디 컴포에서 Sleeping mode  never sleep 으로 바꿔야 함

 

 

    void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.tag == "Finish")
        {
            deadTime = 0;
            spriteRenderer.color = Color.white;
        }
    }

콜리전이 바깥으로 탈출할 때

태그가 finish 인 것은

deadtime (5초 경과후 게임오버) 지속시간을 0초로 초기화

Color.white 는 기본 색상으로 변경한다는 뜻임

 

 

        if (isOver)
        {
            return;
        }
        if isOver == true)
        {
            return;
        }

이프 안에 불 값은 기본 true 를 뜻함

리턴은 함수 종료

 

 

 


FindObjectsOfType 은 이제 안씀
FindObjectsByType 를 써야함
오류 뜸


        Dongle[] dongles = GameObject.FindObjectsByType<Dongle>;
오류 뜸

        Dongle[] dongles = GameObject.FindObjectsByType<Dongle>(FindObjectsSortMode.None);
이렇게 바꿔야 할듯? 아마?




            dongles[index].Hide(Vector3.up * 100);
일부러 높은 값을 넣어서
저 위로 숨기는 꼼수


 

 


 yield return new WaitForSeconds(0.1f);

현재 코루틴의 실행을 멈추고,
0.1초의 실제 게임 시간(Real Game Time)이 경과할 때까지 기다렸다가, 
시간이 지나면 멈췄던 지점부터 다음 코드를 이어서 실행하세요.

 

 

 

            dongles[index].rigid.simulated = false;

동글 들의 리지드바디(변수) 시뮬을 끄겠다

 

 

 

   void NextDongle()
   {
       if (isOver)
       {
           return;
       }
       
     어쩌구 저쩌구
}

 

다음 동글 프리팹을 호출하는 함수 속


만약 isOver 끝이다 함수가 true 면?

return , 즉 조기 종료하고 끝내겠다

 

이러면 어쩌구 저쩌구 를 발동하지 않음

 

 

 

반응형
Posted by 이름이 익명
:

난 른 남자. 바텀. 게이. 그냥 마른 몸매. 턱수염 제모는 끝남. 자꾸 나에겐 발기부전 스위치 올 공주병 끼순이 소추 같이 남자답지도 여자답지도 않은 올 탑만 꼬이지.

 

 만약 내가 호르몬 대체 요법을 1년 해서 (hrt) 몸매가 여자다워지고 피부 하얘지고 가슴에 몽울이 생긴다면? 남자다운 바이탑이 나에게 대시 할 확률 몇 % 증가할 거로 예상하지?


예측할 수는 없습니다. 라는 말을 하지마. 전체적인 후기들을 모아서 숫자 %를 예측해.


중성적·여성스러운 외모를 좋아하는 바이탑 층에게는
👉 매력 상승 가능성 약 20~40% 정도 예상 가능.

+20%p

반응형
Posted by 이름이 익명
:

한국 몽골

카테고리 없음 2025. 11. 13. 09:39 |


한국인 입장에서 몽골


초록색 땅
시원할 거 같음


cu 이마트 있다고 하니까
살기도 좋을 거 같음



몽골 남자들 섹시함
멋짐
시력도 좋음



흑인 백인 일본인 중국인 경계하지만
몽골인은 다름

몽골인이 한국오면
생김새가 한국사람하고 똑같아서 좋음


몽골인은 성실하고 힘도 셈


몽골 여행 가자 하면
거절하는 사람이 없음


한국인인데도 몽골을 지지하고
중국을 싫어함
몽골 사람 아닌데도 몽골 독립을 원함






반응형
Posted by 이름이 익명
: