유니티 퀘스트 달리기반 7번 행맨

string secretWord = "hangMan".ToUpper();
//C#에서는 string이 읽기 속성이기에 char[] 로 문자열을 관리해야된다.
//C#에서의 char[]과 string에 관련하여 TIL 작성하기
char[] guessWord = Enumerable.Repeat('_',secretWord.Length).ToArray(); // char[]을 '_'로 정답 글자수만큼 초기화하는 코드 
int attepts = secretWord.Length;
bool wordGuessed = false;

string copySecretWord = secretWord;

for (int i = 0; i < attepts; i++)
{
    //char[] -> string 변환 코드
    string str = string.Concat(guessWord);
    //'_'가 포함되어있으면 false , 포함되지 않으면 true
    wordGuessed = !str.Contains('_');

    //게임 클리어
    if (wordGuessed)
    {
        Console.WriteLine("");
        Console.WriteLine("축하합니다!! 단어 " + copySecretWord + " 를(을) 완성하셨습니다!! ");
        Console.WriteLine("도전 횟수 " + i + "회에 통과하셨습니다!");
        break;
    }

    //게임 안내
    Console.WriteLine("도전 횟수 : " + (i+1) + "/" + attepts);
    Console.WriteLine("[ " + str + " ]");
    Console.Write("추측할 단어를 입력해 주세요 : ");

    //글자 입력
    string input = Console.ReadLine();

    //글자 입력 체크 - 한개의 글자 체크 
    if(input.Length >= 2)
    {
        Console.WriteLine("");
        Console.WriteLine("두 글자 이상이 입력되었습니다. 다시 입력해 주십시오.");
        i--;
        continue;
    }
    //글자 입력 체크 - 글자 영문 체크
    else if ( !((input[0] >= 'A' && input[0] <= 'Z') || (input[0] >= 'a' && input[0] <= 'z')))
    {
        Console.WriteLine("");
        Console.WriteLine("영어가 아닙니다. 다시 입력해 주십시오.");
        i--;
        continue;
    }

    //글자 소문자 고정
    input = input.ToUpper();
    //입력된 글자가 어디의 자리인지 체크
    int result = secretWord.IndexOf(input);

    do
    {
        if (result == -1)//없는 경우
        {
            Console.WriteLine("");
            Console.WriteLine("해당 문자는 없습니다.");
            break;
        }
        else
        {
            guessWord[result] = char.Parse(input);
            char[] word = secretWord.ToCharArray(); //문자열을 수정 할 수 있게 char[] 로 변경

            word[result] = '_'; //맞춘 글자를 '_' 처리함
            secretWord  = string.Concat(word); //char[]를 문자열로 다시 수정함 

        }

        result = secretWord.IndexOf(input);
    }
    while (result != -1);

 
    
}

if (!wordGuessed)
{
    Console.WriteLine("");
    Console.WriteLine("실패하셨습니다!! 정답은 " + copySecretWord + " 입니다!! 다음기회에...");
}

 

5주차 숙제 게임개발 

Run & Jump - 프로토타입 설명

1.마우스를 누르면 캐릭터 머리 위에 파워 게이지가 표시됨

2.마우스를 놓으면 놓은 방향으로 캐릭터가 빙글빙글 돌아가며 발판들을 넘어감

3.이미 한번 착지한 발판은 점수 x , 발판을 처음 밟을때만 점수 증가

 

구현 해야될것

1.각종 플레이어의 플레이를 방해할 장애물 추가 필요(화면을 날라다니는 오브젝트,발판 위의 가시 등등)

2.날라오는 블럭들이 지금 완전 랜덤 범위라서, 규격화가 필요함 ( 블럭이 겹쳐서 나오면 캐릭터가 피할 곳이 없음

 

버그

1.자기 발 밑에 바닥이 있는 상태로 아래를 향해 발사하면 캐릭터 착지하지 못한 판정이 되서 조작이 불가함

2.재시작(Scene 재로드)를 하면 GameManager에 있는 오브젝트들이 Mssing되어버림

싱글 톤 상태에서 Don'tDestroty를 했는데 Text 파일들이 Missing 됨

 

*Collider2D의 한 면만 충돌판정을 받게 하고 싶을때

//Blcok Class

private void OnCollisionEnter2D(Collision2D collision)
 {
 	 //플레이어한테 점수 부여가 안되있고 , 콜리더가 Player 태그일때
     if (!isScore && collision.gameObject.CompareTag("Player"))
     {
     	 
         foreach (ContactPoint2D contact in collision.contacts)
         {
             if (contact.point.y > transform.position.y + 0.3f)
             {
                 GameManager.Instance.AddScore(score);
                 isScore = true;
             }
         }
     }
  
 }

 

  • ContactPoint2D: 충돌 지점에 대한 정보를 나타내는 구조체로, 충돌한 두 물체의 접점 좌표, 충돌 방향(normal), 충돌 지점의 상대 속도 등을 포함합니다.
  • collision.contacts: 충돌이 발생했을 때, 해당 충돌에 관련된 모든 접점을 포함하는 배열입니다. 이 배열은 충돌이 발생한 각 접점에 대해 ContactPoint2D 객체를 담고 있습니다.
  • 이 조건은 충돌 지점(Block의 윗면 = transform.positon.y +0.3f)의 y 좌표가 현재 객체(Player)y 위치보다 0.3 단위 이상 위에 있을 때만 참이 됩니다. 이 코드는 플레이어가 적을 위에서 밟았을 때 점수를 주는 식으로 사용할 수 있다.

 

+ Recent posts