Skip to content

11 11 대면 회의

sehyeon7 edited this page Nov 19, 2024 · 1 revision

게임 플레이 해보기 + 게임 디버깅용 플레이 방법 정리

e : 클리어 안 하고 자는

r : 클리어 하고 자는

t : gameover

→ test 용

Script 전체 구조 체계화

GameManager

  1. field
    1. Instance
    2. currentStage
    3. currentStageClear
      1. 현재 스테이지 클리어 여부
    4. clockController
    5. GameState
    6. gameState
    7. DEFAULT_SCENE
      1. 계속적으로 불러와지는 scene
    8. ENDING_SCENE
      1. 마지막 8 stage
  2. function
    1. Awake()
      1. DontDestroyOnLoad → 씬이 파괴되어도 안 없어지는
    2. Start()
      1. 시계 바늘 7:00로 초기화
    3. InitializeGame()
    4. SetStageClear()
      1. 스테이지 클리어 여부 관리
      2. 스테이지 클리어 조건 달성 시 호출
    5. Sleep()
      1. 플레이어가 Sleep 선택 시 호출
      2. 스테이지 클리어한 상태로 잠들기
        1. 시계 바늘 업데이트
        2. 7단계(8:45) 이후 클리어 시 게임 클리어
      3. 스테이지 클리어하지 못한 상태로 잠들기
        1. 이상현상 리스트 재생성 호출
        2. 스테이지 실패 시, 이상현상 리스트를 초기화, 재생성 해야 하므로
        3. AnomalyManager의 Stage Failure시 작동하는 함수 호출
        4. 시계 바늘 7:00로 초기화
      4. 클리어 상태 초기화
      5. 다음 스테이지에 대한 이상현상 확인 및 생성
      6. 현재 currentStage에 맞추어 이상현상을 생성해야 하므로
      7. AnomalyManager의 이상현상 Instantiate 용 함수를 호출
    6. LoadDefaultScene()
      1. 씬 초기화
    7. WakeUpPlayerAfterLoad()
    8. InstantiateAnomalyAfterLoad()
    9. GameClear()
      1. 엔딩신 불러오는 함수
    10. GetCurrentStage()
      1. 현재 스테이지 번호 반환
    11. IsStageClear()
      1. 현재 스테이지 클리어 여부 반환
    12. GetGameState()
    13. RestartGame()
      1. 추후 활용 가능한 UI 구성
    14. PauseGame()
      1. 추후 활용 가능한 UI 구성
    15. ResumeGame()
      1. 추후 활용 가능한 UI 구성
  3. 기능
    1. 스테이지 클리어 여부 관리
    2. 스테이지 클리어 여부 고려하여 Sleep 관리
    3. 시침 분침 조정 함수 호출
    4. 다음 스테이지에 대한 이상현상 확인 및 생성 → AnomalyManager의 이상현상 Instantiate 용 함수를 호출
  4. RestartGame의 필요성 논의 필요 → 보류하기
  5. 커서가 떠있는 상태에서 fadeout되는 버그 개선 필요
  6. 추가해야할 것 : GetCurrentStage 노트북에 반영

ScreenFader

  1. field
    1. mainCamera
    2. fadeMaterial
    3. currentAlpha
    4. fadeCoroutine
  2. function
    1. Awake()
    2. OnEnable()
    3. OnDisable()
    4. StartFade(float targetAlpha, float duration)
    5. FadeRoutine(float targetAlpha, float duration)
    6. OnPostRenderCallback(Camera cam)
    7. Update()
    8. OnDestroy()
  3. 기능
    1. 잠에 드는 애니메이션이 구현되어 있는 Script
    2. DontDestroyOnLoad로 올라가있음

AnomalyManager

  1. field
    1. Instance
    2. anomalyPrefabs
      1. Anomaly1Manager ~ Anomaly31Manager 프리팹 보관용 리스트
    3. anomalyList
      1. 이상현상 리스트
    4. AnomalyCount
    5. random
    6. checkSpecificAnomaly
      1. 디버깅용
    7. SpecificAnomalyNum
      1. 디버깅용
    8. currentAnomalyInstance
      1. 현재 활성화된 이상현상 인스턴스
  2. function
    1. Awake()
    2. GenerateAnomalyList()
      1. 이상현상 리스트 생성
      2. 바로 전 것과 같으면 다시 돌리게
    3. GenerateRandomAnomaly()
      1. 50% 확률로 0, 나머지 확률로 1~31의 이상현상을 생성
    4. CheckAndInstantiateAnomaly()
      1. 현재 스테이지에 맞는 이상현상을 로드
    5. ResetAnomaliesOnFailure()
      1. 스테이지 실패 시 이상현상 리스트 재 생성
  3. 기능
    1. 이상현상 리스트업
      1. 연속 X
      2. 중복은 가능
      3. 틀리고 스테이지1으로 돌아간 경우 초기화
    2. 이상현상이 있는 스테이지인지 아닌지
    3. 이상현상 매니저가 prefab을 들고 있다가 여기서 instantiate

