23.8.5~ project : Avoiding Meteor

BABY CAT·2023년 8월 5일
0

unity

목록 보기
4/5

기획

게임의 특징

  1. 슈팅게임과 피하기게임의 결합
    : enemy는 랜덤으로 위에서 아래로 대각선으로 무수히 내려온다 > 플레이어는 enemy를 피하면서 동시에 missile로 enemy를 죽인다 > enemy가 죽으면 많은 coin들이 랜덤방향으로 흩뿌려진다 유저는 enemy를 피하면서 coin을 먹어, 무기를 강화한다
  2. 스스로 난이도 조절(맵의 상단부에서 이동하며 버틸수록 어렵지만 스코어를 빠르게 올릴 수 있고 맵의 하단부에서 버티면 피하기 쉽지만 스코어가 적게 오른다)
    : 실력이 일정 이하거나 난이도가 일정 이상이 되는 순간 무기력하게 무너져 게임의 흥미를 잃게하는 기존 슈팅/피하기 게임의 단점을 해소하는 역할
  3. 피하는 컨트롤과 코인을 먹는 컨트롤이 모두 필요하다
    : 극한의 피지컬 경쟁의 재미
  4. 노클릭, 마우스move only로 게임의 단순함과 컨트롤의 편안함을 추구하면서도 마우스 속도에 따라 매우 빠른 속도로 이동이 가능하여 피지컬에 따른 큰 score차이를 낼 수 있도록 한다
  5. 보스 스폰이 없이 enemy들의 이동속도와 생성 개체 수를 점진적으로 늘려서 난이도를 조절
  6. 스테이지클리어가 아닌 타임어택과 스코어전 (글로벌 랭킹)

게임 모드 (맵에 따른)

  1. 무한지속맵 : 타임어택모드(오래버티기), coin을 많이 획득하고 coin으로 무기를 다양하게 변형시킨다 > 무기의 스킬트리 즉 '전략 및 게임이해도'가 중요
  2. 한정시간맵 : 최고 스코어를 겨루는 맵, 게임시간이 짧고 난이도 증가 속도가 빠른 것이 특징 > 극한의 '피지컬'을 겨루는 것이 목적
  3. 대결모드 (1~10인 오래버티기) : 플레이어의 일정 초당 추가 스코어에 따라 타플레이어의 enemy가 증가한다, coin은 모든 플레이어가 동등하게 일정하게 오른다(그렇지 않다면 스코어를 빨리 올리는 쪽이 코인을 얻을 기회가 상대적으로 적어지기 때문)

추가 기획 요소

에너미 밸런스
무기 스킬트리 밸런스
코인 밸런스
수익화

기획 수정

운석 피하기 게임
미사일 삭제

배속 clear경쟁
그리고
시작할 때 3가지스킬을 가지고 시작

플라즈마쉴드 - 맞을 시 일정시간동안 추가타를 맞지 않을 경우 쉴드 회복 (중수)
미니모드 - 몸체를 작게 만든다 (고수)
무적 - 일정시간동안 지속되는 무적 쿨타임
반중력장 - x미터 반경의 운석을 느리게한다
타임트래블링 - 맵상 50%이하y축에서 죽을 경우 과거 어느 시점으로라도 이동 가능 (초보,고난이도맵용) - 팀전의 경우 팀의 절반이상이 50%이하y축에 있을 때 사용 가능
레이더 - 맵 시야 확장 (고스코어가능)

캐시질

스킬레벨업
신스킬오픈
스킬슬롯오픈
게임판수 (하트)

협력전-랭

3명이 한맵 합산점수 3대3이 아님
한팀에 총3명
각자 하나의 스킬 선택 > 3개다 사용 가능

대전-랭

둘이서 한맵
점수 따로
상대 의 위치와 점수를 볼 수 있음

솔로-랭

기록경쟁

개발 과정

1. 준비

  1. 슈팅피하기 겜 애셋을 복붙
  2. 정상적으로 가동되는 것을 확인.

2. 맵상 Y좌표에 따른 점수 부여


가장 아래 있으면 +1 위에 있으면 +10 의 점수를 얻는다.
+4는 중간쯤 있으니까 4점을 얻은 것이고 46은 이렇게 해서 모은 총 점수.

