[Unity2D] 새콤달콤 딸기농장 메인 오브젝트 개발(4) - 벌레 구현

SHG·2022년 4월 24일
0
post-thumbnail

벌레 구현 🎡

프리팹 및 콜라이더 설정

딸기의 성장을 방해하는 요소는 크게 2가지로 벌레, 잡초가 있다. 오늘은 2가지 중 벌레를 먼저 구현해보겠다! 기획자분과 상의 결과 벌레는 딸기 줄기에, 잡초는 밭에 추가하기로 결정했기 때문에 벌레 Prefab을 추가했다!

Bug 오브젝트는 터치를 인식할 Circle Collider와 Bug 스크립트, 벌레 생성, 제거에 필요한 애니메이션로 이루어져있다!

하지만 진행하다 문제가 있었으니... 그건 바로 기존 밭에서 터치를 인식하던 Collider와 내가 새로 생성한 벌레의 Collider가 겹친다는 것이었다..! Collider의 겹침은 부하를 유발할 수 있으니 상당한 문제였다. 아래는 기존 밭의 Box Collider이다.

따라서 내가 고안한 방법은 딸기가 심어질 때, 밭의 Collider를 끄고, 딸기가 전부 자랐을 때 다시 Collider를 켜는 방법이다..! 벌레가 딸기의 성장을 완전히 막는다고 가정했을 때 밭과 벌레의 Collider는 서로 충돌할 일이 없을 것이다..!
후에 잡초까지 구현을 완료한 뒤 Edit - Project Settings - Physics 2D에서 Collider의 충돌도 꺼줄 것이다.

보이는 대로 딸기가 심긴 밭의 Collider는 제거되었다!! 따라서 문제 없이 벌레의 클릭이 가능하다! 아래는 기존 PlantStrawBerry()에 추가한 코드이다.

coll.enabled = false; // 밭의 콜라이더를 비활성화 (밭과 충돌 방지)

Bug 스크립트 📃

Bug 스크립트에서는 벌레를 일정시간이 지나면 자동으로 생성하는 함수와 벌레가 터치됐을 때 죽는 함수로 구성되어 있다. 주요 함수들을 보자면

public void GenerateBug()
{      
    float prob = Random.Range(0, 100); // 벌레가 발생할 확률
    DataController.instance.gameData.berryFieldData[bugIdx].scale = Random.Range(1.2f, 1.5f);
    if (prob < DataController.instance.gameData.berryFieldData[bugIdx].bugProb) // 발생할 확률인지 체크
    {           
        this.gameObject.SetActive(true);            
    }
}

public void DieBug() // 벌레가 죽을 때 호출
{
    SetAnim("isDie", true);

    if(this.gameObject.activeSelf)
    {
        StartCoroutine(DisableBug(0.25f)); // 애니메이션이 끝난 후에(0.25초)
    }           
}
void SetAnim(string name, bool b)
{
    anim.SetBool(name, b);
}
IEnumerator DisableBug(float time)
{
    yield return new WaitForSeconds(time);

    this.gameObject.SetActive(false);
}

와 같이 구성되어 있다!
따라서 GameManager에서 구현한 Raycast를 이용해 벌레를 터치, 죽이는 함수를 마지막으로 작성하였다.

void Update()
{
  if (Input.GetMouseButton(0)) // 마우스 왼쪽 버튼으로
  {
      GameObject obj = ClickObj(); // 클릭당한 옵젝을 가져온다
      if (obj != null)
      {               
          if (obj.CompareTag("Farm")) // 밭이라면
          {
              ClickedFarm(obj);
          }
          else if (obj.CompareTag("Bug")) // 벌레 라면
          {
              ClickedBug(obj);
          }          
      }
  }
}

void ClickedBug(GameObject obj)
{
    Bug bug = obj.GetComponent<Bug>();
    bug.DieBug();
}
profile
기록에 익숙해지자...!

0개의 댓글