InteractionController

  1. field
    1. interactionRange
    2. interactableLayer
    3. interactionCursor
      1. InteractonCursor에는 inspector 상에서 Cursor이미지를 넣어줘야함
    4. playerCamera
    5. currentInteractable
  2. function
    1. Start()
      1. 광선에 맞으면 커서가 활성화되는 원리
    2. Update()
      1. 화면 중앙에서 광선이 나옴.
    3. OnDrawGizmos()
      1. test를 위해 구현 Scene에서 확인 가능
      2. 광선을 맞지 않으면 빨간색 맞으면 초록색
  3. 기능
    1. Raycast 이용하여 상호작용 boundary 조정
    2. 커서 띄울지 말지 결정
    3. 방향을 감지
    4. 상호작용 키 클릭, 버튼 총괄 → 이상현상 매니저에게 클릭 플래그 전달 → 클리어 여부를 총괄 Gamemanager로 전달
    5. 상호작용 성공하고 플레이어가 자리로 돌아갔을 때 노트북과 상호작용 후 잠에 드는
    6. 자기자리 노트북 오브젝트에 태그를 걸어서 → 얘랑 상호작용하면 잠에 들게

Interactable

  1. field
    1. GetInteractionPrompt();
      1. 상호작용 프롬프트 텍스트 반환 (예: "E키를 눌러 책상 조사하기")
    2. OnInteract();
      1. 상호작용 시 실행될 메서드
    3. CanInteract();
      1. 현재 상호작용 가능한지 여부 반환
  2. 기능
    1. 상호작용 가능한 객체들이 구현할 인터페이스

InteractableObject - interactable 상속

  1. field
    1. promptMessage
    2. interactionRange
    3. canInteract
  2. function
    1. Start()
      1. 레이캐스트 감지를 위한 일반 콜라이더
    2. GetInteractionPrompt()
    3. OnInteract()
    4. CanInteract()
  3. 기능

ClockController

  1. field
    1. Instance
    2. hourHand
    3. minuteHand
  2. function
    1. Awake()
      1. 12시로 초기화되게 바꿔놓음
    2. SetTime(int stage)
      1. stage 1 at 7:00, stage 8 at 8:45
      2. minuteRoation → 6 degrees per minute
      3. hourRotation → 30 degrees per hour + 0.5 degrees per minute
  3. 기능
    1. 게임매니저한테 stage를 받아와서 시간 조정

PlayerController

  1. field
    1. walkSpeed
    2. runSpeed
    3. mouseSensitivity
    4. maxVerticalAngle
    5. minVerticalAngle
    6. walkBobSpeed
    7. walkBobAmount
    8. runBobSpeed
    9. runBobAmount
    10. cameraHeight
    11. footstepSound
    12. walkVolume
    13. runVolume
    14. walkPitch
    15. runPitch
    16. walkStepInterval
    17. runStepInterval
    18. sleepAnimationDuration
    19. wakeUpAnimationDuration
    20. sleepCameraAngle
    21. sleepCameraHeight
    22. playerCamera
    23. heldItem
    24. rb
    25. capsuleCollider
    26. audioSource
    27. screenFader
    28. verticalRotation
    29. currentSpeed
    30. stepTimer
    31. bobTimer
    32. originalCameraPos
    33. moveDirection
    34. isMoving
    35. isAnimating
  2. function
    1. Awake()
    2. Start()
    3. Update()
    4. FixedUpdate()
    5. SetupComponents()
    6. SetupPhysics()
    7. HandleInput()
    8. HandleMovement()
    9. HandleCamera()
    10. Sleep()
    11. SleepAnimation()
    12. WakeUpAnimation()
    13. HandleFootsteps()
    14. PlayFootstepSound()
    15. OnDisable()
    16. OnCollisionEnter(Collision collision)
    17. OnTriggerEnter(Collider other)
    18. SetHeldItem(FireExtinguisher item)
      1. 불이야! 이상현상에 필요한 함수
    19. IsHoldingItem()
      1. 현재 플레이어가 아이템을 들고 있는지 확인
  3. 기능
    1. Screenfader의 최적화 환경을 구현해놓음 (애니메이션)
    2. 자리에 앉아서 잠에드는 각도 조정으로 수정 예정
    3. 에디터 상에서 player에게 꼭 들어가는 것
      1. InteractionController
      2. Collider
      3. Rigidbody
      4. PlayerController