//로케이션 점수판
      //////////////////////////////////////////////////////
private float score = 0f; 
private float scored = 0f; 
public float scoreMultiplier = 1f;
[SerializeField]
private TextMeshProUGUI LocationScorePanelRoutineTotalText;
[SerializeField]
private TextMeshProUGUI LocationScorePanelRoutinePlusText;

  void StartLocationScorePanelRoutine(){
        StartCoroutine("LocationScorePanelRoutine");
    }
  public void StopLocationScorePanelRoutine(){
        StopCoroutine("LocationScorePanelRoutine");
    }

        IEnumerator LocationScorePanelRoutine(){
            //1초대기 후 while true문
            yield return new WaitForSeconds(1f);

            while(true){
              //c#은 이렇게 해도 깊은복사
              scored = score ;
              score += transform.position.y * scoreMultiplier + 5.7f;
  Debug.Log(score);
  Debug.Log(scored);
  //점수판에출력 토탈점수
    LocationScorePanelRoutineTotalText.SetText( score.ToString("F0")   );
//점수판에출력 플러스점수
   LocationScorePanelRoutinePlusText.SetText(  " +" +(int.Parse(score.ToString("F0"))-int.Parse(scored.ToString("F0"))) );
                yield return new WaitForSeconds(1f);
            }
        }
//////////////////////////////////////////////////////

3. 기존 missile 슈팅과 coin점수판을 삭제


슈팅은 player.cs에서

//게임오버가 아니면 미사일쏘기
// if (GameManager.instance.isGameOver==false){
//     Shoot();
// }

coin점수판은 유니티에서 스코어패널을 체크해제

4. enemy 이동 패턴 다양화

    void Start()
    {
        Jump();
    }
// enemy 속도  
void Jump(){
        Rigidbody2D rigidBody = GetComponent<Rigidbody2D>();
        float randomJumpForce = Random.Range(-0.1f, -3f);
        //벡터2는 엑스 와이 값만 가진다
        Vector2 jumpVelocity = Vector2.up * randomJumpForce;
        jumpVelocity.x=Random.Range(-2f,2f);
        rigidBody.AddForce(jumpVelocity, ForceMode2D.Impulse);
    }

5. 플레이어 HP 만들기

//플레이어 충돌 처리
    private void OnTriggerEnter2D(Collider2D other) {
      //if(other.gameObject.tag=="enemy" || other.gameObject.tag=="boss" ){
        if(other.gameObject.tag=="enemy"  ){
        Debug.Log("-10 hp");
        hp-=10f;

        //플레이어 hp 0이하일 때 게임종료
if (hp <=0f){
 GameManager.instance.SetGameOver();
   Destroy(gameObject); //적이랑 충돌 > 플레이어 디스트로이
}

6. 플레이어 HP 초당 재생

    IEnumerator EnemyRoutine(){
          //1초대기 후 while true문
          yield return new WaitForSeconds(1f);

          while(true){
            scored= score ;
                 score += transform.position.y * scoreMultiplier + 5.7f;
                 
Debug.Log(score);
Debug.Log(scored);
//실수로점수판에출력
  text2.SetText( score.ToString("F0")   );
              

 text3.SetText(  " +" +(int.Parse(score.ToString("F0"))-int.Parse(scored.ToString("F0"))) );

 textHP.SetText( "hp : " + hp.ToString());

              //text2.SetText(Convert.ToInt32(score).ToString()+ ' +'+(transform.position.y * scoreMultiplier + 5.7f));
              // }
//플레이어체력 hp 초당 재생
if (hp<=99){
hp+=1;
}
              yield return new WaitForSeconds(1f);
          }

         
      }

7. 시간 지날수록 스폰인터벌도 감소

          if(spawnCount%2==0){
            
                   enemyIndex+=1;
                   //enemyIndex=Random.Range(0,enemies.Length); 
//에너미 속도 velocity
                   //2스폰넘어갈때마다 에너미 무브스피드 증가
                   moveSpeed+=0.1f;  

                   if(spawnInterval>=0.2f){
spawnInterval-=0.005f;
                   }  

0개의 댓글