241201

lililllilillll·2024년 12월 1일

개발 일지

목록 보기
7/350

✅ 오늘 한 일


  • 모바일 출시 준비 (종료)
  • ProPixelizer 써보기
  • 백준 1문제 풀기
  • C# 교과서 읽기


📝 배운 것들


🏷️ Unity : Touch 구조체 및 관련 메서드

  • Input.touchCount는 현재 화면에 터치된 손가락의 개수를 반환합니다.
  • Input.GetTouch(index)는 해당 index에 해당하는 터치 정보를 반환합니다.
    • 예: Input.GetTouch(0)은 첫 번째 터치 정보를 가져오고, Input.GetTouch(1)은 두 번째 터치 정보를 가져옵니다.
  1. 첫 번째 손가락 (index 0):
    • Input.GetTouch(0)로 첫 번째 손가락의 위치와 상태를 확인할 수 있습니다.
  2. 두 번째 손가락 (index 1):
    • Input.GetTouch(1)로 두 번째 손가락의 정보를 확인할 수 있습니다.

터치 이벤트 정보

Touch 구조체는 각 터치 이벤트에 대한 자세한 정보를 제공합니다:

  • touch.position: 터치 지점의 현재 화면 좌표 (픽셀 단위).
  • touch.phase: 현재 터치 상태 (아래 참조).
  • touch.fingerId: 고유한 터치 ID. 손가락마다 고유 ID가 할당됩니다.

터치 상태 (TouchPhase)

터치의 상태를 나타내는 값입니다:
1. TouchPhase.Began: 터치가 막 시작됨.
2. TouchPhase.Moved: 터치가 이동 중.
3. TouchPhase.Stationary: 터치가 정지 상태.
4. TouchPhase.Ended: 터치가 끝났을 때.
5. TouchPhase.Canceled: 터치가 시스템에 의해 취소되었을 때.



🎮 Frog on Lotus


모바일 환경 대응

화면 방향 문제

가로 모드를 원했는데 가로로 짧아짐

Unity 에디터에서 화면 방향 설정

  1. Edit > Project Settings > Player로 이동.
  2. Resolution and Presentation 섹션에서:
    • Default Orientation을 Landscape Left로 설정.

Script로 고정 설정

게임이 실행될 때 화면 방향을 강제로 고정할 수 있습니다:

void Start()
{
    Screen.orientation = ScreenOrientation.Portrait;
}

자꾸 이상한 점에만 공격

터치하면 좌측 상단 이상한 점으로만 공격함

mousePos : (-8.28, 8.22, -10.00)
UnityEngine.Debug:Log (object)
FrogAttack:Update () (at Assets/05.Scripts/Frog/FrogAttack.cs:82)

찍어보니까 여기를 가리키고 있음.

mousePos = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue());

이거 모바일에선 이렇게 하면 안돼?

모바일 환경에서는 마우스 대신 터치 입력(Input.touch 또는 Touchscreen.current)을 사용해야 합니다.
Mouse.current는 연결된 마우스를 기준으로 좌표를 계산하기 때문에 모바일 환경에서 잘못된 값을 반환할 수 있습니다.

if (Input.touchCount > 0)
{
    Touch touch = Input.GetTouch(0);
    mousePos = Camera.main.ScreenToWorldPoint(touch.position);
}
else
{
    mousePos = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue());
}

gpt가 준 코드 수정해서 터치 대응

화면 비율이 이상함

프로젝트 종료

게임 문제점

  • 손가락이 화면을 가려서 파리가 가려짐 : 내려놓고 하면 나으니까 내려놓고 하라는 안내문 추가
  • 파리가 너무 작아서 시인성이 떨어짐 : 파리 크기 키우면 혐오감 느껴져서 콜라이더 크기를 키움
  • 손가락 속도보다 파리가 너무 빠름 : 속도 너프
  • 다시 할 동기부여가 생기지 않음 : 미니게임천국에서 코인 모아서 방 꾸미는 것처럼 게임을 한 것에 대한 보상이 있어야 함. 게임 본질에 안 기대고 기타 요소 추가하는거 안 좋아하는데 본말전도 수준까진 안 가는 가벼운 동기부여까진 괜찮을듯. 근데 생각해보니까 너무 기획과 아트가 많이 필요할 것 같아서 기각. 점수 공유같은 걸로 동기부여하는 선에서 끝내자. 난이도도 최대한 세련되게 다듬어야 할듯?
  • 잘해져도 똑같이 1분의 플레이 시간이 주어짐 : 몰입이 되려고 하면 바로 끝내버리는게 근본적 문제.
  • 실력이 늘어난다는 것에 대한 명확한 인지가 없음 : 의외로 점수는 슬쩍슬쩍 보면서 올라가고 있다는걸 인지할 수 있음. 근데 계속 똑같은 몹만 나타나니까 지루함. 최소한 5종류까지는 모아야 좋을 것 같음.

기획 고민

디펜스를 섞어볼까?

일정 숫자 이상으로 벌레들이 많아지면 게임 오버가 된다? 그럴거면 운빨존많겜을 하지 왜 이걸 함? 게임 규칙이야 당연히 다르지만...

돈 모아서 뭘 하지?