SpecificAnomalyManager

  1. AnomalyManager 스크립트 : 이상현상을 소환하는 역할

    1. field
      1. GameObject ;
    2. function
      1. Start()
        1. Spawn()
      2. Spawn()
        1. Spawns the headless schoolgirl prefab at the specified location
  2. Anomaly_ 스크립트 : 이상현상 상호작용을 담당

    1. field
      1. hasInteracted
        1. Ensures only one interaction occurs
      2. cameraTransform
      3. audioSource
    2. function
      1. Start()
        1. Find the main camera in the scene
      2. Update()
        1. Check the distance to the camera and play sound if within 5f
        2. Start playing audio if not already playing
        3. Stop playing audio if out of range
      3. GetInteractionPrompt()
        1. Returns the prompt text for interaction (e.g., displayed on cursor)
      4. CanInteract()
        1. Determines if interaction is currently possible
      5. OnInteract()
        1. Handles interaction with the headless schoolgirl
        2. Fades out over 2 seconds and then clears stage
      6. FadeOutAndClearStage(GameObject obj, float duration)
        1. Coroutine to gradually fade out, destroy the object, and set the stage clear
  3. Scene안의 AnomalyManager ()에는 'AnomalyManager' 스크립트 적용

  4. 이상현상 prefab에는 'Anomaly_' 스크립트 적용

개발 진행 현황

  1. 11/9 ~ 11/11 할당 작업
    1. 박동호
      1. InteractionController 개발 Done
      2. Anomaly4Manager - 노트북 여러개 (ID : 4) manager 구현
        1. 플레이어 룰북 노트북을 클릭하면 확대되게 수정되어야할듯
        2. 스테이지 넘어갈 때 잠들게 하는 상호작용 물체를 자기자리 의자로
        3. collider 설정까지 push하기로
      3. 자기자리로 가서 ‘의자’와 상호작용하고 잠에드는 코드로 ScreenFader 수정
      4. Anomaly26Manager - 불이야 manager 구현 Done
      5. 러시안룰렛 manger 구현
        1. 총 위치에 노트북을 두고 힌트
        2. 총 이용 안 하면 스테이지 reset되는
    2. 박상윤
      1. Anomaly8Manager - 고장난 마이크 (ID : 8) scene 구현
      2. Anomaly10Manager - 이상한 바닥 모양 (ID : 10) scene 구현 Done
    3. 서지희
      1. ClockController 수정 Done
      2. Anomaly15Manager - 에어컨 거미 (ID : 15) scene 구현
      3. Anomaly16Manager - 소개원실 벽 빨간 선 (ID : 16) scene 구현
    4. 신채환
      1. SleepController 개발
      2. 강의실 추가 모델링
        1. anomalyManager 내에서 구현하자
      3. 창문 Anomaly 추가 모델링
        1. Scene을 고치는 것보다 이상현상 AnomalyManager 스크립트 안에서 새로운 material을 instantiate하는 방법 → 바꿔치기
  2. 11/12 ~ 11/14 할당 작업
    1. 박동호
      1. Anomaly5Manager - 틈새녀 (ID : 5) scene 구현 (11/12 ~11/14)
        1. Driver : 박동호
        2. Navigator : 박상윤
      2. Anomaly7Manager - 러시안 룰렛 (ID : 7) scene 구현 (11/12 ~11/14)
        1. Driver : 박동호
        2. Navigator : 박상윤
    2. 박상윤
      1. Anomaly11Manager - 열린 강의실 문 (ID : 11) scene 구현 (11/12 ~11/14)
        1. Driver : 박상윤
        2. Navigator : 박동호
      2. Anomaly12Manager - 위치가 다른 조명 (ID : 12) scene 구현 (11/12 ~11/14)
        1. Driver : 박상윤
        2. Navigator : 박동호
    3. 서지희
      1. Anomaly17Manager - 마이크 전선 스파크 (ID : 17) scene 구현 (11/12 ~11/14)
        1. Driver : 서지희
        2. Navigator : 신채환
      2. Anomaly22Manager - 바닥 타일이 하나둘씩 없어짐 (ID : 22) scene 구현 (11/12 ~11/14)
        1. Driver : 서지희
        2. Navigator : 신채환
    4. 신채환
      1. Anomaly18Manager - 책상 3줄 늘어남 (ID : 18) scene 구현
        1. Driver : 신채환
        2. Navigator : 서지희
      2. Anomaly20Manager - 창문에 비친 플레이어 얼굴 변화 (ID : 20) scene 구현
        1. Driver : 신채환
        2. Navigator : 서지희

Warning 해결

image (2)

  1. make sure your faces all have 4 edges only
  2. in edit mode, press a to select anything, hover over the mesh tab, cleanup, delete vertices by distance (or something similar)
  3. https://www.reddit.com/r/Unity3D/comments/p51bwd/a_polygon_is_self_intersecting_and_has_been/
  4. I find the material and change its “Shader” to standard, then the issue resolved.
  5. This warning only exists to inform you that the imported mesh differs from the source mesh, which probably aims towards the modeler fixing the mesh more than anything
  6. https://discussions.unity.com/t/on-that-error-what-are-the-consequences-a-polygon-of-mesh-in-fbx-is-self-intersecting-and-has-been-discarded/241720/2
  7. 모델링이 겹치면 나는 warning → 작동에는 영향 안 끼침

화면 크기 결정

1920*1080을 기준으로 가는걸로 결정

Clone this wiki locally