250328

lililllilillll·2025년 3월 28일

개발 일지

목록 보기
124/350

✅ What I did today


  • Udemy Course : Unity Shader
  • Project BCA


🎞️ Udemy Course : Unity Shader


  1. ~ 29.

basic rim lighting

        void surf (Input IN, inout SurfaceOutput o) {
            half rim = 1 - saturate(dot(normalize(IN.viewDir), o.Normal));
            o.Emission = _RimColor.rgb * pow(rim,_RimPower);
        }

double if

        void surf (Input IN, inout SurfaceOutput o) {
            half rim = 1 - saturate(dot(normalize(IN.viewDir), o.Normal));
            o.Emission = rim > 0.5 ? float3(1,0,0) : rim > 0.3 ? float3(0,1,0): 0;
        }

frac() : only decimal part

        void surf (Input IN, inout SurfaceOutput o) {
            half rim = 1 - saturate(dot(normalize(IN.viewDir), o.Normal));
            o.Emission = frac(IN.worldPos.y * 10 * 0.5) > 0.4 ? float3(0,1,0) : float3(1,0,0);
        }


🎮 Project BCA


AI Random piece removing

구현할 것

  • 삭제할 기물이 정해지고, 레이저 소리 비슷한 경고음과 함께 해당 기물에 빨간색 emission이 생긴다. 죽으면 해당 턴에 아무 일도 안 일어남.
  • 삭제할 기물의 종류는 1번째는 폰, 가끔 나이트, 2번째는 룩, 비숍,나이트 중 하나 3번째는 룩, 비숍, 퀸 중 하나

로직 계획

  • phase 2에 진입할 때 StartGame()이 호출되면 ResetGame()도 호출된다.
  • ResetGame()에서 phase == 2라면 aiManager.ResetAIManager()를 호출한다.
  • ResetAIManager()는 ResetDeleteCond()를 호출하고, 이는 nextDeleteTurn, deleteCount를 초기화한 뒤 UpdateNextDeleteCond()를 호출한다.
  • UpdateNextDelete()는 deleteCount가 0이 아니라면
    • 재시작할 때 호출되어 1번째 타겟을 지정한다.
    • 삭제하려던 기물이 어떤 이유로든 죽었을 때 호출되어 다음 타겟을 지정한다.
  • AITurnState()의 EnterState()에서 SendPlayerMoveToStockfish()를 호출, 거기서 phase == 2라면 TryDelete() 호출.

게임 넘어가도 로봇팔 움직이는 문제

  • 현재 AITurnState()의 EnterState()는 삭제 로직과 FEN 전송이 이루어지는 SendPlayerMoveToStockfish() 이후에 게임이 종료됐는지 아닌지를 판단함.
  • 즉, AI가 졌다면 팔이 움직이지 않는 것이 자연스러움에도 불구하고, 팔이 움직여버릴 수 있음.
  • 기존 로직을 테스트해보니, 게임 종료를 판단하고 NextStage()가 호출되기 전에 AIMoveTo()가 호출되어 게임이 끝나고도 팔이 움직이고 있었음.
  • 기존에 SendPlayerMoveToStockfish()를 호출하더라도 바로 응답이 오지 않아도 괜찮았음. 즉, 순서를 뒤로 빼도 문제 없음.

MaterialPropertyBlock Emission 적용 안되는 문제

  • Material의 Emission을 바꾸면 적용 되는데 MaterialPropertyBlock을 거치면 적용 안됨
  • Custom Lit Shader를 만든 뒤 Emission의 Color를 바꾸면 적용되긴 하는데 관리하기 귀찮고 과하게 복잡
  • 그냥 emission 있는 material 변수 선언해놓고 필요할 때 바꿨다

기물의 emission 적용이 어색한 문제

  • 타겟이 되자마자 바로 변하는게 어색
    • 버퍼가 두 번 필요하다. AI가 턴을 시작할 때까지 기다리는 버퍼, 기물이 다 빛날때까지 팔의 움직임을 기다리는 버퍼.
    • (버퍼 1)
    • piece에 isTarget을 선언, 타겟으로 지정 시 true로 만든다.
    • DestoryPieceAt()할 때 isTarget이 true라면 GameManager에 findTargetFlag를 true로 만든다
    • AITurnState()의 EnterState()에서 게임 종료 판단 이후, 기물 이동 이전에 findTargetFlag가 true인지 확인하고
    • (버퍼 2)
    • PieceCommandManager에서 EnQueueSetNextTarget()을 호출한다.
    • EnQueueSetNextTarget().Execute()는 레이저 소리와 함께 기물의 emission을 차오르게 한다.
    • 이를 위해 vertex를 건드리는 custom shader를 사용하고, 스크립트를 이용해 emission이 차오르는 정도를 조절한다.
  • 삭제된 후 emission이 남아있는 것도 어색
    • DestroyPieceAt()할 때 isTarget이 true라면 스크립트에서 다시 emission 영역을 뺀다.


profile
너 정말 **핵심**을 찔렀어

0개의 댓글