미니게임천국은 방을 꾸몄을 때 운동 기구 같은 걸로 애들 스탯이 오른다던가 하는 성장 요소까지 가미해서 구매시의 명확한 이득이 있었음. 근데 그냥 꾸미기 요소에 불과하다고 하면 난 살짝 아쉬울 것 같음. 도트 그래픽을 사용한 이상 귀엽다, 예쁘다 같은 걸로 어필하기도 힘듦.

돈 모아서 뭔가를 하는 건 좀 아닌 것 같음.

대작병에 빠지지 말자

첫 게임 만들어놓고 너무 과몰입하는 것 같기도 하다.
힘 빼고 만들어서 경험 삼아 해보는 선에서 그치자.

그냥 엎는게 나을듯

근데 자꾸 이거 고쳐야지, 저거 붙여야지 하는게
모바일에서의 플레이 경험이 생각보다 별로여서 그런 것 같음.

방금 PC판 다시 해봤는데, 모바일 포팅은 안하는게 맞는 것 같다.
PC에선 마우스로 클릭을 하면 명확한 클릭감에 대응되는 청각적 피드백이 오니까 재미가 있는데
모바일은 터치를 해도 내가 '이곳을 터치해서' 파리를 잡았다는 느낌이 안 들어서 맥아리가 없다고 추정됨.
화면이 쬐끄매서 내가 뭐 하고 있는건지 모르겠는 것도 한 몫 하는듯.



🎮 ProPixelizer 써보기


처음 구매할 때만 해도 이것만 사면 금방 그럴듯한 게임 하나 뚝딱할 수 있을 줄 알았는데 막상 쓰고 애셋들에 적용시켜보고 다니니까 영감도 안 떠오르고 애매한 느낌. 결국 2D든 3D든 자기가 애셋을 만들어낼 줄 알아야 상상력에 제약도 안 걸리고 좋을텐데 지금은 레고 블럭 자체가 안 주어지니 분위기만 떠올려봐야 거기서 '게임'으로 발전하기가 좀 힘든듯.

저번에도 말했지만 URP니 머테리얼이니 뭐가 어떻게 되는건질 알아야 이런 식으로 나오는걸 해결책을 바로바로 찾을텐데... 분명 끄기 전엔 동굴 벽 디테일 다 뭉개졌어도 색깔은 보였는데 껐다 키니까 또 이렇게 됐다.

내일부턴 강의를 하나 들은 후에 다시 간단한 게임 하나 더 만들어보자.



⚔️ 백준


30460 스위치

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)

def sum_three(sb,i):
    if(i+2 >= N):
        temp = 0
        for j in range(i,N):
            temp += sb[j]
        return temp
    else:
        return sb[i]+sb[i+1]+sb[i+2]

def left_num(idx,i):
    left = 0
    for j in range(0,i):
        left += score_board[idx+j]
    return left

def max_val(sb,idx):
    global N
    if (idx >= N): return 0

    val = 0
    val_to_add = -float('inf')    

    # i는 이번 인덱스에서 2배를 시킬 세계선의 기준
    for i in range(3):
        if(idx+i < N):
            if sum_three(sb,idx+i) > 0:
                val_to_add = max(val_to_add,max_val(sb,idx+i+3) + 2*sum_three(sb,idx+i) + left_num(idx,i))
                # print('세계선 후보 : ',val_to_add)
            else:
                val_to_add = max(val_to_add,max_val(sb,idx+i+3) + sum_three(sb,idx+i) + left_num(idx,i))
    
    val += val_to_add
    return val

N=int(input())
score_board=list(map(int,input().split()))
print(max_val(score_board,0))

N 넘어간거 체크하는 조건식 2개에 더해주는 숫자가 틀렸길래 그거 고쳐줬더니 예제는 다 통과했지만, 시간 초과 당함.

디버그를 찍어봤더니 내가 원하는 거랑 약간 다른 식으로 동작하고 있음. 계산 4번 하는 건 ok. 근데 왜 val_to_add가 다 동일하게 20이 나오지?

def sum_three(sb,i):
    if sum_three_dp[i] == False:
        temp = 0
        if(i+2 >= N):
            for j in range(i,N):
                temp += sb[j]
        else:
            temp = sb[i]+sb[i+1]+sb[i+2]
        sum_three_dp[i] = temp
        return temp
    else:
        return sum_three_dp[i]

일단 dp를 시도해보았으나 역시 시간 초과

https://velog.io/@nahowo/BOJ-30460-%EC%8A%A4%EC%9C%84%EC%B9%98Python

ㅋㅋㅋㅋㅋ... 짧네

각 초를 기준으로 자신이 3초전에 눌린 세계선과 안 눌린 세계선을 구분하여 최대값을 dp에 담는거

아니 1초 전이나 2초 전에 눌렸을 수도 있잖아??
-> 그 경우의 수는 3초 후의 내가 책임져준다.

아니 그럼 끝의 경우의 수들은? 2배 못하잖아?
-> 그래서 score에 0 2개 넣어놓는다.



📖 C# 교과서


20 C# 인터렉티브

Visual Studio > 보기 > 다른 창 > C# Interactive

#help : 명령어 도움말
#cls 또는 #clear : 화면 지우기
#r "dll 파일의 경로" : 외부 DLL 파일 참조

문자열과 숫자 등 리터럴은 Console.WriteLine() 생략하고 직접 출력 가능



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

0개의 댓글