본문 바로가기
취미/게임 개발

[Unity] 게임 개발 - 클릭 이벤트 만들기

by krapoi 2021. 12. 9.
반응형

자 오랜만에 게임 글로 돌아왔다.

저기 로그라이크는 디자인 때문에 잠시 보류해두고, 디자인하고 있는 동안에 혼자서 간단히 클릭커 게임을 하나 만들어 보려 한다.

 

내가 이번에 만들어 볼 것은 스프라이트를 클릭했을 때 그 주변에 같은 스프라이트가 작게 나타나는 이벤트이다.

말로 해서 뭐하나 보여주겠다.

 

이런거 만들거임

이렇게 큰 원을 하나 누르면 그 원 주변의 랜덤 좌표로 작은 원들이 생성되는 기능을 만들어 볼 거다.

 

먼저 큰 원 스프라이트를 하나 만들어주자.

 

그다음 addComponent 해서 circleCollider2 D(꼭 CircleCollider가 아니어도 가능) 넣어주고 isTrigger를 체크해주자.

콜라이더를 저런 식으로 세팅한 다음 저기 아래에 있는 Touch 코드를 짜러 가 볼 거다.

참고로 Tag는 안 바꿔도 되긴 하는데 나는 다른 기능을 추가해야 해서 바꿔놓았다.(근데 웬만하면 바꾸는 거 추천)

Tag추가는 Tag 누른 뒤 AddTag에서 할 수 있다.

 

아 맞다 세팅을 하나 더 해야 한다.

 

방금 생성한 오브젝트 하위 오브젝트로 좌표 최대, 최솟값을 가지게 할 빈 오브젝트를 하나 만들어 주자.

그리고 그 하위 오브젝트에 Collider를 추가해 주자.

이제 콜라이더의 Radius를 정해주자. 이게 최댓값과 최솟값이 될 거다.

난 1.2 정도로 했다.

 

 

이제 스크립트를 보자

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Touch : MonoBehaviour
{
    public GameObject rangeOb; //빈 오브젝트(Position), 하위 오브젝트받기
    CircleCollider2D rangeCol; //빈 오브젝트(Position)의 CircleCollider2D 가져오기

    public GameObject circle; //소환될 작은 동그라미들

    private void Awake() //update를 안쓰기 때문에 Start가 안먹힘 == Awake쓰기
    {
        rangeCol = rangeOb.GetComponent<CircleCollider2D>(); // 빈오브젝트의 CircleCollider2D 받아오기
    }

    private void OnMouseDown() // 마우스로 클릭했을때 실행됨, 콜라이더 없으면 안됨
    {
        Vector2 originpo = rangeOb.transform.position; //지금 빈 오브젝트의 위치값 가져오기
        int pota = Random.Range(1, 10); //1부터 10까지 랜덤값
        Debug.Log("클릭된 오브젝트 : " + gameObject.name);
        float range_x = rangeCol.bounds.size.x; // 최대값 세팅, 콜라이더의 바운드값을 가져오기
        float range_y = rangeCol.bounds.size.y; // 위와 같음, 단 y값
        Destroy(gameObject); // 눌렸으니 오브젝트 파괴하기
        for(int i = 0; i < pota; i++) // 랜덤값 만큼 소환하기
        {
            range_x = Random.Range(range_x * -1, range_x); // x의 값이 랜덤으로 최솟값,최댓값 까지 가지기
            range_y = Random.Range(range_y * -1, range_y); // 위와같음, 단 y값

            Vector2 RandomVc = new Vector2(range_x, range_y); // 랜덤좌표 생성

            Vector2 spawnPotato = originpo + RandomVc; // 현재위치화 랜덤좌표를 더해서 스폰좌표 생성

            GameObject instant = Instantiate(circle, spawnPotato, Quaternion.identity); // 랜덤좌표에 circle 생성
        }
    }

    
}

생각보다 별거 없다.

주석이 다 달려있지만 추가적으로 설명하자면,

collider의 bound값으로 가져와서 최댓값을 먼저 가진다.

그 뒤 random값의 범위를 최댓값에 -1을 곱해 최솟값과, 최댓값으로 범위를 정한다.

 

이제 오브젝트에 넣어주면 된다.

나는 아까 전의  Potato의 오브젝트에 넣어 주었다.

그다음 RangeOb에는 하위 오브젝트인 Position을 넣어 주었고 Circle은 그냥 동그라미 스프라이트를 Potato보다 크기를 줄여 프리 펩으로 만든 뒤에 넣어주었다.

 

근데 이게 살짝 아쉬운 점이 뭐냐면 갑자기 나온다는 거다.

부드럽게 나오거나 일정 크기까지 커지면서 Circle이 생성되는 기능을 만들고 있긴 한데, 일단 해봐야 할 것 같다.

혹시라도 자연스럽게 나오는 방법을 알고 있다면 알려주길 바란다. 

반응형