250304

lililllilillll·2025년 3월 4일

개발 일지

목록 보기
100/350

✅ What I did today


  • Project BCA


🎮 Project BCA


CRT Monitor

Implement retro style

참고

셰이더 그래프로 재현

  • Multiply로 검은색 제외한 글자 부분 emission 효과 (Unlit으로 만들었어서 따로 넣어줘야 했음)
  • Checkerboard 노드로 scanline 구현

Typewriter effect

    public void SetTerminalText(string text)
    {
        if (typingCoroutine != null) StopCoroutine(typingCoroutine);

        terminalText.text = text;
        typingCoroutine = StartCoroutine(TypeText());
    }

    IEnumerator TypeText()
    {
        terminalText.ForceMeshUpdate();
        TMP_TextInfo textInfo = terminalText.textInfo;
        int totalCharacters = textInfo.characterCount;

        terminalText.maxVisibleCharacters = 0;

        for (int i = 0; i < totalCharacters; i++)
        {
            terminalText.maxVisibleCharacters = i + 1;
            yield return new WaitForSeconds(typingSpeed);
        }

        typingCoroutine = null;
    }

텍스트 마지막에 타이핑 커서 깜빡이는 효과 구현하고 싶긴 한데 급한거 아니니까 나중에

Sync with game progress

폰트 : https://fonts.google.com/specimen/IBM+Plex+Mono

Delete mode

    public void pressButton(ref bool deleteMode)
    {
        Debug.Log("Button Pressed");

        if (isAnimating) return; // 이미 애니메이션 중이면 실행 안 함
        isAnimating = true; // 애니메이션 시작

        deleteMode = !deleteMode;

        if (deleteMode)
            terminalText.SetTerminalText("Delete mode enabled");
        else
            terminalText.SetTerminalText(" ");

애니메이션 진행중인지 검증하는 로직과 deletemode를 바꾸는 로직이 따로 있어서 빠르게 여러 번 누르면 오류 발생
ref로 아예 버튼에서 deletemode를 관리하도록 함

Wrong stalemate declaration

이 상황 포함 다른 상황에서도 체크메이트가 아닌 스테일메이트가 선언됨

    /// <summary>
    /// 자신의 움직인 후 상대방이 체크되는지 확인하는 함수
    /// </summary>
    public void MoveCheckCheck(Piece pieceScript)
    {
        var kingPosition = pieceScript.isWhite ? blackKingPosition : whiteKingPosition;

        List<(int, int)> my_moves_to_enemy = new List<(int, int)>();
        for (int i = 1; i <= 8; i++)
        {
            for (int j = 1; j <= 8; j++)
            {
                Piece piece = board.GetPieceScriptAt(i, j);
                if (piece != null && piece.isWhite == pieceScript.isWhite)
                {
                    my_moves_to_enemy.AddRange(piece.PossibleMove(CheckFrom.OtherSide));
                }
            }
        }

        if (my_moves_to_enemy.Contains(kingPosition))
        {
            if (pieceScript.isWhite)
                isBlackKingChecked = true;
            else
                isWhiteKingChecked = true;
            print("Check!");
        }
        else
        {
            if (pieceScript.isWhite)
                isBlackKingChecked = false;
            else
                isWhiteKingChecked = false;
            print("Not Check!");
        }
    }

해당 기물의 경로만 점검하는게 아니라 자신의 모든 기물을 점검하는 것으로 변경하여 해결.

Stockfish Benchmark

gpt가 대답해준거라 환각 의심되긴 하지만 유용한 정보라 기록

Stockfish가 CPU를 얼마나 사용하는지 실험한 결과

(기본적으로 1스레드 사용 기준, 검색 속도는 초당 노드 수(NPS)로 측정)

탐색 깊이(Depth)CPU 사용량(1스레드)초당 노드 수 (NPS)실행 시간(평균)
105~10%100k~500k<0.1초
2020~30%1M~5M0.5초~2초
3050~80%10M~50M5초~20초
4090~100%100M+30초 이상

Depth & Time에 따른 목표 레이팅 예상

탐색 깊이 (Depth)예상 Elo 레이팅
Depth 5약 1200
Depth 10약 1600
Depth 15약 2000
Depth 20약 2300
Depth 25약 2600
Depth 30약 2900~3000
Depth 35+3200+

Depth 30 도달 시간 (CPU 성능 및 쓰레드 수에 따른 차이)

CPU 환경 (쓰레드 수)Depth 30 도달 시간
8코어 16스레드 (풀파워)10초
4코어 8스레드20초
2코어 4스레드40초
1코어 2스레드80초

Stockfish optimization

게임 내에서 Stockfish를 사용할 경우, CPU 사용량을 조절해야 렉을 방지할 수 있음.

✅ (1) 멀티스레드 개수 제한하기 (Threads 설정)

Stockfish는 기본적으로 가능한 모든 CPU 코어를 사용하려고 함,
하지만 게임이 실행 중이라면 특정 코어만 사용하도록 제한해야 함.

setoption name Threads value 2
  • 기본적으로 Stockfish는 가능한 모든 코어를 사용하지만,
  • "Threads" 값을 2 이하로 설정하면 CPU 사용량을 줄일 수 있음.

✅ (2) 탐색 깊이(Depth) 제한하기

Stockfish는 탐색 깊이가 높을수록 CPU를 많이 사용하므로, 게임 내에서는 적절한 제한을 두는 것이 중요함.

go depth 15
  • Depth 15~20: 체스 AI 수준이 높지만, CPU 부하가 크지 않음.
  • Depth 30 이상: 전문가 수준의 분석이 가능하지만, CPU 사용량이 급격히 증가함.
  • 게임 내에서는 Depth 15~20 정도로 제한하는 것이 적절함.

✅ (3) 시간 제한 설정하기

Stockfish는 기본적으로 무한 탐색(go infinite)을 수행할 수 있는데,
게임에서는 특정 시간까지만 연산하도록 제한하는 것이 좋음.

go movetime 500
  • movetime 500 → 500ms(0.5초) 동안만 연산 수행.
  • 이렇게 하면 CPU가 특정 시간 이상 사용되지 않도록 제한할 수 있음.

Minor modification to the room

책상 아래에 그림자 드리워지던거
바닥의 Mesh Renderer > Rendering Layer Mask를 변경하여 그림자를 없앴다.

문 : https://assetstore.unity.com/packages/3d/props/interior/free-wood-door-pack-280509

  • 문을 달려고 했는데 좌표 때문에 자꾸 어그러지고 마음대로 안됨
    • 프로 빌더를 사용하여 새로 방을 만들어봤는데, 수정이 말도 안되게 불편해서 폐기
      • 프로토타이핑 할 때나 유용할듯
      • 문으로 통로가 이어질 때 통로는 새로 폴리곤 만드는게 정신건강에 이롭다
      • Alt+L : 루프 선택, Alt+U : 루프 자르기
    • 그냥 그리드 스내핑 켜고 일반 3D 오브젝트로 만드는게 훨씬 빠르고 간편
      • 기존처럼 버텍스 스내핑만으로 대충 만들면 벽끼리 끼워맞추기 힘들다
profile
너 정말 **핵심**을 찔렀어

0개의 댓글