2zreal 2024. 7. 22. 18:47

-물줄기 구현

물풍선 설치 3초 후 물줄기가 터지는 것을 구현해 보았다.

 

물줄기 각각의 프리팹을 생성한다.

물풍선이 터질 때 power에 맞게 물줄기의 길이를 조절한다.

private void CreateWaterStream()//상 하 좌 우로 물줄기 생성
{
    Instantiate(center, transform.position, Quaternion.identity);
    CreateStream(Vector3.right, right, rightE);
    CreateStream(Vector3.left, left, leftE);
    CreateStream(Vector3.down, down, downE);
    CreateStream(Vector3.up, up, upE);
}

private void CreateStream(Vector3 direction, GameObject streamPrefab, GameObject endPrefab)
{
    for (int i = 0; i <= power; i++)
    {
        Vector3 positionOffset = direction * 0.6666f * (i + 1);//현재 물줄기보다 한칸 앞을 탐색
        Vector3 targetPosition = transform.position + positionOffset;

        
        Collider2D hitCollider = Physics2D.OverlapPoint(targetPosition);// 해당 위치에 있는 게임 오브젝트를 찾음

        if (power == i || hitCollider != null)
        {
            if (i != 0)
            {
                Instantiate(endPrefab, transform.position + direction * 0.6666f * i, Quaternion.identity);
            }

            if ((hitCollider != null && hitCollider.CompareTag("Box")) && i != power)//한칸 앞에 물줄기가 있다면 물줄기 생성 중단;
            {
                Tile tile = hitCollider.gameObject.GetComponent<Tile>();
                tile.Bomb1();
                //Destroy(hitCollider.gameObject);
                break;
            }
        }
        else
        {
            if (i != 0)
            {
                Instantiate(streamPrefab, transform.position + direction * 0.6666f * i, Quaternion.identity);
            }
        }
    }
}

만약 물줄기에 Tile이 맞는다면 Tile을 제거한다.

 

public void Bomb1()
{
    GameObject BombMotion = Instantiate(bomb, transform.position, Quaternion.identity);
    Bomb BombScript = BombMotion.GetComponent<Bomb>();
    BombScript.getItemNumber(itemNumber);
    Destroy(gameObject);
}

타일은 타일에 숨은 아이템 번호를 가지고 있다.

private IEnumerator WaitForAnimation()
{
    yield return new WaitForSeconds(animator.GetCurrentAnimatorStateInfo(0).length - 0.1f);// 애니메이션 클립의 길이만큼 대기
    getItem();
    Destroy(gameObject);
}

public void getItemNumber(int number)
{
    itemNumber = number;
}

private void getItem()//이렇게 생성하지 말고 타일을 만들면서 한번에 같이 만들자.. 그게 맞다.
{
    if (itemNumber >= 1 && itemNumber <= 5)
    {
        Instantiate(item1, transform.position, Quaternion.identity);
    }
    else if (itemNumber >= 6 && itemNumber <= 10)
    {
        Instantiate(item2, transform.position, Quaternion.identity);
    }
}

파괴되는 애니메이션이 끝나면 아이템을 생성하고 파괴모션을 파괴한다.